/* 你的 HTML 代码将放在这里 */
L
O
A
D
I
N
G
紅葉
yolov5

yolov5


        

如何运行yolov5

来到data目录

路径是你数据集的路径,记得改!!

进入models,小模型我用yolov5s,将5s复制一份,改掉名字

4

将train.py里面的路径改改,拉到第四百多行代码,函数名。。。叫下面图的有

1
'--cfg' 是上面models里面xx.yaml的路径
1
'--data' 是data里面xx.yaml的路径

运行的话,将detect.py改改

1
'--weights' 后面ROOT /之后的路径改成你训练完的模型,一般在runs/train/exp(max最大数是最后训练完成的)
1
'--source' 将要识别的图片或视频的路径
1
'--conf-thres' 置信度最好改高一些,太低会乱标

yolov5没什么好说的,暂时没那能力去修改人家的卷积(不知道修改完后是好是坏),顶多就只能改改参数(人称炼丹)

下面是一些yolov5参数的注释

train.py

detect.py

yolov5的一些小问题:

解决方法:参考博客

iou:预测框与真实框的差距

map:精度x召回率的平均值

NMS(非极大值抑制):获取iou大于一定比例的,按置信度进行排序,取其中最大的

batch normalization(BN):它是一种在神经网络的每一层中对输入进行归一化的方法

Yolov5网络结构图

安装好netron工具,就可以可视化的打开Yolov5的网络结构。

netron下载安装流程

将四种模型pt文件的转换成对应的onnx文件后,即可使用netron工具查看。

(1)输入端:Mosaic数据增强:随机缩放随机裁剪随机排布的方式进行拼接

​ 自适应锚框计算:针对不同的数据集,会有初始设定长宽的锚框,网络在初始锚框的基

​ 础上输出预测框,进而和真实框进行比对,计算两者差

​ 距,再反向更新,迭代网络参数

6

​ 控制的代码即train.py中上面一行代码,设置成False,每次训练时,不会自动计算。

​ 自适应图片缩放:因此在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对 原始图像自适应的添加最少的黑边。黑边减少,计算量也减少,检测 速度提升

​ 计算缩放比例,长/416,宽/416,选择小的缩放系数

(2)Backbone:Focus结构:切片操作,比如右图的切片示意图,4 * 4 * 3的图像切片后变成2*2 *12的特征图

7

​ 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
2
cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8x

需要特别注意,为了确保特征图和图片叠加显示能对齐效果,需要先将原先的 test_pipeline 替换为如下:

1
2
3
4
5
6
7
8
9
10
11
test_pipeline = [
dict(
type='LoadImageFromFile',
file_client_args=_base_.file_client_args),
dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 这里将 LetterResize 修改成 mmdet.Resize
dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
dict(
type='mmdet.PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor'))
]

7

看出不同输出特征图层主要负责预测不同尺度的物体

我们也可以可视化 Neck 层的 3 个输出层特征图:

1
2
cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean --target-layers neck
本文作者:紅葉
本文链接:https://swe-et.github.io/yolov5/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可