赞
踩
睿智的目标检测66——Pytorch搭建YoloV8目标检测平台
CV 经典主干网络 (Backbone) 系列: Darknet-53
CV 经典主干网络 (Backbone) 系列: CSPNet
Github官方源码
https://github.com/ultralytics/ultralytics
Documents官方说明
数据增强方面和 yolo v5 差距不大,只不过引入了yolo x中提出的最后 10 个 epoch 关闭 Mosaic 的操作。假设训练 epoch 是 500,其示意图如下所示:
思想框架
特征提取-特征加强-预测先验框对应的物体情况。
改进部分
1、主干部分:与此前的YoloV5系列差距不大,不过相比之前第一次卷积的卷积核缩小了,是3而不是6。另外CSP模块的预处理从三次卷积换成了两次卷积,具体的实现方式是第一次卷积的通道数扩充为原来的两倍,然后将卷积结果在通道上对半分割。另外借鉴了YoloV7的多堆叠结构。
2、加强特征提取部分:不再对主干网络获得的特征层进行卷积(目的估计是加快速度),另外CSP模块的预处理从三次卷积换成了两次卷积,实现方式与主干网络一样。
3、预测头:加入了DFL模块,DFL模块简单理解就是以概率的方式获得回归值,比如我们当前设置DFL的长度为8,那么某个回归值的计算方式为:
4、自适应多正样本匹配:在YoloV8中,参考YoloX使用了无anchors的实现,是一个无锚点算法,面对长宽不规则的目标比较有优势;在计算损失进行正样本匹配时,正样本需要满足两个条件:一是在真实框内、二是真实框topk最符合要求的正样本(预测框与真实框重合度高且种类预测准确)。
对比参考1中的源码看,效果更佳。
(640, 640, 3)-->(80,80,256)--> (40,40,512)-->(20,20,1024 * deep_mul)
1. 颈部结构
(1)说明
yolo v5最初使用了Focus结构来初步提取特征,在改进后使用了大卷积核的卷积来初步提取特征,速度不快。
yolo v7则使用了三次卷积来初步提取特征,速度不快。
yolo v8则使用普通的步长为2的3x3卷积核来初步提取特征(损失感受野,但提速了,估计是感受野够了)。
(2)内部执行细节
颈部结构使用普通的步长为2的3*3卷积。(640,640,3)-->(320,320,64),后面的卷积核参数均为步长2尺寸3*3。(320,320,64)-->(160,160,128)-->(80,80,256)-->(40,40,512)-->(20,20,1024*deep_mul)
Wout = (W+2P–K)/S+1
W+2P:原图+补丁总长度;K:卷积核所占尺寸;S:步长。
这里的Wout计算结果为小数,向上取整,因为用到的是same原则自动padding。
(3)具体模块
2. CSP模块
(1)说明
CSP模块的预处理从三次卷积换成了两次卷积,并且借鉴了YoloV7的多堆叠结构。具体的实现方式是第一次卷积的通道数扩充为原来的两倍,然后将卷积结果在通道上对半分割,这样可以减少一次卷积的次数,加快网络的速度。
(2)内部细节
经过卷积1*1,步长1后,对半劈开,以第一个CSP模块举例(160,160,128)-->(160,160,256)-->a1(160, 160, 128), a2(160,160,128),
a2经过Bottleneck形成a3(160,160,128), a3经过Bottleneck形成a4(160,160,128)。将a1,a2,a3,a4cat到一起,再经卷积1*1步长1形成A(160,160,128)。
(3)具体模块
Bottleneck内部是两个步长1的3*3卷积,并且设置了残差连接。
- class Bottleneck(nn.Module):
- # 标准瓶颈结构,残差结构
- # c1为输入通道数,c2为输出通道数
- def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):
- super().__init__()
- c_ = int(c2 * e) # hidden channels
- self.cv1 = Conv(c1, c_, k[0], 1)
- self.cv2 = Conv(c_, c2, k[1], 1, g=g)
- self.add = shortcut and c1 == c2
-
- def forward(self, x):
- return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
3.激活函数
使用了SiLU激活函数,SiLU是Sigmoid和ReLU的改进版。SiLU具备无上界有下界、平滑、非单调的特性。SiLU在深层模型上的效果优于 ReLU。可以看做是平滑的ReLU激活函数。
f(x)=x⋅sigmoid(x)
总结:本质是1*1卷积,3*3卷积与残差连接的递进组合,1*1卷积负责维度对齐,3*3卷积多用于降采样。同时,借鉴CSP的维度加深策略。
(80,80,256), (40,40,512), (20,20,1024 * deep_mul)-->(80,80,256), (40,40,512), (20,20,1024 * deep_mul)
FPN的模块和Backbone结构原理一致,经过特征上采样和下采样的融合,三个特征层的shape分别为feat1=(80,80,256)、feat2=(40,40,512)、feat3=(20,20,1024 * deep_mul)。deep_mul只是个系数,对深层的通道进行缩放,在yolo v8中应该是为了平衡计算量做的考虑。
总结
借鉴PANet的思想做特征增强(SSD是最早使用特征金字塔结构表示多尺度特征信息的方法之一,FPN依赖于自上而下的特征金字塔结构,在此基础上,PANet提出一种额外的自下而上的路径)。
(80,80,256), (40,40,512), (20,20,1024 * deep_mul)-->(4, 8400), (80, 8400), ((144, 80, 80), (144, 40, 40), (144, 20, 20)), (2, 8400), (1, 8400)
(4, 8400): yolo v8解耦头是分开的,分类和回归不在一个3*3卷积里实现。回归值相关的预测头的通道数与DFL的长度有关,在yolo v8中,DFL的长度均设为16。回归值相关的预测头的通道数均为16 × 4 = 64,三个特征层的shape为(20,20,64),(40,40,64),(80,80,64)。64可以分为四个16,用于计算四个回归系数。计算完回归系数后,三个特征层的shape为(20,20,4),(40,40,4),(80,80,4)。8400 = 80*80+ 40*40+ 20*20
(80, 8400): 种类相关的预测头的通道数和需要区分的种类个数相关。
((144, 80, 80), (144, 40, 40), (144, 20, 20)): 144 = 80 + 64
(2, 8400): x0,y0 (80*80, 1), (40*40, 1), (20, 20, 1); x1,y1 (80*80, 1), (40*40, 1), (20, 20, 1);以0.5为间隔的坐标值,将坐标值张量cat到一起就是(2, 8400)。
比如:
[[ 0.5000, 0.5000],
[ 1.5000, 0.5000],
[ 2.5000, 0.5000],
...,
[77.5000, 79.5000],
[78.5000, 79.5000],
[79.5000, 79.5000]]]
(1, 8400): (80*80, 1), (40*40, 1), (20, 20, 1);每个张量内的像素是放缩的倍数,分别为8, 16, 32,将三个张量cat到一起就是(1, 8400)。
总结
将同一特征层分别通过3*3卷积解耦,分别对应回归特征和分类特征。
得分筛选&非极大值抑制
(8400, 84) -->(10, 6)代表10个物体,4个坐标,1个置信度,1个物体类别。
得分筛选就是筛选出得分满足confidence置信度的预测框。
非极大抑制就是筛选出一定区域内属于同一种类得分最大的框。
正样本匹配(找特征点对应的框,并负责这个框的预测。)
(a)根据空间距离判断特征点是否在预测框内。
利用特征点坐标减去真实框左上角,利用真实框右下角减去特征点坐标,如果这几个值全都大于0则特征点在真实框内部。
(b)根据代价函数判断特征点是否在真实框的topk内。
a)每个真实框和当前特征点预测框的重合程度;
b)每个真实框和当前特征点预测框的种类预测准确度;
(c)去重等后处理。
可能存在一个特征点预测多个真实框的情况,需要根据重合程度做筛选。
增加小目标检测层:yolov8_v7_v5
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。