🚀 毕业设计-day1
⭐️ yolov9 进行模型测试
1. 原始yolov9-c训练100轮,验证集进行测试
-
运行代码:
python val.py --data data/data.yaml --img 640 --batch 2 --conf 0.001 --iou 0.7 --device 0 --weights './runs/exp/weights/best.pt' --save-json --name yolov9_my_text_640_val
-
解决这个报错:
- 正在运行中,显存占用情况(命令:
nvidia-smi
):
- 验证ing,接下来就看达到100%的时候会不会报错了:
- 很好,没有问题,最终结果如下:
- 模型为原始的yolov9-c.pt ,没有任何改进情况,总结果如下:
Class | Images | Instances | P | R | mAP50 | mAP50-95 |
---|---|---|---|---|---|---|
all | 1323 | 5669 | 0.744 | 0.708 | 0.747 | 0.437 |
2. 回顾小目标检测优化思路
-
小目标定义:当图片中的目标面积占图片总面积的 3% 以下时,将其称为小目标。
-
思路1(数据增强)
- 将图片中满足“小目标”定义的正样本,利用图像处理库(如OpenCV),将其复制并粘贴在图像中的任意位置。
- 粘贴之后,添加样本标签,即对于每个小目标进行标注。
- 并且重复这样的操作,从而达到一定的样本数量。
- 再次训练,对比效果。
-
思路2(滑动窗口检测)
- 将原始图像 X 切割成3*3个小图像,记为 Y,同时记录每个图像在原始图像中的相对位置。
- 将每个图像 Y 调整大小后,使用yolov9进行目标检测,非极大值抑制。
- 当被分割的九个图像 Y 都进行了目标检测之后,将其再按照相对位置拼接还原。
- 有一点需要注意,被识别的目标也需要进行坐标的相对位置还原,从而得到最终的识别结果。
-
思路3 (网络结构:使用适合小目标的检测头)
- 此时属于更改模型,需要预训练模型(从头开始训练),效果可能没有官方的模型进行微调效果好,但是我们仍旧可以通过预训练官方模型(而不是使用官方的模型进行微调)进行对比。
- 首先,修改网络中的检测头部分,为了适合小目标检测,我们需要在感受野非常小的地方插入检测头。
- 我们知道,网络深度越深,感受野越大,因此为了检测到较小的目标,我们需要从浅层引出检测头,从而实现小尺度检测。
- 需要注意的是,由于引出检测头的网络层数很浅,所以我们需要增强浅层的网络特征提取能力,这个是我们后面需要进一步改进的地方。
-
思路4 (损失函数:使用归一化高斯Wasserstein距离)
- 核心:用NWD来作为小目标检测的loss损失指标
- 原理:利用真实锚框的高斯分布和预测锚框的高斯分布,对比两者之间的距离,从而得到预测与真实锚框之间的距离
- 实现:利用包围框(BBox)的相关参数计算属于该BBox的高斯分布,然后计算两个锚框对应高斯分布的Wasserstein距离,应用非线性转换函数进行归一化,主要修改非极大值抑制以及损失函数的代码。
-
思路5 (引入BiFormer注意力机制)
- 思路:将 Transformer 的注意力机制引入,并且使用稀疏注意力机制来提高计算性能,强化了目标框所在位置的“注意力”,进一步提升网络性能。
- 具体实现可以参考参考文献10(Yolov8 + BiFormer)
-
其他(使用两阶段网络的小目标检测)
- 最新的有Coarse-to-fine管道和特征模仿学习的CFINet框架
- 添加SPD-Conv骨干网络
- Transformer Prediction Heads (TPH)集成
- CBAM集成
- 用Bi-FPN替换PAN-Net
- 等等
3. 阅读 yolov9 源代码
- 我们直接选择寻找网络框架的定义代码
- 位于项目的 models 文件夹下
- 可以看到 yolov9-c 的网络结构如下
主干网络
# YOLOv9 主干网络
backbone:
[
[-1, 1, Silence, []], # 输入层
# 卷积下采样
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
# 卷积下采样
[-1, 1, Conv, [128, 3, 2]], # 2-P2/4
# elan-1 模块
[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3
# 平均值-卷积下采样
[-1, 1, ADown, [256]], # 4-P3/8
# elan-2 模块
[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5
# 平均值-卷积下采样
[-1, 1, ADown, [512]], # 6-P4/16
# elan-2 模块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7
# 平均值-卷积下采样
[-1, 1, ADown, [512]], # 8-P5/32
# elan-2 模块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9
]
检测头
# YOLOv9 头部网络
head:
[
# elan-spp 模块
[-1, 1, SPPELAN, [512, 256]], # 10
# 上采样和合并
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 7], 1, Concat, [1]], # 将backbone P4拼接
# elan-2 模块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 13
# 上采样和合并
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 5], 1, Concat, [1]], # 将backbone P3拼接
# elan-2 模块
[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 16 (P3/8-small)
# 平均卷积下采样合并
[-1, 1, ADown, [256]],
[[-1, 13], 1, Concat, [1]], # 将head P4拼接
# elan-2 模块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 19 (P4/16-medium)
# 平均卷积下采样合并
[-1, 1, ADown, [512]],
[[-1, 10], 1, Concat, [1]], # 将head P5拼接
# elan-2 模块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 22 (P5/32-large)
# 多级可逆的辅助分支
# 路由
[5, 1, CBLinear, [[256]]], # 23
[7, 1, CBLinear, [[256, 512]]], # 24
[9, 1, CBLinear, [[256, 512, 512]]], # 25
# 卷积下采样
[0, 1, Conv, [64, 3, 2]], # 26-P1/2
# 卷积下采样
[-1, 1, Conv, [128, 3, 2]], # 27-P2/4
# elan-1 块
[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 28
# 平均值-卷积下采样融合
[-1, 1, ADown, [256]], # 29-P3/8
[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30
# elan-2 块
[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 31
# 平均值-卷积下采样融合
[-1, 1, ADown, [512]], # 32-P4/16
[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33
# elan-2 块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 34
# 平均值-卷积下采样融合
[-1, 1, ADown, [512]], # 35-P5/32
[[25, -1], 1, CBFuse, [[2]]], # 36
# elan-2 块
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 37
# 检测头部
# 检测
[[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)
附录
本文所有参考链接如下,如有侵权联系删除
- 【sahi项目地址】:https://github.com/obss/sahi
- 【bilibili:sahi讲解】:https://www.bilibili.com/video/BV1Zu4y1R7t7/?spm_id_from=333.337.search-card.all.click&vd_source=020c8f72ace8adb0a3bfc2b77235a579
- 【知乎:改善小目标检测的tricks】:https://zhuanlan.zhihu.com/p/600697146
- 【小目标检测方向新进展】:https://www.zhihu.com/question/280393440/answer/3176822603
- 【小目标检测研究进展】:https://sjcj.nuaa.edu.cn/sjcjycl/article/html/202103001
- 【论文1】:《BiFormer: Vision Transformer with Bi-Level Routing Attention》
- 【论文2】:《A Normalized Gaussian Wasserstein Distance for Tiny Object Detection》
- 【论文3】:《Small Object Detection via Coarse-to-fine Proposal Generation and Imitation Learning》
- 【论文4】:《Towards Large-Scale Small Object Detection: Survey and Benchmarks》
- 【YOLOv8+BiFormer】:https://developer.aliyun.com/article/1438085
- 【 YOLOv9 代码仓库 】:https://gitcode.com/WongKinYiu/yolov9