从YoLov3到Scaled-YoLov4
参考视频:
Pytorch 搭建自己的YoloV4目标检测平台
yolo系列理论合集
YOLOv4-理论
YoLov4和Scaled-YoLov4代码github:
Pytorch YoLoV4 and Scaled-YoLoV4
YOLOv3:
-
Backbone:DarkNet53
取消了pooling层,改用卷积核步长进行降采样(可解释深度没有ResNet深,但效果却更好) -
利用多尺度特征进行目标检测(采用SSD中anchor的思想)
-
类别损失采用logistic代替softmax
即采用二值交叉熵损失,每张图预测的类别概率是独立的,而softmax得到的类别概率和为1
- 训练时用multi-scale方法做数据增强
YOLOv4:
-
Backbone:CSP-DarkNet53
·CSP:CSPNet可以减少计算量,同时提高推理速度和准确性。
上图红色框与YoLov3对应,以第二个残差块为例,可以看到卷积核参数量减少了:
-
SPP:实现不同尺度的特征融合(YoloV3-SPP版本因为这个结构,比yolov3精度mAP提升了3个点,经实验,这个结构使用一次就够了)。
-
PANet:coco2017挑战赛中实例分割任务第一名,物体检测第二名。
·思想:一般来说高层的特征语义信息丰富,低层的定位信息丰富,PANet在FPN的基础上,再添加一个自底向上的金字塔结构,将低层的强定位特征传递上去。YOLOV3只有(a)的结构,YOLOV4添加了(b),融合了低层的定位信息,对于grid尺寸较小(13x13)情况,也可以得到比较精确的定位信息。
-
激活函数采用Mish:Mish=x × tanh(ln(1+e^x))
-
Loss:损失采用CIOU损失
YOLOv3的定位损失是L2损失,即求边界框真实值与预测值差的平方和,这里的值指的是预测得到的每个框的中心坐标x和y的偏移量,以及宽高。
YOLOv4采用的是CIOU损失:
IOU:交并比,可以用来评价输出框(predict box)和ground-truth的距离。
缺点是如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度)。同时因为loss=0,没有梯度回传,无法进行学习训练。此外IoU无法精确的反映两者的重合度大小。如下图所示,三种情况IoU都相等。
CIOU将目标与anchor之间的中心点距离(d2/c2),重叠率(IOU)、长宽比(av)都考虑了进去
-
Tricks
-
训练时可采用Mosaic或MixCut数据增强方法。Mosaic将4张图片拼接,根据论文所说其拥有一个巨大的优点是丰富检测物体的背景!且在BN计算的时候一下子会计算四张图片的数据!MixCut将图像的一部分剪切下来再粘贴到另一张图像上。
-
采用dropblock代替dropout。在dropblock论文中提到dropout(在训练时每一层随机按概率失活神经元以防止过拟合)被广泛地用作全连接层的正则化技术,但是对于卷积层,通常不太有效。因为卷积层的特征在空间上是相关的。当这些特性相互关联时,即使有dropout,有关输入的信息仍然可以发送到下一层,因此,针对卷积网络,需要一种结构形式的dropout来正则化,即按块来丢弃。
通过dropblock掉整片的区域(比如头和脚),网络就会去注重学习狗的别的部位的特征,来实现正确的分类,从而表现出更好的泛化。 -
label smoothing:也是一种正则化策略。对于分类问题,我们通常认为训练数据中标签向量的目标类别概率应为1,非目标类别概率应为0。Label smoothing将目标概率根据均匀分布做一更新[0,0,1]–>[0.01,0.01,0.98] 标签平滑后的分布就相当于往真实分布中加入了噪声,避免模型对于正确标签过于自信,使得预测正负样本的输出值差别不那么大,从而避免过拟合,提高模型的泛化能力。
-
Cosine annealing LR(余弦退火调整学习率,学习率呈余弦函数型衰减)
-
使用遗传算法进行超参数的选择。举个例子,如果我们随机选择 100 组超参数。然后使用它们训练 100 个模型。之后,我们从中选出表现最好的 10个模型。对于每个被选中的模型,都根据原始版本创建 10个超参数略有不同的变体版本。再使用这些新的超参数重新训练模型,再次选出其中表现最好的。随着我们不断迭代,我们应该可以找到超参数的最佳集合。
-
······
Scaled-YOLOv4
-
Backbone(yolov4-csp):根据文章分析,当k大于1时,CSPNet才会比DarkNet计算量更少,因此,对于YoLov4的第一个CSPDarkNet层,将其改回为原来的DarkNet层。
-
PAN & SPP:将原来的PAN也CSP化。仍然将SPP插入到第一组CSPPAN中,这一步可减少40%的计算量。
其中scpize-conv(自己起的名字) 相比于YoLov4中的convx5结构比较如下:
-
YoLoV4-tiny:
- 对于低端设备,设计模型的推理速度不仅受到计算量和模型大小的影响,更重要的是必须考虑外围硬件资源的限制。作者借鉴的是VovNet(摘自摘要:ResNet是目标检测模型最常用的backbone,DenseNet其实比ResNet提取特征能力更强,而且其参数更少,计算量FLOPs也更少,用于目标检测虽然效果好,但是速度较慢,这主要是因为DenseNet中密集连接所导致的高内存访问成本和能耗。VoVNet就是为了解决DenseNet这一问题,基于VoVNet的目标检测模型性能超越基于DenseNet的模型,速度也更快,相比ResNet也是性能更好) OSA只在最后一次性聚合前面所有的layer。这一改动将会解决DenseNet的问题,因为每个layer的输入channel数是固定的,这里可以让输出channel数和输入一致而取得最小的MAC。
-
提出一种梯度截断的思想应用在CSPOSANet中,以得到最佳的计算速度。
-
在评估低端设备的计算成本时,还必须考虑功耗,影响功耗的最大因素是内存访问成本(MAC)。通常一个卷积运算的MAC计算方法如下:
通过计算几何不等式,可以推导出Cin = Cout时的最小MAC。 -
最小化卷积输入输出通道数(CIO),经计算当kg > b/2, CSPOSANet可以获得最佳CIO。
-
YoLoV4-tiny结构(融合了CSP与OSA,输出借用了YoLoV3-tiny,激活采用leakyRelu):
- YoLoV4-large:
- YOLOv4-large is designed for cloud GPU, the main purpose is to achieve high accuracy for object detection. We designed a fully CSP-ized model YOLOv4-P5 and scaling it up to YOLOv4-P6 and YOLOv4-P7.
- 更好地预测物体大小的能力基本上取决于特征向量的感受野。在CNN的架构中,与感受野最直接相关的是stage,feature pyramid network(FPN)的架构告诉我们,更高的stage更适合预测大的物体。这里的stage感觉应该和深度的意思差不多。
- Our experiments show that YOLOv4-P6 can reach real-time performance at 30fps video when the width scaling factor is equal to 1. For YOLOv4-P7, it can reach real-time performance at 15 fps video when the width scaling factor is equal to 1.25.
- 在yolov4-P5的代码中可以看到它是从yolov4-csp继承而来:
在backbone部分,将原来的[1,2,8,8,4]CSPDarkNet53的尺寸改为[1,3,15,15,7]
在PAN部分基本不变,只不过在原来的cspize-convs中也加入了残差结构
-
Result
-
YoLov4-tiny:
此外,在不同GPU上,YoLov4-tiny的速度都很快,另外,如果在GPU RTX2080Ti上使用TensorRT FP16来跑的话,batch size为1或4的情况下,FPS可达到773或1774.
-
YoLov4-large:
此外,作者还验证了这种FPN-Like的架构是一个简单的once-for-all模型。
蓝色曲线表示在训练好的P7模型中移除P7阶段,黄色代表在训练好的P7模型中移除P7和P6阶段。可以看到,可以发现YOLOv4-P7在高分辨率下的AP最好,而YOLOv4-P7\P7和YOLOv4-P7\P7\P6在中、低分辨率下的AP最好。这意味着我们可以使用FPN-like模型的子网络来很好地执行目标检测任务。
最后再附一张结果图
目前研一小白,第一次发博,紧紧张张,如有问题,欢迎交流。