文章目录[隐藏]
YOLO系列
Name | Academy | score | score |
---|---|---|---|
Harry Potter | Gryffindor | 90 | score |
Hermione Granger | Gryffindor | 100 | score |
Draco Malfoy | Slytherin | 90 | score |
PANet
Path-Aggregation Net,如下图所示,(a)蓝色部分是fpn,网络正常下采样后,又有一次上采样,然后进行特征融合。PANet认为fpn中比较大的特征图,左边的特征深度和右边的差距太大,特征不够精细,不易融合,因此又添加了一个下采样的过程(b),再进行融合一次。
spp
yolov3以后使用列spp网络,使用后mAP有了好几个百分点的提升,在加了SPP模块之后的YOLOv3为何有这么大的提升?
原始spp是解决网络尺度不同问题的,比如目标检测中,关于尺寸问题有以下几种情况
1 可能会有全连接层,这就要求输入尺寸固定,但是resize会导致图片信息丢失
2 使用全局最大池化代替全连接
3 使用spp后,无论输入为任何尺寸图片,都可以转为固定维度的向量,然后再全连接
如下图所示,降输入分成三个分支,分别分成N块进行全局最大池化,然后将池化后的值进行concat,如下图可以得到21×256的固定长度向量
在yolo中,如果使用原始的spp虽然长度固定,但是会丧失位置信息,因此这里的spp并非真正意义的spp。在相对于普通版本的YOLOv3,SPP版本在第五、六层卷积之间增加了一个SPP模块,这个模块主要是由不同的池化操作组成,具体的实现在YOLOv3-SPP的cfg文件中,这里的spp无关尺度,就是做了一次不同池化核的特征融合。
实现的配置代码如下,几个池化层的stride都是1,都没有改变尺寸:
### SPP ###
[maxpool]
stride=1
size=5
[route]
layers=-2
[maxpool]
stride=1
size=9
[route]
layers=-4
[maxpool]
stride=1
size=13
[route]
layers=-1,-3,-5,-6
2.cspnet
CSPNet(Cross Stage Partial Network)就是从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题。
作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSPNet是一种处理的思想,可以和ResNet、ResNeXt和DenseNet结合。个人觉得是加强版的resnet
下面是实现的cfg文件可视化图,可视化的内容是cspesnet50中的一个基本模块:
focus
yolov5输入有一个fucos操作,其实就是一次下采样的过程,不同于粗暴的下采样,他是将原始图片按照像素排布间隔抽取,并组成四张新的图片,并将新图片进行concat。好处是完成了下采样降低了计算量,并且比粗暴的下采样效果好。
yolov5网络结构
yolov4和5是用的cspdarknet,darknet类似于残差网络,darknet的残差块与csp结合后,就是下图的CSP1_x和CSP2_x模块,就是加了一个路径更长的残差,理解了这个cspDarknet就比较容易看懂了。
结合代码来分析下,yolov5源码model下面有各个模型(x l m s)的配置文件,不同模型的大小是通过控制cspBottleneck内卷积块的重复次数(depth)和通道数量来控制的,因此这几个模型唯一不同的就是这两个缩放因子
# parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors默认预设,Yolov5每次训练时,会自适应的计算不同训练集中的最佳锚框值,也可关闭该自适应功能
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 backbone
backbone:
# [from, number, module, args]
#form:输入 -1表示接上层输出
#number:重复次数,主要说明BottleneckCSP卷积快数量,实际数量还需再乘depth_multiple
#modulue:模块名 #args:参数
[[-1, 1, Focus, [64, 3]], # 0-P1/2 #模块/下采样,focus完成了一次下采样
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, BottleneckCSP, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, BottleneckCSP, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, BottleneckCSP, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, BottleneckCSP, [1024, False]], # 9
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, BottleneckCSP, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, BottleneckCSP, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, BottleneckCSP, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, BottleneckCSP, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
yolo Loss
DOU loss
比较传统的bbox损失,如ssd或yolo早期版本使用L1或L2损失,或者两者结合的smooth L1 Loss。yolov4开始使用IOU loss衡量预测框和GT框的差距。L = 1 - IOU
IOU的一个问题是当两个框没有重合区域时,IOU永远是0,因此无法衡量两个框离得到底多远多近,这样也没有梯度。因此提出了改进的DIOU,yolov5的边框损失是L = 1- DIOU
其中,b , bgt分别代表了预测框和真实框的中心点,且 ρ 代表的是计算两个中心点间的欧式距离。c 代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
yolov3 loss
bbox使用L2,是否是目标使用BCE(仅计算有目标的anchor),类别使用L2
yolov5 loss
objectness score的损失BCEWithLogitsLoss
class probability score的损失BCEWithLogitsLoss
bounding box的损失1-CIOU
参考博客:yolov5学习总结
nms相关
nms
NMS算法的大致思想:对于有重叠的候选框:若大于规定阈值(某一提前设定的置信度)则删除,低于阈值的保留。对于无重叠的候选框:都保留。
所谓非极大值抑制:先假设有6个输出的矩形框(即proposal_clip_box),根据分类器类别分类概率做排序,从小到大分别属于车辆的概率(scores)分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
soft nms
普通的nms有两个问题,一方面有很多重合度较高的两个框,实际上确实是两个目标,却错误的被删除了,另一方面,由于情况的复杂性,阈值不好设定。
soft NMS思路:不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。
算法的大致思路为:M为当前得分最高框,bi 为待处理框,bi 和M的IOU越大,bi 的得分si 就下降的越厉害。下降的方式包括线性衰减和高斯衰减。
普通的nms:
线性衰减的soft nms:
高斯加权:
nms的IOU
普通的IOU是计算交并比,上文讲了DIOU(考虑非重合情况下的距离,回归时使用),此外还有CIOU,在DIOU基础上,进一步考虑了框的长宽比的相似性。yolov4使用了CIOU loss
由于CIOU的因子V涉及列GT信息,因此在推理时无法在nms中使用,yolov4推理使用了DIOU nms,v5使用了混合方式。
centerNet
anchor free检测算法,Objects as Points 2019CVPR,和openpose原理有点相似,都是利用关键点检测,来实现目标检测。损失函数分为三个部分,中心点/目标尺寸/偏置,论文中所使用的backbone都有三个head layer,分别产生[1,80,128,128]、[1,2,128,128]、[1,2,128,128],也就是每个坐标点产生C+4个数据(即关键点类别C, 中心偏移量的x,y,尺寸的w,h)
中心偏移使用L1 loss,尺寸回归使用L2 loss,热图类别损失(有C个heat map,相当于多个二分类)使用facol loss
anchor三个缺点
1.正负样本不均衡,背景多,大量简单负样本
2.超参难调,anchor数量尺寸比例等
3.匹配耗时严重,每个anchor要与所有的gt进行iiu匹配
centernet没有anchor,直接预测中心点位置,不存在匹配,以及正负样本筛选
每个目标仅选择一个中心点作为正阳本,在关键点热图上选择一个峰值,没有nms
专注关键点检测,可以使用更大的特征图,下采样为4,无需大小不同的特征图,不用fpn什么的,只在一个特征图上回归就行
目标检测的loss
focal loss
解决目标检测中的正负样本不均衡以及较多容易样本影响loss的问题
alfa是不同类别权重,gamma是难负样本参数
既然有了出发点,那么就要找one-stage detector的准确率不如two-stage detector的原因,作者认为原因是:样本的类别不均衡导致的。我们知道在object detection领域,一张图像可能生成成千上万的candidate locations,但是其中只有很少一部分是包含object的,这就带来了类别不均衡。那么类别不均衡会带来什么后果呢?引用原文讲的两个后果:
(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal;
(2) en masse, the easy negatives can overwhelm training and lead to degenerate models.
什么意思呢?负样本数量太大,占总的loss的大部分,而且多是容易分类的,因此使得模型的优化方向并不是我们所希望的那样。其实先前也有一些算法来处理类别不均衡的问题,比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句话概括:In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples。OHEM算法虽然增加了错分类样本的权重,但是OHEM算法忽略了容易分类的样本。
版权声明:本文为CSDN博主「henyaoyuancc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/henyaoyuancc/article/details/121771233
暂无评论