查看: 156|回复: 9

深入浅出 Yolo 系列之 Yolov7 基础网络结构详解

[复制链接]

3

主题

9

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-9-20 07:59:22 | 显示全部楼层 |阅读模式
从 2015 年的 YOLOV1,2016 年  YOLOV2,2018 年的  YOLOV3,到2020年的   YOLOV4、 YOLOV5, 以及最近出现的 YOLOV6  和 YOLOV7 可以说  YOLO 系列见证了深度学习时代目标检测的演化。对于  YOLO 的基础知识以及  YOLOV1 到  YOLOV5 可以去看大白的 YOLO 系列,本文主要对 YOLOV7 的网络结构进行一个梳理,便于大家直观的感受。

1. YOLOV7 整体结构





   我们先整体来看下  YOLOV7,首先对输入的图片 resize 为 640x640 大小,输入到 backbone 网络中,然后经 head 层网络输出三层不同 size 大小的 **feature map**,经过 Rep 和 conv输出预测结果,这里以 coco 为例子,输出为 80 个类别,然后每个输出(x ,y, w, h, o) 即坐标位置和前后背景,3 是指的 anchor 数量,因此每一层的输出为 (80+5)x3 = 255再乘上 feature map 的大小就是最终的输出了。  

2. backbone

YOLOV7 的 backbone 如下图所示


  总共有 50 层, 我在上图用黑色数字把关键层数标示出来了。
首先是经过 4 层卷积层,如下图,CBS 主要是 Conv + BN + SiLU 构成,我在图中用不同的颜色表示不同的 size 和  stride, 如 (3, 2)  表示卷积核大小为 3 ,步长为 2。 在 config 中的配置如图。





  经过  4个 CBS 后,特征图变为 160 * 160 * 128 大小。随后会经过论文中提出的 ELAN 模块,ELAN 由多个 CBS 构成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化, 后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道。






MP 层 主要是分为 Maxpool  和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化。



backbone的基本组件就介绍完了,我们整体来看下 backbone,经过 4 个 CBS 后,接入例如一个 ELAN ,然后后面就是三个 MP + ELAN 的输出,对应的就是 C3/C4/C5 的输出,大小分别为 80  *  80  *  512 , 40  *  40  *  1024, 20  *  20 *  1024。 每一个 MP 由 5 层, ELAN 有 8 层, 所以整个 backbone 的层数为  4 + 8 + 13  *  3 = 51 层, 从 0 开始的话,最后一层就是第 50 层。
3. head









    YOLOV7  head 其实就是一个 **pafpn** 的结构,和之前的YOLOV4,YOLOV5 一样。首先,对于 backbone 最后输出的 32 倍降采样特征图 C5,然后经过 SPPCSP,通道数从1024变为512。先按照 top down 和 C4、C3融合,得到 P3、P4 和 P5;再按 bottom-up 去和 P4、P5 做融合。这里基本和 YOLOV5 是一样的,区别在于将 YOLOV5 中的 CSP 模块换成了 ELAN-H 模块, 同时下采样变为了 MP2 层。
ELAN-H 模块是我自己命名的,它和 backbone 中的 ELAN 稍微有点区别就是 cat 的数量不同。



  至于 E-ELAN 论文中说到是在 YOLOV7-E6eE中用到, 但是我在看代码的时候,有点没太明白是怎么做 shuffle 的,这里等我弄明白了再补上来。




  对于 **pafpn** 输出的 P3、P4 和 P5 , 经过 RepConv 调整通道数,最后使用 1x1 卷积去预测 objectness、class 和 bbox 三部分。
RepConv 在训练和推理是有一定的区别。训练时有三个分支的相加输出,部署时会将分支的参数重参数化到主分支上。



####  end  

  至此,我们将 YOLOV7 的基本结构介绍完了,至于 YOLOv7 的其他知识,如Aux Head 等以及 YOLOv7 的其他网络结构,我们后续再讲。 梳理可能有未理解正确的地方,欢迎交流。
回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-9-20 07:59:28 | 显示全部楼层
厉害了,清晰,简单,明了,感谢分享
回复

使用道具 举报

5

主题

9

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-9-20 07:59:35 | 显示全部楼层
github.com/nemonameless 看到一个l x tiny全的实现,但也好多if else,确实堆叠没啥章法
回复

使用道具 举报

2

主题

9

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2022-9-20 07:59:50 | 显示全部楼层
催更催更
回复

使用道具 举报

1

主题

6

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-20 08:00:06 | 显示全部楼层
写了一篇解读一个v6v7代码库的文章
从百度飞桨YOLOSeries库看各个YOLO模型 - 迪迦奥特曼的文章 - 知乎 https://zhuanlan.zhihu.com/p/550057480[害羞]
回复

使用道具 举报

2

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-20 08:00:39 | 显示全部楼层
奥特曼也用yolo
回复

使用道具 举报

1

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-9-20 08:00:49 | 显示全部楼层
得用YOLOv6/7识别怪兽品种呢[酷]
回复

使用道具 举报

3

主题

9

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2022-9-20 08:01:44 | 显示全部楼层
请问那个模块的层数是怎么计算的?比如MP-1模块中有3个卷积+1个maxpool和一个concat层所以合计为5,所以该模块算5层,而不是按照当前模块一个分支最大卷积数量算吗?
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-9-20 08:02:05 | 显示全部楼层
蹲一手如何shuffle,我也没看明白,而且我看issue里作者说就是这个结构就能shuffle了.....
回复

使用道具 举报

1

主题

3

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2022-9-20 08:03:04 | 显示全部楼层
这图MP2上面的80*80*256写错了,应该是40*40*256,MP2是会缩小像素的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|多点娱乐

GMT+8, 2025-4-7 02:13 , Processed in 0.103448 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表