【目标检测学习笔记】yolov3架构
yolov3
主要改进:
1、多尺度检测:
YOLOv1 本质上更偏单尺度输出,小目标不太占优势;YOLOv3 改成了 3 个尺度同时预测,并且明确说借鉴了 FPN(特征金字塔) 的思路。这样高层特征负责大目标,浅层细粒度特征帮助检测小目标,所以它对小目标的能力比前面版本明显更强。
为了能够预测多尺度的目标,YOLOv3 选择了三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors。在COCO数据集上选择的9种Anchors的尺寸如下图红色框所示:

借鉴特征金字塔网的思想,YOLOv3设计了3种不同尺度的网络输出Y1、Y2、Y3,目的是预测不同尺度的目标。由于在每一个尺度网格都负责预测3个边界框,且COCO数据集有80个类。所以网络输出的张量应该是:N ×N ×[3∗(4 + 1 + 80)]。由下采样次数不同,得到的N不同,最终Y1、Y2、Y3的shape分别为:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]。
2、骨干网络更强:
YOLOv3 不再用 YOLOv2 的 Darknet-19,而是换成了 Darknet-53。这个新骨干有 53 层卷积,还加入了 shortcut / residual 连接,因此特征提取能力更强,同时速度仍然不错。论文里直接给出对比:Darknet-53 在分类精度上接近甚至优于一些更重的骨干,同时推理效率也很高。
文中给出的网络架构如下:

Darknet-53主要由1×1和3×3的卷积层组成,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU,加入这两个部分的目的是为了防止过拟合。卷积层、批量归一化层以及Leaky ReLU共同组成Darknet-53中的基本卷积单元DBL。因为在Darknet-53中共包含53个这样的DBL,所以称其为Darknet-53。
为了更加清晰地了解darknet-53的网络结构,可以看下面这张图:

下面是图中的一些主要单元:
1、DBL: 一个卷积层、一个批量归一化层和一个Leaky ReLU组成的基本卷积单元。
2、res unit: 输入通过两个DBL后,再与原输入进行add;这是一种常规的残差单元。残差单元的目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
简单的res_unit实现:
class ResUnit(nn.Module):
def __init__(self, in_channels):
super(ResUnit, self).__init__()
self.dbl1 = DBL(in_channels, in_channels // 2, 1)
self.dbl2 = DBL(in_channels // 2, in_channels, 3, padding=1)
def forward(self, x):
residual = x
x = self.dbl1(x)
x = self.dbl2(x)
x = x + residual
return x
残差学习和残差连接:

3、resn: 其中的n表示n个res unit;所以 resn = Zero Padding(零填充,目的是为了在卷积操作中保持原特征图的尺寸) + DBL + n × res unit 。
4、concat: 将darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的。这与残差层的add操作是不一样的,拼接会扩充张量的维度,而add直接相加不会导致张量维度的改变。
5、Y1、Y2、Y3: 分别表示YOLOv3三种尺度的输出。
与darknet-19对比可知,darknet-53主要做了如下改进:
1、没有采用最大池化层,转而采用步长为2的卷积层进行下采样。
下采样:
下采样是把特征图“缩小一圈”,让后面的计算量减少,同时让网络逐渐看到更大范围的区域。
核心效果:
降低空间分辨率;减少计算量;扩大感受野;让特征逐渐变得更抽象。
2、为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。
3、引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
4、将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。
3、多标签分类:
YOLOv3在类别预测方面将YOLOv2的单标签分类改进为多标签分类,在网络结构中将YOLOv2中用于分类的softmax层修改为逻辑分类器。在YOLOv2中,算法认定一个目标只从属于一个类别,根据网络输出类别的得分最大值,将其归为某一类。然而在一些复杂的场景中,单一目标可能从属于多个类别。
比如在一个交通场景中,某目标的种类既属于汽车也属于卡车,如果用softmax进行分类,softmax会假设这个目标只属于一个类别,这个目标只会被认定为汽车或卡车,这种分类方法就称为单标签分类。如果网络输出认定这个目标既是汽车也是卡车,这就被称为多标签分类。
为实现多标签分类就需要用逻辑分类器来对每个类别都进行二分类。逻辑分类器主要用到了sigmoid函数,它可以把输出约束在0到1,如果某一特征图的输出经过该函数处理后的值大于设定阈值,那么就认定该目标框所对应的目标属于该类。
总的来说,yolov3=更深的骨干网路(Darknet-53)+三尺度检测(更强小目标)+更灵活的分类方式(多标签逻辑分类)。
继续跑实验
前几天的实验只是来测试当前环境是否适配yolov8.
我在autodl上租用了一台服务器进行进一步的实验。
在终端输入:
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=50 imgsz=640 device=0 amp=False
这句话说明:
1、我要用yolo进行目标检测;
2、采用的数据集为coco128;
3、使用的模型为yolov8v.pt(用官方预训练好的YOLOv8 nano模型来训练);
4、训练轮数为50轮;
5、输入图片在训练时会被缩放/填充到大约640*640
这会影响精度(尺寸大一些,细节更多,可能更准)和速度和显存(尺寸越大)
6、用第一张GPU进行训练
7、不启动自动混合精度。
结果:
1、result.png:
mAP50:
当预测框和真实框的 IOU ≥ 0.5 时,就算检测正确,然后在这个标准下计算出来的平均精度。
mAP50-95:
在 IOU = 0.50, 0.55, 0.60, …, 0.95 这 10 个更严格的标准下,分别计算 AP,再取平均。
从此图中可以看出,训练损失和验证损失均在下降(没有出现之前的训练损失下降到验证损失上升,即过拟合的情况),这说明这次数据集规模和训练设置更加合理,模型泛化是健康的。
而且精度和召回率整体也在上升,这说明模型变得更准,也更能找全目标。
map50和map50-95都持续上升,后期进入平台,这说明:1、模型已经学到了足够的检测能力。2、继续训练收益已经不大。
综上,训练过程中,train/box_loss、train/cls_loss 和 train/dfl_loss 均持续下降,表明模型在训练集上稳定收敛。与此同时,验证集对应损失同样逐步下降,说明模型在泛化能力上也同步提升,未出现明显过拟合现象。Precision、Recall、mAP50 和 mAP50-95 均呈现稳步上升趋势,并在后期逐渐进入平台期,表明当前训练设置较为合理,模型已基本收敛,可作为后续实验的基线模型。
2、混淆矩阵

这是归一化混淆矩阵,从此混淆矩阵中可以看出,大多数类别都被正确预测到了自己的类别,整体的分类性能不错。
当然,还存在一定的漏检和误检现象,但不算特别严重,属于合理范围。
综上,从混淆矩阵来看,模型预测结果主要集中在对角线上,说明大部分类别能够被正确识别,整体分类区分能力较强。非对角线元素相对较少,表明类别间严重混淆现象并不明显。与此同时,背景相关位置仍存在少量响应,说明模型仍有一定误检和漏检,但总体处于合理范围内。综合来看,当前模型已经具备较好的多类别检测能力,可作为后续对比实验的基线模型。
这次的实验结果将别我作为后续实验的baseline。
用yolov8s代替yolov8n跑实验
yolo detect train data=coco128.yaml model=yolov8s.pt epochs=50 imgsz=640 device=0 amp=False name=exp_yolov8s_640_50
跑出的结果如下:
结果图:

混淆矩阵:

result.csv:

从中可以看出,基于 coco128 数据集,对 yolov8s 模型进行了 50 个 epoch 的训练。实验结果表明,模型在训练过程中表现出良好的收敛性:train/box_loss、train/cls_loss 和 train/dfl_loss 均随 epoch 增加而持续下降,同时 val/box_loss、val/cls_loss 和 val/dfl_loss 也同步下降,说明模型在训练集与验证集上均获得了稳定优化,未观察到明显的过拟合现象。最终在验证集上取得 Precision=0.90203、Recall=0.86375、mAP50=0.91728、mAP50-95=0.77682 的性能。
进一步结合混淆矩阵可见,预测结果主要集中在对角线上,类别间混淆现象较少,表明模型具有较好的类别区分能力。与 yolov8n baseline 相比,yolov8s 在各项指标上均有显著提升,尤其是 mAP50-95 的提升更为突出,说明增大模型规模能够有效提升检测精度和定位质量。
和前面的定量对比:
首先是指标的对比:

从图中可以看到,yolov8s全面优于yolov8n,map50-95的提升尤为明显,提升了0.10566,这说明它不只是“检测到了”,而且定位更准了。
而后是损失函数的对比:

从表中可以看到,train loss和val loss也更低。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)