毕业设计-1

🚀 毕业设计-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 ,没有任何改进情况,总结果如下:
ClassImagesInstancesPRmAP50mAP50-95
all132356690.7440.7080.7470.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)

附录

本文所有参考链接如下,如有侵权联系删除

  1. sahi项目地址】:https://github.com/obss/sahi
  2. bilibili:sahi讲解】:https://www.bilibili.com/video/BV1Zu4y1R7t7/?spm_id_from=333.337.search-card.all.click&vd_source=020c8f72ace8adb0a3bfc2b77235a579
  3. 知乎:改善小目标检测的tricks】:https://zhuanlan.zhihu.com/p/600697146
  4. 小目标检测方向新进展】:https://www.zhihu.com/question/280393440/answer/3176822603
  5. 小目标检测研究进展】:https://sjcj.nuaa.edu.cn/sjcjycl/article/html/202103001
  6. 论文1】:《BiFormer: Vision Transformer with Bi-Level Routing Attention》
  7. 论文2】:《A Normalized Gaussian Wasserstein Distance for Tiny Object Detection》
  8. 论文3】:《Small Object Detection via Coarse-to-fine Proposal Generation and Imitation Learning》
  9. 论文4】:《Towards Large-Scale Small Object Detection: Survey and Benchmarks》
  10. YOLOv8+BiFormer】:https://developer.aliyun.com/article/1438085
  11. YOLOv9 代码仓库 】:https://gitcode.com/WongKinYiu/yolov9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值