如果感觉有帮助的话请点赞支持下
更新日志:2022/5/3修改了4.2.12一处图片标注错误
更新日志:2022/5/17对部分图片添加水印
更新日志:2022/8/27修改了文章标题,v6.2的detect文件中并没有添加新的参数
更新日志:2022/9/1对“agnostic-nms”进行了更加细致的解释
更新日志:2023/1/22对文章进行排版和细节补充
项目地址:https://github.com/ultralytics/yolov5
进入仓库点击tags
可以查看项目目前提供的版本。
目前已更新到v7.0
版本,参数作用和先前版本相同。
在配置Conda环境后就可以进入项目了,可以通过作者提供的requirements.txt
文件进行快速安装。
即在终端中键入如下指令:
pip install -r requirements.txt
requirements.txt
文件里面有一些包被注释掉了,这些包是做一些额外的操作时候用的,不安装并不会影响训练和测试;但是有些工具是将.pt
文件转换成.onnx
时必须安装的;以后会介绍.pt
怎么转换成.onnx
,这些用的时候安装就可以。
这里介绍一下官方给提供的预测方式,我们平时都是在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
结尾的文件。
我们可以直接运行detect.py
文件试试效果,运行后系统会把检测结果保存在runs\detect\exp2
路径下
检测效果就是这样子的
这两张是项目自带的图片,我们也可以把自己想测试的图片或者视频放到这个路径下:
打开detect.py
直接看 217 217 217行
这个就是指定网络权重的路径,默认是yolov5s.pt
,官方提供了很多的版本,我们要更换的时候直接按照Model的名字更换就可以了(当然,使用自己的也是完全没问题的);例如yolov5m.pt
,yolov5l.pt
,他会自动的下载对应的权重,不需要我们去Github手动下载。(如果下载太慢或者失败只能去官网下载了,下载好了直接放到根目录下就可以)
这里说一下default
, default
是默认的参数,即使我们在运行时不指定具体参数,那么系统也会执行默认的值。
这个参数就是指定网络输入的路径,默认指定的是文件夹,也可以指定具体的文件或者扩展名等。
这个就是配置文件的一个路径,配置文件里面包含了下载路径和一些数据集基本信息,在训练时如果不自己指定数据集,系统会自己下载coco128
数据集。
数据集有三大功能: 训练、验证和测试
训练最好理解,是拟合模型的过程,模型会通过分析数据、调节内部参数从而得到最优的模型效果。
验证即验证模型效果,效果可以指导我们调整模型中的超参数(在开始训练之前设置参数,而不是通过训练得到参数),通常会使用少量未参与训练的数据对模型进行验证,在训练的间隙中进行。
测试的作用是检查模型是否具有泛化能力(泛化能力是指模型对训练集之外的数据集是否也有很好的拟合能力)。通常会在模型训练完毕之后,选用较多训练集以外的数据进行测试。
这个意思就是模型在检测图片前会把图片resize
成640 × 640
的尺寸,然后再喂进网络里,并不是说会把们最终得到的结果resize
成640 × 640
大小。
这个就是置信度的阈值,置信度这个概念我在我的博文“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 |
---|---|---|
Q:这里参数到底设置成多少好呢?
A:我觉得还是根据自己的数据集情况自行调整。
这个参数就是调节IoU
的阈值,这里简单介绍一下NMS
和IoU
在执行目标检测任务时,算法可能对同一目标有多次检测。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 值(论文使用的值)进行尝试。
如果看不懂的话就直接通过例子来理解一下:
这里我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 |
---|---|---|---|
这个就是最大检测数量,默认是最多检测 1000 1000 1000 个目标:
我这里把max-det
分别设置成 “ 0 0 0”, “ 1 1 1” ,“ 5 5 5”,“ 1000 1000 1000”,大家感受一下
max-det 取值 | 效果 |
---|---|
max-det = 0 | |
max-det = 1 | |
max-det = 5 | |
max-det = 1000 |
这个参数就是选择GPU用的,如果不指定的话,会自动检测。
在进行CPU推理时要将这个参数设置为cpu
。
这个类型的参数和之前的有很大区别,大家可以把他理解成一个“开关”,当我们运行程序的时候如果指定了带有action='store_true'
类型的参数,那么就相当于启动这个参数所对应的功能,反之则不。我会拿下面的举个例子。
这个参数意思就是检测的时候是否实时的把检测结果显示出来,即我如果在终端中输入以下指令 :
python detect.py --view-img
那么意思就是我在检测的时候系统要把我检测的结果实时的显示出来,假如我文件夹有 5 5 5 张图片,如果指定了这个参数的话,那么模型每检测出一张就会显示出一张,直到所有图片检测完成。如果我不指定这个参数,那么模型就不会一张一张的显示出来。
【有时间加个动图】
这个参数的意思就是是否把检测结果保存成一个.txt
的格式,我们来看一下指定了这个参数的效果:
终端键入:
python detect.py --save-txt
可以看到输出结果多了一个labels
文件夹
打开这个文件夹我们就可以看到两个.txt
文件
这两个.txt
文件里面保存了一些类别信息和边框的位置信息
这个参数的意思就是是否以.txt
的格式保存目标的置信度
如果单独指定这个命令是没有效果的;
python detect.py --save-conf #不报错,但没效果
必须和--save-txt
配合使用,即:
python detect.py --save-txt --save-conf
如果指定了这个参数就可以发现,同样是保存txt
格式的文件,这次多了红色框里面的置信度值。原来每行只有 5 5 5 个数字,现在有 6 6 6 个了。
这个参数的意思就是是否把模型检测的物体裁剪下来,如果开启了这个参数会在crops
文件夹下看到几个以类别命名的文件夹,里面保存的都是裁剪下来的图片。
这几张就是person和handbag文件夹下的图片
开启这个参数就是不保存预测的结果,但是还会生成exp
文件夹,只不过是一个空的exp
我觉得这个参数应该是和“--view-img”
配合使用的
这里又出现了一个新的参数,这个的意思就是我们可以给变量指定多个赋值,也就是说我们可以把 “ 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
agnostic-nms是跨类别nms,比如待检测图像中有一个长得很像排球的足球,pt文件的分类中有足球和排球两种,那在识别时这个足球可能会被同时框上2个框:一个是足球,一个是排球。开启agnostic-nms后,那只会框出一个框
(这里感谢知乎Ken Miller的补充)
通过一个例子对比一下:
启用后:
然而我并没有感受到区别
这个参数也是一种增强的方式
启用前:
启用后:
这个还是有很明显的区别的
这个参数的意思就是是否把特征图可视化出来,如果开启了这和参数可以看到exp
文件夹下又多了一些文件,这里.npy
格式的文件就是保存的模型文件,可以使用numpy
读写,.png
就是图片文件啦。
下面来看一下保存下来的特征图:
stage0:
stage3:
stage6:
stage23:
如果指定这个参数,则对所有模型进行strip_optimizer
操作,去除pt
文件中的优化器等信息。
这个就是我们预测结果保存的路径。
这个就是预测结果保存的文件夹名字
这个参数的意思就是每次预测模型的结果是否保存在原来的文件夹,如果指定了这个参数的话,那么本次预测的结果还是保存在上一次保存的文件夹里;如果不指定就是每次预测结果保存一个新的文件夹下。
这个参数就是调节预测框线条粗细的,因为有的时候目标重叠太多会产生遮挡;
终端键入:
python detect.py --line-thickness 10
这个参数就是隐藏标签的
终端键入:
python detect.py --hide-labels
这个参数就是隐藏标签的置信度用的
终端键入:
python detect.py --hide-conf
这个参数的意思就是是否使用FP16
半精度推理,简单介绍一下低精度技术:
低精度技术 (high speed reduced precision)。在training阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32
以上。在inference的时候,精度要求没有那么高,一般F16
(半精度)就可以,甚至可以用INT8
(8位整型),精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在嵌入式模型里面。
这个参数的意思就是是否使用 OpenCV DNN
进行 ONNX
推理
DNN
即 Deep Neural Networks
这个我并没有用过,感兴趣的小伙伴可以去opencv文档看一下 。
非极大值抑制算法
Pycharm通过点击“运行”按钮生成exp文件夹的速度要比在终端里键入指令生成exp文件夹的速度快
手把手带你调参Yolo v5 (v6.2)(推理)强烈推荐
手把手带你调参Yolo v5 (v6.2)(训练)
手把手带你调参Yolo v5 (v6.2)(验证)
如何快速使用自己的数据集训练Yolov5模型
手把手带你Yolov5 (v6.2)添加注意力机制(一)(并附上30多种顶会Attention原理图)强烈推荐新增8种
手把手带你Yolov5 (v6.2)添加注意力机制(二)(在C3模块中加入注意力机制)
Yolov5如何更换激活函数?
Yolov5如何更换BiFPN?
Yolov5 (v6.2)数据增强方式解析
Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)
Yolov5如何更换EIOU / alpha IOU / SIoU?
Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》
YOLOv5应用轻量级通用上采样算子CARAFE
空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC
用于低分辨率图像和小物体的模块SPD-Conv
GSConv+Slim-neck 减轻模型的复杂度同时提升精度
头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器
Stand-Alone Self-Attention | 搭建纯注意力FPN+PAN结构
YOLOv5模型剪枝实战
YOLOv5知识蒸馏实战
YOLOv7知识蒸馏实战
改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块
有问题欢迎大家指正,如果感觉有帮助的话请点赞支持下