YOLO v7论文(YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors)被收录于计算机视觉顶会CVPR2023,这也是时隔 6 年,YOLOv 系列再登顶会 CVPR!我们知道CVPR是计算机视觉方面的三大顶级会议之一,上一次被收录还是YOLO v2,这也可以看到YOLO v7很强大,也被很多人所认可。
目标检测(Object Detection):解决“在哪里?是什么?”的问题。找出图像中所有感兴趣的目标(物体),确定它们的类别和位置。
当前目标检测算法,共同目标更快、更好。围绕此目标,有Two stage和One stage方法。One satge的代表YOLO(You Only Look Once)系列算法。

如图上图,自2015年YOLO v1发布以来,YOLO系列经历了多次更新和改进,产生众多衍生版本。YOLO系列算法,自2015年v1版本发布以来,经历了多次更新和改进,除去17年外,几乎每一年都会迭代出1到3个版本。其中v1~v3是YOLO创始人的亲笔之作。v4和v7是被YOLO官方认可的传承者。其他v5是一家美国公司维护开发的,PP出自百度,v6出自美团。也可见,YOLO v7,不是一朝一夕完成的,它是有前人的铺垫的。

由论文中图示,在5 FPS 到 160 FPS 范围内,YOLOv7 在 speed 和 accuracy 上都超过了所有已知的目标检测器,并且在 GPU V100 上 30 FPS 或更高的实时目标检测器中,YOLOv7 有最高的 56.8% AP的 accuracy。
论文聚焦如何在目标检测中取得更快的速度、更高的精度。
它为什么具备如此好的效果,论文分两个方面给出了答案。
第一个方面是YOLO v7的网络架构,它共有2点改进,第一点,是整体架构设计使用创新多分支堆叠模块和过渡模块提取特征。第二点,特殊的SPPCSPC模块,扩大感受野。
第二个方面是训练策略也就是题目中出现的bag-of-freebies,免费技巧包,这是YOLO v7最主要的改进点,也是最为精彩的部分。它共有两点,第一点,模块重参化,在不提高推理成本的情况下提高检测精度。第二点,动态标签分配,这可以加快模型的训练效率,增加正样本的数量。
网络结构
训练策略
网络结构如下图所示:

先看YOLO v7的网络结构,它是如何构建的,从整体框架来看,YOLO v7和以前的YOLO系列算法并没有太大的区别,依旧可以被分为3个部分,分别是主干特征提取网络,加强特征提取网络,以及YOLO head。
多分支堆叠模块

过渡模块

SPPCSPC模块

如下图ResNet,它也是有分支的,还有刚才介绍的YOLO v7它就是使用非常多的分支结构,再堆叠。
根据现有的经验来看,利用分支,是可以有效增加模型表征学习能力,来提升精度的。
但是做分支的时候,存在一个问题,多分支结构能显著提高模型性能,但是又会最终导致模型在推理时速度变慢且还非常耗内存,这非常不利于实际场景的应用。
速度变慢好理解的,因为结构复杂运算多了,就慢了。
这时就出现模块重参数化解决这个问题。
就是将训练和推理分开,训练是一件事情,推理又是一件事情,训练的网络结构和测试的网络结构不一样,就常识来说,训练和推理它网络结构得相同。要不然网络结构怎样去走呢。
模块重参数化
下图B单路卷积就一条路,走自己的路谁都不用管,就一倍显存。下图A多分支结构,将导致模型推理时速度变慢且还非常耗内存。


多分支合并为一个3×3卷积

模块重参数化的问题
RepConv中的 identity 连接破坏了ResNet中的残差和DenseNet中的拼接。
使用无 identity 连接的 RepConv (RepConvN)来设计规划的重参数卷积的架构

动态标签分配
深度监督是一种常用于训练深度网络的技术,是指在模型训练过程中,除了最终的检测头外,再额外增加一些辅助检测头,辅助检测头也会参与损失函数的计算,并且会反向传播,协助前面的层更新参数,帮助深度神经网络更好地训练和泛化。
为了区分辅助头和原来的头,给他们分别命名为lead head和AUX head,这种使用辅助头,深度监督训练模型的方式在其他论文中也都已经使用过。
标签分配指的是将输出图片的标注框,也叫做真实框,和最终预测的预测值给对应起来,便于进一步求损失值。
常用的方法辅助头和引导头,各自的预测结果和GT执行标签分配。
作者认为这方式都不好,所以又提出了两种方式,改进深度学习中的标签分配问题。这两种方法都是通过引入额外的辅助头来指导标签分配,从而提高模型的性能。


这是作者在文章最后罗列的3种方法,YOLO v7还直接借鉴使用了别的算法具备很好效果的模块和思想,虽然我们通过上面的讲解我们知道YOLO v7还是创新很多东西的,但是借鉴的是更多的东西。
这个时候可以回答,v7为什么好,因为借鉴融合的多,通过这种巧妙的融合,取得了最先进的检测结果。
所以我们也可以理解为什么作者用bag-of-freebies,免费礼包这个词,不是自己,就是白拿过来用的嘛。
1、克隆代码库,这里使用bubbliiiing的YOLO v7仓库,该仓库代码注释多,易于使用
git clone https://github.com/bubbliiiing/yolov7-pytorch2、创建环境,以conda下环境为例
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/根据代码仓库要求,准备VOC2007格式数据集
VOC2007数据集目录结构如下图,Annotations文件夹包含每张图像的标准框信息,每个文件是一个XML格式的文件,描述该图像中每个目标的位置、类别等信息。ImageSets文件夹用于指定训练、测试、验证数据集中哪些图像会被使用。JPEGImages文件夹存放每个图像的JPEG格式文件。

生成训练所需的标签,运行voc_annotation.py文件生成训练所需的2007_train.txt和2007_val.txt两个文件

YOLO v7的训练代码如下图所示,可以按照代码注释要求修改配置后,可以运行train.py开始训练了,在训练多个epoch后,权值会生成在logs文件夹中。

训练结果预测需要用到两个文件,分别是yolo.py和predict.py。
首先修改yolo.py中的权值路径和分类的文件

修改完成后,可以根据需要运行predict.py文件进行预测

预测效果如下所示:

YOLO v7 GitHub仓库 链接
YOLO v7论文 链接
YOLO v7博客

希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!