【项目问答】YOLOv5

YOLOv5系列的特点

Yolov5有4个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x,通过depth(深度)和width(宽度)两个参数控制

Yolov5s网络最小,速度最快,AP精度也最低,不断加深加宽网络,AP精度也不断提升,但速度的消耗也在不断增加。

介绍一下v5

v5的原理可以分为四部分:输入端、backbone、Neck、输出端;
输入端:针对小目标的检测,采用了mosaic增强,在初始宽高的anchor的基础上使用kmeans和遗传算法自适应的计算不同训练集中的最佳锚框值,并通过添加最少黑边的方式提高推理速度。
backbone:在图片输入前加入了Focus减少参数量,再通过3个卷积和C3模块交替提取特征,最后经过卷积、spp和C3模块。
Neck:采用了PANet进行多尺度特征融合,PANet在FPN的基础上引入了 Bottom-up path augmentation 结构。
输出端:输出置信度、边框信息、分类信息。

网络结构:

1、模型参数配置:【YOLOV5-5.x 源码解读】yolov5s.yaml_满船清梦压星河HK的博客-CSDN博客_yolov5s

2、模块实现:

【YOLOV5-5.x 源码解读】common.py_满船清梦压星河HK的博客-CSDN博客

3、模型搭建:【YOLOV5-5.x 源码解读】yolo.py_满船清梦压星河HK的博客-CSDN博客_yolov5代码详解

(1)输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
(2)Backbone(主干网络,用来提取特征):Focus结构,BottleneckCSP结构、SPP结构
(3)Head:PANet+Detect

1、输入端

(1)Mosaic数据增强

【YOLOV5-5.x 源码解读】datasets.py_满船清梦压星河HK的博客-CSDN博客【YOLOV5-5.x 源码解读】datasets.py_满船清梦压星河HK的博客-CSDN博客

1、Mosaic数据增强的做法

采用了4张图片进行随机缩放、随机裁剪进行拼接,变相增大mini-batch

2、为什么进行Mosaic数据增强呢?

为了提高对小目标的检测效果

3、有什么优点

  1. 丰富数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
  2. 减少GPU:训练时可以直接计算4张图片的数据

延伸提问点:

1、你在比赛中用了哪些数据增强方式?

生成大小不同的图片、旋转、平移

2、yolov5用了哪些数据增强方式?

训练阶段: mosaic+ hsv色域增强(色调、饱和度、亮度) + 上下左右翻转

测试阶段: 自适应图片缩放

3、为什么不采用其他的数据增强方式?

尝试过一些其他方法,发现对mAP没有什么帮助,同时还延长了训练时间

4、除了这些,你还知道哪些数据增强方法  /你还尝试了哪些训练方法

cutout数据增强,给图片随机添加随机大小的方块噪声

mixup数据增强:按比例融合两张图片

5、为什么图像旋转、裁剪、放缩这些方法能有效增大样本量,它们不都是同一张图片吗

一个欠训练的神经网络会认为经过数据增强处理后的图片是不同、独特的图片

(2) 自适应锚框计算

【YOLOV5-5.x 源码解读】autoanchor.py_满船清梦压星河HK的博客-CSDN博客

【论文理解】理解yolov3的anchor、置信度和类别概率_DLUT_yan的博客-CSDN博客_yolo置信度

在Yolo算法中会设定初始长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距(loss),再反向更新,迭代网络参数。

yolov5初始化了9个anchor,在三个Detect层使用(3个feature map)中使用,每个feature map的每个grid_cell都有三个anchor进行预测。分配的规则是:尺度越大的feature map相对原图的下采样率越小,感受野越小,所以相对可以预测一些尺度比较小的物体,所以分配到的anchors越小;尺度越小的feature map相对原图的下采样率越大,感受野越大,所以相对可以预测一些尺度比较大的物体,所有分配到的anchors越大。虽然根据经验设置的这些anchor可以适用于大多数数据集,但是也不能保证这3组anchors就适用于所有的数据集,所有yolov5还有一个anchor进化的策略:使用k-means和遗传进化算法,找到与当前数据集最吻合的anchors

1、为什么要有anchor,不能直接输出坐标吗?

anchor box将训练集中常出现的box形状预先加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些。对预测的对象范围进行约束,有助于模型快速收敛

2、没有anchor可以做目标检测吗?举个例子?

可以,EAST

3、yolov5在3个detect层都输出了anchor,为什么要这样做?

可以在小特征图(feature map)上检测大目标,也可以在大特征图上检测小目标

4、为什么yolo要用k-means算法,它的距离度量是怎么做的?

通过k-means和遗传进化算法算法可以让achor自适应各种场景。yolov5论文中作者发现使用欧氏距离来计算效果不是很好,使用了1-IOU来表示距离,如果如果bbox与对应的簇中心(anchor)IOU越大,则距离越近(1-IOU)越小)

5、什么是遗传进化算法?

遗传算法是一种借鉴生物遗传学而开发的算法,群体通过不断进行遗传和进化,按照优胜劣汰的规则保留适应度较高的个体。

在yolov5中使用遗传算法随机对anchors的wh进行变异,如果变异后效果变得更好(使用anchor_fitness方法计算得到的fitness(适应度)进行评估)就将变异后的结果赋值给anchors,如果变异后效果变差就跳过,默认变异1000次。

6、如何区分正负样本的

如果预测框与groundtruth的IOU大于某个阈值则认为是正样本

(3)自适应图片缩放

1、什么是自适应缩放?和普通的缩放有什么区别?

普通缩放是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。但很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。自适应缩放可以对原始图像添加最少的黑边。

2、怎么做到添加最少的黑边?

普通缩放是直接将缩放后短边剩余部分全部填充为黑边,而自适应缩放在填充黑边时只将短边填充到短边向上取整的32的倍数,从而让黑边最小化

3、为什么用32的倍数?

因为Yolov5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。

4、训练的时候使用自适应缩放了吗

训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。

2、 Backbone

【YOLOV5-5.x 源码解读】common.py_满船清梦压星河HK的博客-CSDN博客

 (1)Focus结构

原理:Focus是把原图每隔一个像素取出来,分割为四张图片,每张图片都和原图几乎一样,在经过拼接形成12个通道的图像,经过卷积后得到2倍下采样的特征映射。

作用:

切片拼接:增加信息量

1层卷积:减少计算量,增加速度。

1、参数量和flops如何计算

params计算公式:

卷积核的长*宽*输入通道数*输出通道数

FLOPs计算公式:

Kh × Kw × Cin × Cout × H × W = 即(当前层filter × 输出的feature map)= params × H × W

2、为什么focus模块可以减低计算量

因为focus模块将YOLOv3中的三层卷积层压缩为了一层,从而减小了参数量和计算量,提升了推理速度

3、Focus为什么只用了一次,并且是用在整个网络的最开始阶段?

用多次可能会影响模型效果

(2)Conv结构

这个函数是整个网络中最基础的组件,由卷积层 + BN层 + 激活函数 组成,具体结构如下图:

在这里插入图片描述

Conv:提取特征。

bn:约束神经网络每一层输出的数据分布,从而加速模型收敛

SiLU:起到非线性的作用,可以看做是介于线性函数与ReLU函数之间的平滑函数

YOLO用到了哪些激活函数?

 SiLU、leakyReLU,Mish(和ReLU一样,都是无正向边界的,可以避免梯度消失)

(3)C3结构

原理:C3结构将输入按通道划分为两部分,其中一部分经过Bottlenneck进一步提取特征,与另一部分经过拼接,Bottlenneck提取特征的过程是先经过1*1卷积融合各通道信息,再通过3*3卷积进一步提取特征,同时进行残差连接。

作用:由于只有一部分会参与Bottlenneck,因此降低了计算量、节约了内存成本并且有效缓解了梯度消失。

1、残差连接怎么做的,是为了解决什么问题

残差连接是为了解决网络退化(梯度消失)问题,网络退化就是随着层数增加,模型效果反而变差的现象。残差连接是对每一个导数加上一个恒等项1,dh/dx=d(f+x)/dx=1+df/dx。此时就算原来的导数df/dx很小,这时候误差仍然能够有效的反向传播

2、add和concat的区别

add和concat都可以做特征融合,add是特征图直接相加,通道数不变,计算量小,concat是通道数增加,效果更好

concat效果会更好是因为add默认对应通道提取到的信息是相同的,而concat没有这个假设,而是在后面再跟一层神经网络去提取特征。

3、残差和dropout的联系

都是通过形成不同的通路从而在训练过程中训练了多个模型进行集成,提高了泛化能力

4、为什么先用1*1卷积再用3*3卷积

降低参数量

 (4)SPP(空间金字塔池化 Spatial pyramid pooling layer)

这个模块的主要目的是为了将更多不同分辨率的特征进行融合,得到更多的信息。

SPP模块具体的结构如下所示:

原理:先通过一个标准卷积模块将输入通道减半,然后分别做kernel-size为5,9,13的maxpooling(对于不同的核大小,padding是自适应的,所以长宽不变),对三次最大池化的结果与未进行池化操作的数据进行concat,最终合并后channel数是原来的2倍。

通过spp模块对局部特征和全局特征的融合,丰富最终特征图的表达能力,有利于检测不同大小的目标,从而提高MAP

3、head

YOLOv5 head = PANet+Detect

 (1)PANet

原理:PANet 结构是在FPN(特征图金字塔网络)的基础上引入了 Bottom-up path augmentation 结构。

FPN主要是将语义更强的高层特征自上而下进行上采样,和自底而上对应的相同大小特征图进行融合,这样可以利用底层定位细节信息。再通过Bottom-up path augmentation结构在 FPN 的基础上加了一个自底向上方向的增强,使得顶层特征图进一步用到底层带来的丰富的位置信息,从而提升特征提取能力。

1、FPN的特征融合为什么是相加操作呢?

concat与add都可以实现特征融合,concat是通道数的增加,add是特征图相加,通道数不变,但是add的计算量要比concat的计算量小得多

(2)Detect

三组输出特征图大小为:

  • bs * 255 * 80 * 80;
  • bs * 255 * 40 * 40;
  • bs * 255 * 20 * 20;

其中,bs是batch size,255 的计算方式为 [na * (nc + 1 + 4)] ,具体参数含义如下:

  • na(number of anchor) 为每组 anchor 的尺度数量(YOLOv5中一共有 3 组anchor,每组有3个尺度);
  • nc 为number of class (coco的class 为80);
  • 1 为前景背景的置信度score;
  • 4 为中心点坐标和宽高;

最后,输出的特征图上会应用锚定框,并生成带有类别概率、置信度得分和预测框

在训练阶段,还要将NMS产生的预测框和真实框groundtruth来计算损失函数反向更新参数 

复试提问点:

1、网络是通过什么来识别大物体和小物体的,或者说特征提取网络中提取到的是什么特征

在Mosica数据增强随机添加了小目标,在SPP结构中和FPN结构中也进一步提高了预测不同尺度目标的能力

2、YOLOv5模型这么复杂,怎么做到速度这么快的

(1)自适应缩放

(2)Focus,C3模块

(3)1*1卷积

3、小目标难以检测的原因 / 对小目标检测的改进

小目标分辨率低,图像模糊,携带的信息少

可以从下面几个方面考虑:1. 增大输入尺寸  2、 FPN

4、分析一下YOLO对小目标检测效果不好的原因

YOLO网络可以理解为是强行把图片分割成7*7个网格,每个网格预测2个目标,相当于只能检测98个目标

5、yolo的预测框是什么值

通道里输出的是中心点坐标和宽高的偏移量

6、yolo的宽高都是相对于整张图的比例吗,怎么计算真实的宽高

采用相对坐标。(x,y)是bounding box中心点相对于所在grid cell左上角格点的坐标,(w,h)是相对于整幅图片的宽高,故值都在0~1之间,起到了均一化的效果。

通过乘以图像的宽高将x、y、w、h恢复到resize后图像的真实值,再去除以原图到resize后图像(512)的缩放比例

4、输出端

(1)目标框回归

1、yolo如何避免输出的预测框宽高不可控,出现NAN值,最后无法收敛 / yolo做了什么操作来防止损失函数无穷大

yolov5将输出的偏移量都通过sigmoid函数压缩到0-1之间,这样就不会出现NAN值,并且label的x,y,w,h都是0-1之间的值,使用sigmoid进行压缩是合理的

(2)跨网格预测策略

yolov5采用了跨网格匹配规则,如下图所示,绿点表示该gt bbox中心,现在需要额外考虑其2个最近的邻域网格的anchor也作为该gt bbox的正样本,明显增加了正样本的数量

(3)NMS非极大值抑制

【YOLO v4】常见的非极大值抑制方法:(Hard) NMS、Soft NMS、DIoU NMS_满船清梦压星河HK的博客-CSDN博客

NMS原理及代码实现_Roger-Liu的博客-CSDN博客_nms代码

  • 后处理是怎么做的 / NMS是怎么做的?

NMS的目的是去除重复框,降低误检,算法的流程是:

1. 先对网络预测出的所有边界框按分数(属于某个种类的概率)由高到低排列;
2. 再取分数最高的预测框作为target,分别算出target与其余预测框的IoU;
3. 若IoU大于某一设定的阈值,则认为该预测框与target同时负责预测同一个物体,所以将该预测框删除,否则就保留该预测框;
4. 接着在未被删除的预测框中选择分数最高的预测框作为新的target,与它后面的其它框重复上面的步骤,直到判断出所有框是否应该删除

  • NMS的缺点是什么?有什么改进方法吗?

NMS的IOU阈值不容易设定,阈值设置过低容易删除重叠物体,阈值设置过高又容易增大误检。我知道的有两个改进方式:soft NMS与DIOU NMS。soft NMS并不粗鲁地删除所有IOU大于阈值的框,而是降低其置信度(用一个函数来衰减预测框score),DIOU是在IoU loss基础上添加一个惩罚项,该惩罚项用于最小化两个bbox的中心点距离

损失函数

【YOLOV5-5.x 源码解读】loss.py_满船清梦压星河HK的博客-CSDN博客

YOLOv5损失函数包含:

  • localization loss,定位损失(预测框与GT框之间的误差)
  • classification loss,分类损失
  • confidence loss,置信度损失(框的目标性;objectness of the box)

总的损失函数:localization loss+classification loss+confidence loss

YOLOv5使用使用CIOU Loss作为定位损失,二元交叉熵损失函数计算分类损失和置信度损失

定位损失常用计算指标是IOU:

  •  IOU_Loss:主要考虑检测框和目标框重叠面积。
  • GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
  • DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
  • CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息          

1、yolo v5怎么解决类别不均衡问题,此外,你还知道哪些解决类别不均衡的办法

通过focal loss来解决,具体来说给予少数类样本、难分样本更大的权重

  • 6
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值