跑通 yolov5-7.0 项目之训练自己的数据集

yolov5

  • 一、yolov5 源码下载
  • 二、配置环境,跑通项目
  • 三、训练自己的数据集
    • 1、获取验证码数据
    • 2、标注图片,准备数据集
    • 3、开始训练自己的数据集
      • 1、train.py 训练数据集
      • 2、val.py 验证测试你的模型
      • 3、detect.py 正式用你的模型
  • 四、遇到的报错、踩坑
      • 1、import git 错误
      • 2、no detections
      • 3、Pillow 版本过高引起的报错

一、yolov5 源码下载

仓库地址:yolov5-v7.0

二、配置环境,跑通项目

我的环境:python — 3.9,cpu训练,新建的一个python虚拟环境。
博主用的电脑配置不高,又想在本地跑,就用的 cpu 训练的(训练的时候有点慢,但还是可以接受)。
在这里插入图片描述
代码拉倒本地打开后,整体结构如下:
在这里插入图片描述
安装 requirements.txt 依赖:切到 yolov5-7.0 路径下:
要先修改一下 Pillow>=7.1.2 ,把他改为:Pillow==9.5 为什么要改?点我看看就知道
在这里插入图片描述

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

下载好环境后,直接去运行:train.py 先跑一哈。我是 cpu 训练,那就要改一下 train.py 的配置,跑官方的数据,就改一个 cpu 训练那里后,右键运行就是。
在这里插入图片描述
成功的话,会提示画出框的图片在哪里的,可以看这个,跑通的结果

三、训练自己的数据集

1、获取验证码数据

验证码数据源
我是分的 图片 和 网站返回的数据各一个文件夹。
在这里插入图片描述

2、标注图片,准备数据集

中文版本的:Labelimg-中文编译版
链接:https://pan.baidu.com/s/1u0JcJKR5IhYuSWlPQ_qDTg
提取码:895i
先熟悉了解我们需要用到的几个东西:
在这里插入图片描述

快捷键
a:上一张
d:下一张
w: 画框
ctr+s:保存标注
鼠标控制框框的范围

注意:先要在 yolov5-7.0 同级别下创建一个 MyData_1 文件夹(可自定义),但里面的 imageslabels文件夹的名称最好不要改 (改了可能会报错)。先就创建这两个文件夹哈,其他的后面会介绍的。
这里的 images 是放我们上面下载的图片数据,labels 是放我们用 Labelimg 标注完成生成的东西。
如图:
在这里插入图片描述
标注的类,我们直接写一个 1 就 ok。
在这里插入图片描述
最后:准备的100张,标了 45 张就没搞了在这里插入图片描述

在这里插入图片描述
好,数据集搞好了。准备开训

3、开始训练自己的数据集

1、train.py 训练数据集

进入 train.py 文件,查看 parse_opt 方法修改配置:

def parse_opt(known=False):
    """
        opt模型主要参数解析:
        --weights:初始化的权重文件的路径地址
        --cfg:模型yaml文件的路径地址
        --data:数据yaml文件的路径地址
        --hyp:超参数文件路径地址
        --epochs:训练轮次
        --batch-size:喂入批次文件的多少
        --img-size:输入图片尺寸
        --rect:是否采用矩形训练,默认False
        --resume:接着打断训练上次的结果接着训练
        --nosave:不保存模型,默认False
        --notest:不进行test,默认False
        --noautoanchor:不自动调整anchor,默认False
        --evolve:是否进行超参数进化,默认False
        --bucket:谷歌云盘bucket,一般不会用到
        --cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
        --image-weights:使用加权图像选择进行训练
        --device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
        --multi-scale:是否进行多尺度训练,默认False
        --single-cls:数据集是否只有一个类别,默认False
        --adam:是否使用adam优化器
        --sync-bn:是否使用跨卡同步BN,在DDP模式使用
        --local_rank:DDP参数,请勿修改
        --workers:最大工作核心数
        --project:训练模型的保存位置
        --name:模型保存的目录名称
        --exist-ok:模型目录是否存在,不存在就创建
    """
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='dataset.yaml path')  # 我修改的 修改的是里面的内容
    parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=100, help='total training epochs')  # 我修改的 训练多少次
    parser.add_argument('--batch-size', type=int, default=2, help='total batch size for all GPUs, -1 for autobatch')  # 我修改的 改为 2 一次喂多少数据
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--noval', action='store_true', help='only validate final epoch')
    parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
    parser.add_argument('--noplots', action='store_true', help='save no plot files')
    parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache', type=str, nargs='?', const='ram', help='image --cache ram/disk')
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
    parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')  # 我修改的  改为 cpu 训练
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
    parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
    parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
    parser.add_argument('--name', default='exp', help='save to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--quad', action='store_true', help='quad dataloader')
    parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
    parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
    parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
    parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
    parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
    parser.add_argument('--seed', type=int, default=0, help='Global training seed')
    parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

    # Logger arguments
    parser.add_argument('--entity', default=None, help='Entity')
    parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='Upload data, "val" option')
    parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval')
    parser.add_argument('--artifact_alias', type=str, default='latest', help='Version of dataset artifact to use')

    return parser.parse_known_args()[0] if known else parser.parse_args()

train.py 中我修改的配置

  • –weights:初始权重,直接用 官方的 yolov5s.pt
  • –data:这里我们直接找到位置,进去改里面的东西就好 (把原来的全删啦)
    这里的 vals 是放你要验证的数据:这里面要包括 图片和 对应图片的标注数据(我是直接去 images里面找的 5 张图片 和 他们对应的标注数据)后面val.py 会用到的,这里先说明一下。如图:
    在这里插入图片描述
    路径代码对应如下:

path: ../MyData_1
train: images  #  train 是训练的数据集路径
val: vals  # val是验证的数据集路径

test:

# Classes
nc: 1  # 有多少类
names: [1]  # 所有的类名

在这里插入图片描述
弄好后,直接开跑,在 train.py 里面,右键运行:没报错的话,等它停止就OK。(我 45 张图片,100轮,训了快 2 个小时。)在这里插入图片描述

在这里插入图片描述
好好好,训完了就好啊,去看看给我指出的位置下有些啥子东西嘛。
这样的图看不太懂:
在这里插入图片描述
没得事,后面就会慢慢懂的,我们现在就看这些图片就OK:
1、train_batch0.jpg 这是程序训练时画的框。在这里插入图片描述2、val_batch2_labels.jpg 这张图是 我们 人工画的框框图。在这里插入图片描述
3、val_batch2_pred.jpg 这是程序模型预测识别画出来的框框图。
在这里插入图片描述
看嘛,上面的 0.3 0.4 的框框就是错的,这个 0.3 这些小数点可以理解为:程序模型画的框我们人工画的框相似度。后面可以选择 相似度 > 0.8 (或其他值)来保障识别的准确度。
初看,没得啥子问题,再看还是感觉没啥子问题… 嘿,yolov5 给了程序帮你看:val.py 是专门来验证测试你的模型的。yolov5 之前的版本叫 test.py,后面更新给改名了。在这里插入图片描述

2、val.py 验证测试你的模型

测试的话是要测试图片其标注的数据的哈,就是哪个 vals 文件夹,为了方便就直接从你训练的数据集拿一些就行的。看看我的:(都要对应好哈)
在这里插入图片描述
验证一下,找到 val.py 这里就 改 2 个参数,那个 weights 找到你训练完产生的模型哈,best.pt 是最佳的模型,last.pt是最好一轮的模型。
在这里插入图片描述
要验证的数据集 我们在 coco128.yamlval 指定了的哈在这里插入图片描述
改好配置后,直接在 val.py 右键润,结果:
在这里插入图片描述
虽然只验证了 5 张,但还是能说明,训练的模型还是不错滴。( 0.8 那个框框是错的哈,还是要加大数据集的训练才更准),总的来看还是很可以的,起码文字没有少标出来。在这里插入图片描述

3、detect.py 正式用你的模型

detect:查明,察觉;测出,检测,识别的意思。
直接拿一些没有出现在你训练数据集的图片,来试试。还是在之前获取训练图片的那个网站中找。
建一个文件夹:no_have。 我找了一张图片,看看训练好的模型聪不聪明,能不能画出文字的框框。
在这里插入图片描述
结果:
在这里插入图片描述
好好好, 图片上是啥子字我都不知道,结果它都给我框出来了。 very very good 不错 !!!

四、遇到的报错、踩坑

1、import git 错误

在这里插入图片描述
网上说加上,就能行,

import os
os.environ["GIT_PYTHON_REFRESH"] = "quiet"

但我还是报错,这里让我搞了好久
在这里插入图片描述
电脑的 git 环境也没问题,它就是错。我在另一台电脑上也是报错,那你我是直接把它报错的地方文件的代码 注释了就没问题了。(目前没发现问题)。现在的电脑我胡乱的加一些 git 环境变量再重启,它就好了在这里插入图片描述

2、no detections

运行 detect.py 时 不出框框,并提示 no detections :没有检测的东西
开始是我觉得数据集训练的少了(2张图片),然后才加到 45 张图片的。结果还是报错,后来去一个一个的看参数:

parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')  # 我修改的

我加了个:default=1, 把它改成:default=0, 或者 不要 default 这个参数指定就能出框(但我的类就是1啊,我改成 0 又有框,还没搞懂,再看看,后面来修改)

3、Pillow 版本过高引起的报错

参考:参考链接
降低 Pillow 版本就好
先卸载它:

pip uninstall Pillow

再指定低版本安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  Pillow==9.5

好的,到这里就先结束了,下一篇就记录一下爬虫程序怎么对接训练好的模型。~ bye ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AD导出BOM表 导出PDF

1.Simple BOM: 这种模式下&#xff0c;最好在pcb界面&#xff0c;这样的导出的文件名字是工程名字&#xff0c;要是在原理图界面导出&#xff0c;会以原理图的名字命名表格。 直接在菜单栏 报告->Simple BOM 即可导出物料清单&#xff0c;默认导出 comment pattern qu…

springboot 原理分析之自动配置

一、Condition Condition 是在 Spring 4.0 增加的条件判断功能&#xff0c;通过这个可以功能可以实现选择性的创建 Bean 操作。比如说&#xff0c;只有满足某一个条件才能创建这个 Bean&#xff0c;否则就不创建。 SpringBoot 是如何知道要创建哪个 Bean 的&#xff1f;比如 Sp…

[C++] opencv - copyTo函数介绍和使用案例

copyTo函数介绍 copyTo函数是OpenCV库中的一个成员函数&#xff0c;用于将一个Mat对象的内容复制到另一个Mat对象中。 函数原型&#xff1a; void cv::Mat::copyTo(OutputArray m) const;void cv::Mat::copyTo(OutputArray m, InputArray mask) const; 参数说明&#xff1a;…

动手学深度学习6 自动求导

自动求导 1. 自动求导2. 自动求导实现1. 示例 y 2 X T X y2X^TX y2XTX 关于列向量x求导。2. 非标量变量的反向传播3. 分离计算4. Python控制流的梯度计算 QA 视频&#xff1a; https://www.bilibili.com/video/BV1KA411N7Px/?spm_id_fromautoNext&vd_sourceeb04c9a33e87…

STL中的stack、queue以及deque

目录 一、关于deque容器&#xff08;双端队列&#xff09; 1、deque的底层实现 2、deque的缺点 3、关于stack与squeue默认使用deque容器 二、stack简介 1、stack的成员函数&#xff08;接口&#xff09; 2、stack的模拟实现 三、queue简介 1、queue的成员函数&#xff08…

js:锚点滚动到页面对应区域

锚点跳转到对应页面的区域使用 scrollIntoView // anchor即你要跳转到的元素 anchor.scrollIntoView({behavior: "smooth", block: "center", inline: "nearest" });1、behavior&#xff1a;定义滚动行为。它可以设置为 “auto” 或 “smoo…

老师布置作业的技巧有哪些

布置作业可不只是简单地给学生分配任务&#xff0c;而是需要运用一些技巧&#xff0c;以达到更好的教学效果。那么&#xff0c;老师应该如何布置作业呢&#xff1f; 一、作业要有针对性 布置作业时&#xff0c;老师应该根据学生的实际情况和课程要求&#xff0c;有针对性地设…

小程序商城在易货模式中的可行性

一、引言 随着科技的快速发展和互联网的普及&#xff0c;电子商务已经深入人们的生活。小程序商城作为电子商务的一种形式&#xff0c;凭借其便捷性、高效性和广泛覆盖的优势&#xff0c;成为商业领域的新宠。本文将探讨使用小程序商城实现易货模式的可行性。 二、小程序商城的…

Grind75第9天 | 733.图像渲染、542.01矩阵、1235.规划兼职工作

733.图像渲染 题目链接&#xff1a;https://leetcode.com/problems/flood-fill 解法&#xff1a; 可以用深度优先搜索和广度优先搜索。 深度优先搜索。每次搜索到一个方格时&#xff0c;如果其与初始位置的方格颜色相同&#xff0c;就将该方格的染色&#xff0c;然后继续对…

鸿蒙NEXT来了,操作系统的寒武纪时代

鸿蒙来了&#xff0c;加上Android、iOS&#xff0c;企业又要投入人力物力财力&#xff0c;多支持一个技术阵营的一种技术平台。从IT角度看&#xff0c;是更多的责任&#xff1a;新技能培训、新员工招聘、新小组成立&#xff0c;也是新增的代码、新的bug、新的测试任务&#xff…

智能车培训——硬件篇:电源转换的硬件设计

培训课件及资料 链接&#xff1a;https://pan.baidu.com/s/1IikVfZ04Wl9UmEuizfP12A?pwd89gs 提取码&#xff1a;89gs 一.BUCK降压电路的设计 1.什么是BUCK降压&#xff1f;&#xff08;原理&#xff09; &#xff08;1&#xff09;导通回路与续流回路 电流的环路是电源通…

【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机

AAA配置步骤为&#xff1a; 1.开启telent远程登陆服务 2.创建用户&#xff0c;设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址&#xff0c;用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …

react umi/max 页签(react-activation)

思路&#xff1a;通过react-activation实现页面缓存&#xff0c;通过umi-plugin-keep-alive将react-activation注入umi框架&#xff0c;封装页签组件最后通过路由的wrappers属性引入页面。 浏览本博客之前先看一下我的博客实现的功能是否满足需求&#xff0c;实现功能&#xf…

C++I/O流——(4)格式化输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

一文极速了解【自注意力机制】

当下如火如荼的大模型&#xff0c;其中的关键技术就是注意力机制&#xff08;Attention&#xff09;&#xff0c;于2015年提出。2017年的“Attention is all you need”一文提出了Transformer模型&#xff0c;去掉RNN&#xff0c;只保留注意力&#xff0c;性能吊打所有机器翻译…

用Airtest快速实现手机文件读写与删除功能

1. 前言 前几天有同学留言&#xff0c;能不能安排“读写手机文件”的示例。我们今天就来实现这个小功能。 当然&#xff0c;熟悉adb的同学&#xff0c;看到这个需求&#xff0c;肯定很开心&#xff0c;不就是一个 adb push 和 adb pull 嘛&#xff0c;非常简单呀。 确实如此&…

Python 利用pandas对数据进行特定排序

背景 小编最近在处理hive表存储大小时&#xff0c;需要对每个表的大小进行排序&#xff0c;因通过 hadoop fs -du -s -h /path/table 命令获取的数据表大小&#xff0c;其结果是展示为人能直观理解的大小&#xff0c;例如 1.1T、1.9G、49.6M 等&#xff0c;如果想对这些表根据…

如何安装配置VisualSVN服务并实现公网访问本地服务【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现&#xff1a; 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗&#xff0c;所以在距离较远时&#xff0c;海豚只能使用回声定位方法来判断鱼群的整体位置&#xf…

网页版短信系统功能简介|短信平台开发搭建源码

网页版短信系统功能简介|短信平台开发搭建源码 随着互联网的发展&#xff0c;科技的进步和人们对通讯方式的需求不断增加&#xff0c;短信成为了人们日常生活中必不可少的沟通工具之一。而网页版短信系统的出现&#xff0c;为人们提供了更加便捷和灵活的短信发送和接收方式。 网…