手把手带你调参Yolo v5 (v5.0-v7.0)(一)

手把手带你调参Yolo v5 (v5.0-v7.0)(一)

如果感觉有帮助的话请点赞支持下
更新日志:2022/5/3修改了4.2.12一处图片标注错误
更新日志:2022/5/17对部分图片添加水印
更新日志:2022/8/27修改了文章标题,v6.2的detect文件中并没有添加新的参数
更新日志:2022/9/1对“agnostic-nms”进行了更加细致的解释
更新日志:2023/1/22对文章进行排版和细节补充

文章目录

  • 手把手带你调参Yolo v5 (v5.0-v7.0)(一)
  • 1. 代码获取方式
  • 2. 准备项目环境✨
  • 3. YOLOv5命令行预测方式介绍
  • 4. detect.py文件解读
    • 4.1 检测一下看看效果
    • 4.2 参数详解
      • 4.2.1 “weights”
      • 4.2.2 “source”
      • 4.2.3 “data”
      • 4.2.4 “imgsz, img, img-size”
      • 4.2.5 “conf-thres”
      • 4.2.6 “iou-thres”
        • 4.2.6.1 NMS介绍
        • 4.2.6.2 不同阈值例子
      • 4.2.7 “max-det”
      • 4.2.8 “device”
      • 4.2.9 “action=‘store_true’”说明
      • 4.2.10 “view-img”
      • 4.2.11 “save-txt”
      • 4.2.12 “save-conf”
      • 4.2.13 “save-crop”
      • 4.2.14 “nosave”
      • 4.2.15 “classes”
      • 4.2.16 “agnostic-nms”
      • 4.2.17 “augment”
      • 4.2.18 “visualize”
      • 4.2.19 “update”
      • 4.2.20 “project”
      • 4.2.21 “name”
      • 4.2.22 “exist-ok”
      • 4.2.23 “line-thickness”
      • 4.2.24 “hide-labels”
      • 4.2.25 “hide-conf”
      • 4.2.26 “half”
      • 4.2.27 “dnn”
    • 参考文献;
    • 小彩蛋:
    • 本人更多YOLOv5实战内容导航

1. 代码获取方式

项目地址:https://github.com/ultralytics/yolov5

进入仓库点击tags可以查看项目目前提供的版本。

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第1张图片手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第2张图片

目前已更新到v7.0版本,参数作用和先前版本相同。


2. 准备项目环境✨

在配置Conda环境后就可以进入项目了,可以通过作者提供的requirements.txt文件进行快速安装。

即在终端中键入如下指令:

pip install -r requirements.txt

requirements.txt文件里面有一些包被注释掉了,这些包是做一些额外的操作时候用的,不安装并不会影响训练和测试;但是有些工具是将.pt文件转换成.onnx时必须安装的;以后会介绍.pt怎么转换成.onnx,这些用的时候安装就可以。

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第3张图片


3. YOLOv5命令行预测方式介绍

这里介绍一下官方给提供的预测方式,我们平时都是在Pycharm中点击“运行”按钮去预测模型,其实还可以通过命令行的方式去预测,预测后的结果会自动保存到runs/detect/路径下;其实在这条指令后面还可以加上一些参数,具体怎么加后面会详细说明。

python detect.py --source 0  # webcam
                          img.jpg  # image
                          vid.mp4  # video
                          path/  # directory
                          path/*.jpg  # glob
                          'https://youtu.be/Zgi9g1ksQHc'  # YouTube
                          'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

这里说一下 path/*.jpg ,这个意思就是预测path文件夹下以.jpg结尾的文件。


4. detect.py文件解读

4.1 检测一下看看效果

我们可以直接运行detect.py文件试试效果,运行后系统会把检测结果保存在runs\detect\exp2路径下

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第4张图片

检测效果就是这样子的

这两张是项目自带的图片,我们也可以把自己想测试的图片或者视频放到这个路径下:

在这里插入图片描述


4.2 参数详解

打开detect.py直接看 217 217 217行

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第5张图片


4.2.1 “weights”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPsJpVRR-1650769594842)(YOLOv5_v6.1调参.assets/image-20220423212827047.png)]

这个就是指定网络权重的路径,默认是yolov5s.pt,官方提供了很多的版本,我们要更换的时候直接按照Model的名字更换就可以了(当然,使用自己的也是完全没问题的);例如yolov5m.pt,yolov5l.pt,他会自动的下载对应的权重,不需要我们去Github手动下载。(如果下载太慢或者失败只能去官网下载了,下载好了直接放到根目录下就可以)

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第6张图片

这里说一下defaultdefault是默认的参数,即使我们在运行时不指定具体参数,那么系统也会执行默认的值。


4.2.2 “source”

在这里插入图片描述
这个参数就是指定网络输入的路径,默认指定的是文件夹,也可以指定具体的文件或者扩展名等。

在这里插入图片描述


4.2.3 “data”

在这里插入图片描述
这个就是配置文件的一个路径,配置文件里面包含了下载路径和一些数据集基本信息,在训练时如果不自己指定数据集,系统会自己下载coco128数据集。

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第7张图片

数据集有三大功能: 训练、验证和测试
训练最好理解,是拟合模型的过程,模型会通过分析数据、调节内部参数从而得到最优的模型效果。
验证即验证模型效果,效果可以指导我们调整模型中的超参数(在开始训练之前设置参数,而不是通过训练得到参数),通常会使用少量未参与训练的数据对模型进行验证,在训练的间隙中进行。
测试的作用是检查模型是否具有泛化能力(泛化能力是指模型对训练集之外的数据集是否也有很好的拟合能力)。通常会在模型训练完毕之后,选用较多训练集以外的数据进行测试。


4.2.4 “imgsz, img, img-size”

在这里插入图片描述
这个意思就是模型在检测图片前会把图片resize640 × 640的尺寸,然后再喂进网络里,并不是说会把们最终得到的结果resize640 × 640大小。


4.2.5 “conf-thres”

在这里插入图片描述
这个就是置信度的阈值,置信度这个概念我在我的博文“YOLOv1详细解读”里面详细介绍了一下,感兴趣的小伙伴可以看一下,通俗一点来说就是网络对检测目标相信的程度,如果这里设置 “ 0 0 0” 的话,那么网络只要认为这他预测的这个目标有一点点的概率是正确的目标,他都会给框出来,我们可以通过这几幅图对比一下。

我这里把conf-thres参数依次设置成“ 0 0 0 ”、 “ 0.25 0.25 0.25 ”、“ 0.8 0.8 0.8 ”

conf-thres = 0 conf-thres = 0.25 conf-thres = 0.8
手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第8张图片 手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第9张图片 手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第10张图片

Q:这里参数到底设置成多少好呢?

A:我觉得还是根据自己的数据集情况自行调整。


4.2.6 “iou-thres”

在这里插入图片描述
这个参数就是调节IoU的阈值,这里简单介绍一下NMSIoU


4.2.6.1 NMS介绍

在执行目标检测任务时,算法可能对同一目标有多次检测。NMS 是一种让你确保算法只对每个对象得到一个检测框的方法。

在这里插入图片描述

在正式使用NMS之前,通常会有一个候选框预清理的工作(简单引入一个置信度阈值),如下图所示:

在这里插入图片描述

NMS 算法的大致过程:每轮选取置信度最大的 Bounding Box(简称 BBox) 接着关注所有剩下的 BBox 中与选取的 BBox 有着高重叠(IoU)的,它们将在这一轮被抑制。这一轮选取的 BBox 会被保留输出,且不会在下一轮出现。接着开始下一轮,重复上述过程:选取置信度最大 BBox ,抑制高 IoU BBox。(关于Bounding Box Regression的详细介绍,我强力推荐我的另一篇博文)

IoU可以理解预测框和真实框的交并比

在这里插入图片描述

NMS步骤:
第一步:对 BBox 按置信度排序,选取置信度最高的 BBox(所以一开始置信度最高的 BBox 一定会被留下来);
第二步:对剩下的 BBox 和已经选取的 BBox 计算 IOU,淘汰(抑制) IOU 大于设定阈值的 BBox(在图例中这些淘汰的 BBox 的置信度被设定为0);
第三步:重复上述两个步骤,直到所有的 BBox 都被处理完,这时候每一轮选取的 BBox 就是最后结果。

在这里插入图片描述

在上面这个例子中,NMS 只运行了两轮就选取出最终结果:第一轮选择了红色 BBox,淘汰了粉色 BBox;第二轮选择了黄色 BBox,淘汰了紫色 BBox 和青色 BBox。注意到这里设定的 IoU 阈值是 0.5 0.5 0.5,假设将阈值提高为 0.7 0.7 0.7,结果又是如何?

在这里插入图片描述

可以看到,NMS 用了更多轮次来确定最终结果,并且最终结果保留了更多的 BBox,但结果并不是我们想要的。因此,在使用 NMS 时,IoU 阈值的确定是比较重要的,但一开始我们可以选定 default 值(论文使用的值)进行尝试。


4.2.6.2 不同阈值例子

如果看不懂的话就直接通过例子来理解一下:

这里我iou-thres分别取 “ 0 0 0”,“ 0.45 0.45 0.45”,“ 0.9 0.9 0.9”,“ 1 1 1”

iou-thres = 0 iou-thres = 0.45 iou-thres = 0.9 iou-thres = 1

4.2.7 “max-det”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRbAz88K-1650769594846)(YOLOv5_v6.1调参.assets/image-20220423223544340.png)]

这个就是最大检测数量,默认是最多检测 1000 1000 1000 个目标:

我这里把max-det分别设置成 “ 0 0 0”, “ 1 1 1” ,“ 5 5 5”,“ 1000 1000 1000”,大家感受一下

max-det 取值 效果
max-det = 0 手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第11张图片
max-det = 1 手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第12张图片
max-det = 5 手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第13张图片
max-det = 1000

4.2.8 “device”

在这里插入图片描述
这个参数就是选择GPU用的,如果不指定的话,会自动检测。
在进行CPU推理时要将这个参数设置为cpu


4.2.9 “action=‘store_true’”说明

在这里插入图片描述

这个类型的参数和之前的有很大区别,大家可以把他理解成一个“开关”,当我们运行程序的时候如果指定了带有action='store_true'类型的参数,那么就相当于启动这个参数所对应的功能,反之则不。我会拿下面的举个例子。


4.2.10 “view-img”

在这里插入图片描述

这个参数意思就是检测的时候是否实时的把检测结果显示出来,即我如果在终端中输入以下指令 :

python detect.py --view-img

那么意思就是我在检测的时候系统要把我检测的结果实时的显示出来,假如我文件夹有 5 5 5 张图片,如果指定了这个参数的话,那么模型每检测出一张就会显示出一张,直到所有图片检测完成。如果我不指定这个参数,那么模型就不会一张一张的显示出来。

【有时间加个动图】


4.2.11 “save-txt”

在这里插入图片描述

这个参数的意思就是是否把检测结果保存成一个.txt的格式,我们来看一下指定了这个参数的效果:

终端键入:

python detect.py --save-txt

可以看到输出结果多了一个labels文件夹

在这里插入图片描述

打开这个文件夹我们就可以看到两个.txt文件

在这里插入图片描述

这两个.txt文件里面保存了一些类别信息和边框的位置信息

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第14张图片


4.2.12 “save-conf”

在这里插入图片描述

这个参数的意思就是是否以.txt的格式保存目标的置信度

如果单独指定这个命令是没有效果的;

python detect.py  --save-conf #不报错,但没效果

必须和--save-txt配合使用,即:

 python detect.py --save-txt --save-conf

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第15张图片

如果指定了这个参数就可以发现,同样是保存txt格式的文件,这次多了红色框里面的置信度值。原来每行只有 5 5 5 个数字,现在有 6 6 6 个了。


4.2.13 “save-crop”

在这里插入图片描述

这个参数的意思就是是否把模型检测的物体裁剪下来,如果开启了这个参数会在crops文件夹下看到几个以类别命名的文件夹,里面保存的都是裁剪下来的图片。

在这里插入图片描述

这几张就是person和handbag文件夹下的图片

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第16张图片 在这里插入图片描述 在这里插入图片描述 手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第17张图片

4.2.14 “nosave”

在这里插入图片描述

开启这个参数就是不保存预测的结果,但是还会生成exp文件夹,只不过是一个空的exp

在这里插入图片描述

我觉得这个参数应该是和“--view-img”配合使用的


4.2.15 “classes”

在这里插入图片描述

在这里插入图片描述

这里又出现了一个新的参数,这个的意思就是我们可以给变量指定多个赋值,也就是说我们可以把 “ 0 0 0” 赋值给“classes”,也可以把“ 0 0 0”,“ 2 2 2”,“ 4 4 4”,“ 6 6 6” 都赋值给 “classes”

接下来说classes参数,这里看一下coco128.yaml的配置文件就明白了,比如说我这里给classes指定 “ 0 0 0”,那么意思就是只检测人这个类别。

在这里插入图片描述

例:键入如下指令:

python detect.py --classes 0

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第18张图片


4.2.16 “agnostic-nms”

在这里插入图片描述

agnostic-nms是跨类别nms,比如待检测图像中有一个长得很像排球的足球,pt文件的分类中有足球和排球两种,那在识别时这个足球可能会被同时框上2个框:一个是足球,一个是排球。开启agnostic-nms后,那只会框出一个框
(这里感谢知乎Ken Miller的补充)

通过一个例子对比一下:

启用后:

然而我并没有感受到区别


4.2.17 “augment”

在这里插入图片描述

这个参数也是一种增强的方式

启用前:

启用后:

这个还是有很明显的区别的


4.2.18 “visualize”

在这里插入图片描述

这个参数的意思就是是否把特征图可视化出来,如果开启了这和参数可以看到exp文件夹下又多了一些文件,这里.npy格式的文件就是保存的模型文件,可以使用numpy读写,.png就是图片文件啦。

在这里插入图片描述

下面来看一下保存下来的特征图:

stage0:

stage3:

stage6:

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第19张图片

stage23:

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第20张图片


4.2.19 “update”

在这里插入图片描述
如果指定这个参数,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息。


4.2.20 “project”

在这里插入图片描述

这个就是我们预测结果保存的路径。

在这里插入图片描述


4.2.21 “name”

在这里插入图片描述

这个就是预测结果保存的文件夹名字

在这里插入图片描述


4.2.22 “exist-ok”

在这里插入图片描述

这个参数的意思就是每次预测模型的结果是否保存在原来的文件夹,如果指定了这个参数的话,那么本次预测的结果还是保存在上一次保存的文件夹里;如果不指定就是每次预测结果保存一个新的文件夹下。


4.2.23 “line-thickness”

在这里插入图片描述

这个参数就是调节预测框线条粗细的,因为有的时候目标重叠太多会产生遮挡;

终端键入:

python detect.py --line-thickness 10

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第21张图片


4.2.24 “hide-labels”

在这里插入图片描述

这个参数就是隐藏标签的

终端键入:

python detect.py --hide-labels     

手把手带你调参Yolo v5 (v5.0-v7.0)(一)_第22张图片


4.2.25 “hide-conf”

在这里插入图片描述

这个参数就是隐藏标签的置信度用的

终端键入:

python detect.py --hide-conf


4.2.26 “half”

在这里插入图片描述

这个参数的意思就是是否使用FP16半精度推理,简单介绍一下低精度技术:

低精度技术 (high speed reduced precision)。在training阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32以上。在inference的时候,精度要求没有那么高,一般F16(半精度)就可以,甚至可以用INT8(8位整型),精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在嵌入式模型里面。


4.2.27 “dnn”

在这里插入图片描述

这个参数的意思就是是否使用 OpenCV DNN 进行 ONNX 推理

DNNDeep Neural Networks

这个我并没有用过,感兴趣的小伙伴可以去opencv文档看一下 。


参考文献;

非极大值抑制算法


小彩蛋:

Pycharm通过点击“运行”按钮生成exp文件夹的速度要比在终端里键入指令生成exp文件夹的速度快


本人更多YOLOv5实战内容导航

  1. 手把手带你调参Yolo v5 (v6.2)(推理)强烈推荐

  2. 手把手带你调参Yolo v5 (v6.2)(训练)

  3. 手把手带你调参Yolo v5 (v6.2)(验证)

  4. 如何快速使用自己的数据集训练Yolov5模型

  5. 手把手带你Yolov5 (v6.2)添加注意力机制(一)(并附上30多种顶会Attention原理图)强烈推荐新增8种

  6. 手把手带你Yolov5 (v6.2)添加注意力机制(二)(在C3模块中加入注意力机制)

  7. Yolov5如何更换激活函数?

  8. Yolov5如何更换BiFPN?

  9. Yolov5 (v6.2)数据增强方式解析

  10. Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)

  11. Yolov5如何更换EIOU / alpha IOU / SIoU?

  12. Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》

  13. YOLOv5应用轻量级通用上采样算子CARAFE

  14. 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC

  15. 用于低分辨率图像和小物体的模块SPD-Conv

  16. GSConv+Slim-neck 减轻模型的复杂度同时提升精度

  17. 头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器

  18. Stand-Alone Self-Attention | 搭建纯注意力FPN+PAN结构

  19. YOLOv5模型剪枝实战

  20. YOLOv5知识蒸馏实战

  21. YOLOv7知识蒸馏实战

  22. 改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块


有问题欢迎大家指正,如果感觉有帮助的话请点赞支持下

你可能感兴趣的:(#,目标检测篇,计算机视觉,人工智能,目标检测,目标跟踪,视觉检测)