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也更低。

Logo

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

更多推荐