Yolov5有4个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x,通过depth(深度)和width(宽度)两个参数控制
Yolov5s网络最小,速度最快,AP精度也最低,不断加深加宽网络,AP精度也不断提升,但速度的消耗也在不断增加。
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
【YOLOV5-5.x 源码解读】datasets.py_满船清梦压星河HK的博客-CSDN博客【YOLOV5-5.x 源码解读】datasets.py_满船清梦压星河HK的博客-CSDN博客
采用了4张图片进行随机缩放、随机裁剪进行拼接,变相增大mini-batch
为了提高对小目标的检测效果
延伸提问点:
生成大小不同的图片、旋转、平移
训练阶段: mosaic+ hsv色域增强(色调、饱和度、亮度) + 上下左右翻转
测试阶段: 自适应图片缩放
尝试过一些其他方法,发现对mAP没有什么帮助,同时还延长了训练时间
cutout数据增强,给图片随机添加随机大小的方块噪声
mixup数据增强:按比例融合两张图片
一个欠训练的神经网络会认为经过数据增强处理后的图片是不同、独特的图片
【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。
anchor box将训练集中常出现的box形状预先加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些。对预测的对象范围进行约束,有助于模型快速收敛
可以,EAST
可以在小特征图(feature map)上检测大目标,也可以在大特征图上检测小目标
通过k-means和遗传进化算法算法可以让achor自适应各种场景。yolov5论文中作者发现使用欧氏距离来计算效果不是很好,使用了1-IOU来表示距离,如果如果bbox与对应的簇中心(anchor)IOU越大,则距离越近(1-IOU)
越小)
遗传算法是一种借鉴生物遗传学而开发的算法,群体通过不断进行遗传和进化,按照优胜劣汰的规则保留适应度较高的个体。
在yolov5中使用遗传算法随机对anchors的wh进行变异,如果变异后效果变得更好(使用anchor_fitness方法计算得到的fitness(适应度)进行评估)就将变异后的结果赋值给anchors,如果变异后效果变差就跳过,默认变异1000次。
如果预测框与groundtruth的IOU大于某个阈值则认为是正样本
普通缩放是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。但很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。自适应缩放可以对原始图像添加最少的黑边。
普通缩放是直接将缩放后短边剩余部分全部填充为黑边,而自适应缩放在填充黑边时只将短边填充到短边向上取整的32的倍数,从而让黑边最小化
因为Yolov5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。
训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。
【YOLOV5-5.x 源码解读】common.py_满船清梦压星河HK的博客-CSDN博客
原理:Focus是把原图每隔一个像素取出来,分割为四张图片,每张图片都和原图几乎一样,在经过拼接形成12个通道的图像,经过卷积后得到2倍下采样的特征映射。
作用:
切片拼接:增加信息量
1层卷积:减少计算量,增加速度。
params计算公式:
卷积核的长*宽*输入通道数*输出通道数
FLOPs计算公式:
Kh × Kw × Cin × Cout × H × W = 即(当前层filter × 输出的feature map)= params × H × W
因为focus模块将YOLOv3中的三层卷积层压缩为了一层,从而减小了参数量和计算量,提升了推理速度
用多次可能会影响模型效果
这个函数是整个网络中最基础的组件,由卷积层 + BN层 + 激活函数 组成,具体结构如下图:
Conv:提取特征。
bn:约束神经网络每一层输出的数据分布,从而加速模型收敛
SiLU:起到非线性的作用,可以看做是介于线性函数与ReLU函数之间的平滑函数
YOLO用到了哪些激活函数?
SiLU、leakyReLU,Mish(和ReLU一样,都是无正向边界的,可以避免梯度消失)
原理:C3结构将输入按通道划分为两部分,其中一部分经过Bottlenneck进一步提取特征,与另一部分经过拼接,Bottlenneck提取特征的过程是先经过1*1卷积融合各通道信息,再通过3*3卷积进一步提取特征,同时进行残差连接。
作用:由于只有一部分会参与Bottlenneck,因此降低了计算量、节约了内存成本并且有效缓解了梯度消失。
残差连接是为了解决网络退化(梯度消失)问题,网络退化就是随着层数增加,模型效果反而变差的现象。残差连接是对每一个导数加上一个恒等项1,dh/dx=d(f+x)/dx=1+df/dx。此时就算原来的导数df/dx很小,这时候误差仍然能够有效的反向传播
add和concat都可以做特征融合,add是特征图直接相加,通道数不变,计算量小,concat是通道数增加,效果更好
concat效果会更好是因为add默认对应通道提取到的信息是相同的,而concat没有这个假设,而是在后面再跟一层神经网络去提取特征。
都是通过形成不同的通路从而在训练过程中训练了多个模型进行集成,提高了泛化能力
降低参数量
这个模块的主要目的是为了将更多不同分辨率的特征进行融合,得到更多的信息。
SPP模块具体的结构如下所示:
原理:先通过一个标准卷积模块将输入通道减半,然后分别做kernel-size为5,9,13的maxpooling(对于不同的核大小,padding是自适应的,所以长宽不变),对三次最大池化的结果与未进行池化操作的数据进行concat,最终合并后channel数是原来的2倍。
通过spp模块对局部特征和全局特征的融合,丰富最终特征图的表达能力,有利于检测不同大小的目标,从而提高MAP
YOLOv5 head = PANet+Detect
原理:PANet 结构是在FPN(特征图金字塔网络)的基础上引入了 Bottom-up path augmentation 结构。
FPN主要是将语义更强的高层特征自上而下进行上采样,和自底而上对应的相同大小特征图进行融合,这样可以利用底层定位细节信息。再通过Bottom-up path augmentation结构在 FPN 的基础上加了一个自底向上方向的增强,使得顶层特征图进一步用到底层带来的丰富的位置信息,从而提升特征提取能力。
concat与add都可以实现特征融合,concat是通道数的增加,add是特征图相加,通道数不变,但是add的计算量要比concat的计算量小得多
三组输出特征图大小为:
其中,bs是batch size,255 的计算方式为 [na * (nc + 1 + 4)] ,具体参数含义如下:
最后,输出的特征图上会应用锚定框,并生成带有类别概率、置信度得分和预测框
在训练阶段,还要将NMS产生的预测框和真实框groundtruth来计算损失函数反向更新参数
复试提问点:
在Mosica数据增强随机添加了小目标,在SPP结构中和FPN结构中也进一步提高了预测不同尺度目标的能力
(1)自适应缩放
(2)Focus,C3模块
(3)1*1卷积
小目标分辨率低,图像模糊,携带的信息少
可以从下面几个方面考虑:1. 增大输入尺寸 2、 FPN
YOLO网络可以理解为是强行把图片分割成7*7个网格,每个网格预测2个目标,相当于只能检测98个目标
通道里输出的是中心点坐标和宽高的偏移量
采用相对坐标。(x,y)是bounding box中心点相对于所在grid cell左上角格点的坐标,(w,h)是相对于整幅图片的宽高,故值都在0~1之间,起到了均一化的效果。
通过乘以图像的宽高将x、y、w、h恢复到resize后图像的真实值,再去除以原图到resize后图像(512)的缩放比例
1、yolo如何避免输出的预测框宽高不可控,出现NAN值,最后无法收敛 / yolo做了什么操作来防止损失函数无穷大
yolov5将输出的偏移量都通过sigmoid函数压缩到0-1之间,这样就不会出现NAN值,并且label的x,y,w,h都是0-1之间的值,使用sigmoid进行压缩是合理的
yolov5采用了跨网格匹配规则,如下图所示,绿点表示该gt bbox中心,现在需要额外考虑其2个最近的邻域网格的anchor也作为该gt bbox的正样本,明显增加了正样本的数量。
【YOLO v4】常见的非极大值抑制方法:(Hard) NMS、Soft NMS、DIoU NMS_满船清梦压星河HK的博客-CSDN博客
NMS原理及代码实现_Roger-Liu的博客-CSDN博客_nms代码
NMS的目的是去除重复框,降低误检,算法的流程是:
1. 先对网络预测出的所有边界框按分数(属于某个种类的概率)由高到低排列;
2. 再取分数最高的预测框作为target,分别算出target与其余预测框的IoU;
3. 若IoU大于某一设定的阈值,则认为该预测框与target同时负责预测同一个物体,所以将该预测框删除,否则就保留该预测框;
4. 接着在未被删除的预测框中选择分数最高的预测框作为新的target,与它后面的其它框重复上面的步骤,直到判断出所有框是否应该删除
NMS的IOU阈值不容易设定,阈值设置过低容易删除重叠物体,阈值设置过高又容易增大误检。我知道的有两个改进方式:soft NMS与DIOU NMS。soft NMS并不粗鲁地删除所有IOU大于阈值的框,而是降低其置信度(用一个函数来衰减预测框score),DIOU是在IoU loss基础上添加一个惩罚项,该惩罚项用于最小化两个bbox的中心点距离
【YOLOV5-5.x 源码解读】loss.py_满船清梦压星河HK的博客-CSDN博客
YOLOv5损失函数包含:
总的损失函数:localization loss+classification loss+confidence loss
YOLOv5使用使用CIOU Loss作为定位损失,二元交叉熵损失函数计算分类损失和置信度损失
定位损失常用计算指标是IOU:
通过focal loss来解决,具体来说给予少数类样本、难分样本更大的权重