
yolov5
如何运行yolov5
来到data目录
路径是你数据集的路径,记得改!!
进入models,小模型我用yolov5s,将5s复制一份,改掉名字
将train.py里面的路径改改,拉到第四百多行代码,函数名。。。叫下面图的有
1 |
|
1 |
|
运行的话,将detect.py改改
1 |
|
1 |
|
1 |
|
yolov5没什么好说的,暂时没那能力去修改人家的卷积(不知道修改完后是好是坏),顶多就只能改改参数(人称炼丹)
下面是一些yolov5参数的注释
train.py
detect.py
yolov5的一些小问题:
解决方法:参考博客
iou:预测框与真实框的差距
map:精度x召回率的平均值
NMS(非极大值抑制):获取iou大于一定比例的,按置信度进行排序,取其中最大的
batch normalization(BN):它是一种在神经网络的每一层中对输入进行归一化的方法
Yolov5网络结构图
安装好netron工具,就可以可视化的打开Yolov5的网络结构。
将四种模型pt文件的转换成对应的onnx文件后,即可使用netron工具查看。
(1)输入端:Mosaic数据增强:随机缩放、随机裁剪、随机排布的方式进行拼接
自适应锚框计算:针对不同的数据集,会有初始设定长宽的锚框,网络在初始锚框的基
础上输出预测框,进而和真实框进行比对,计算两者差
距,再反向更新,迭代网络参数。
控制的代码即train.py中上面一行代码,设置成False,每次训练时,不会自动计算。
自适应图片缩放:因此在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对 原始图像自适应的添加最少的黑边。黑边减少,计算量也减少,检测 速度提升
计算缩放比例,长/416,宽/416,选择小的缩放系数
(2)Backbone:Focus结构:切片操作,比如右图的切片示意图,4 * 4 * 3的图像切片后变成2*2 *12的特征图
CSP结构:
(3)Neck:FPN+PAN结构
(4)Prediction:GIOU_Loss
IOU_Loss:主要考虑检测框和目标框重叠面积。
GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。
yolov8
模型推理过程
(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
(2) 维度变换
YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。
将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。
(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。
特征图可视化
MMYOLO 中提供了一套完善的特征图可视化工具,可以帮助用户可视化特征的分布情况。
以 YOLOv8-s 模型为例,第一步需要下载官方权重,然后将该权重通过https://github.com/open-mmlab/mmyolo/blob/dev/tools/model_converters/yolov8_to_mmyolo.py 脚本将去转换到 MMYOLO 中,注意必须要将脚本置于官方仓库下才能正确运行,假设得到的权重名字为 mmyolov8s.pth
假设想可视化 backbone 输出的 3 个特征图效果,则只需要
1 |
|
需要特别注意,为了确保特征图和图片叠加显示能对齐效果,需要先将原先的 test_pipeline 替换为如下:
1 |
|
看出不同输出特征图层主要负责预测不同尺度的物体。
我们也可以可视化 Neck 层的 3 个输出层特征图:
1 |
|