写在前面:本来是一期的,我看了太多内容了,于是分成三期发吧 TAT (捂脸)
You Only Look Once: Unified, Real-Time Object Detection
2015 ieee computer society 12.3 CCF-C
摘要:
YOLO(You Only Look Once)是一种新颖的物体检测方法,它通过将物体检测问题转化为回归问题,直接预测空间分离的边界框和相关的类别概率。这种方法由华盛顿大学、艾伦研究所AI和Facebook AI研究部门共同提出。YOLO具有实时性能,其基本模型可以在45帧/秒的速度下处理图像,而其快速版本甚至可以处理高达155帧/秒的图像,同时保持其他实时检测器的两倍以上的mAP。YOLO的网络架构受到GoogLeNet图像分类模型的启发,但使用1x1的卷积层来替代Inception模块。YOLO的主要优点是速度快,因为它只需要一次前向传播就能完成所有对象的检测。此外,由于它在一个单一的神经网络中集成了多个任务,因此它的模型大小相对较小。然而,YOLO也有一些局限性,例如它对小物体的检测效果不佳,并且对物体的形状和尺度变化敏感。
1.图像调整大小到448×448像素。
2.运行单个卷积神经网络。
3.通过模型的置信度对结果进行阈值化处理。
展示了模型的工作原理。该模型将检测过程视为回归问题。它首先将图像划分为S x S的网格,并对每个网格单元预测B个边界框、这些边界框的置信度以及C类概率。这些预测被编码为S×S×(B*5+C)张量。
为了评估PASCAL VOC上的YOLO,论文使用S = 7, B = 2。PASCAL VOC有20个标签类,所以C = 20。
模型最终的预测是一个7 × 7 × 30张量
该网络由24个卷积层和2个全连接层组成。每个卷积层都具有不同的大小和数量的二维卷积,还有一个池化层。
模型设计:输入448x448x3,输出7x7x30
loss设计:
λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj ( C i − C ^ i ) 2 + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 \begin{gathered} \begin{aligned}\lambda_{\textbf{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\text{obj}}\left[\left(x_i-\hat{x}_i\right)^2+\left(y_i-\hat{y}_i\right)^2\right]\end{aligned} \\ +\lambda_\mathbf{coord}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^\mathrm{obj}\left[\left(\sqrt{w_i}-\sqrt{\hat{w}_i}\right)^2+\left(\sqrt{h_i}-\sqrt{\hat{h}_i}\right)^2\right] \\ +\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\mathrm{obj}}\left(C_i-\hat{C}_i\right)^2 \\ +\lambda_\text{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\text{noobj }} \left ( C _ i - \hat { C }_i\right)^2 \\ +\sum_{i=0}^{S^2}\mathbb{1}_i^\mathrm{obj}\sum_{c\in\mathrm{classes}}\left(p_i(c)-\hat{p}_i(c)\right)^2 \end{gathered} λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]+λcoordi=0∑S2j=0∑B1ijobj[(wi−w^i)2+(hi−h^i)2]+i=0∑S2j=0∑B1ijobj(Ci−C^i)2+λnoobji=0∑S2j=0∑B1ijnoobj (Ci−C^i)2+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
我们一步一步分解一下loss函数
S x S 是网格数量,B是每个网格边界框数量,C是这些边界框的类别数量。
S = 7, B = 2,C = 20
x,y,h,w:表示中心位置和长宽
1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj判断第i个网格中第j个bbox是否负责这个object:与object的ground truth box的IOU最大的bbox负责该object
λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \begin{aligned}\lambda_{\textbf{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\text{obj}}\left[\left(x_i-\hat{x}_i\right)^2+\left(y_i-\hat{y}_i\right)^2\right]\end{aligned} +\lambda_\mathbf{coord}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^\mathrm{obj}\left[\left(\sqrt{w_i}-\sqrt{\hat{w}_i}\right)^2+\left(\sqrt{h_i}-\sqrt{\hat{h}_i}\right)^2\right] λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]+λcoordi=0∑S2j=0∑B1ijobj[(wi−w^i)2+(hi−h^i)2]
含有object的bbox的Confidence预测
∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 \sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\mathrm{obj}}\left(C_i-\hat{C}_i\right)^2 i=0∑S2j=0∑B1ijobj(Ci−C^i)2
不含有object的bbox的Confidence预测
λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj ( C i − C ^ i ) 2 \lambda_\text{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\text{noobj }} \left ( C _ i - \hat { C }_i\right)^2 λnoobji=0∑S2j=0∑B1ijnoobj (Ci−C^i)2
类别预测, 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj判断是否有object的中心落在网格i中:网格中包含有object的中心,就负责预测该object的类别概率
∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 \sum_{i=0}^{S^2}\mathbb{1}_i^\mathrm{obj}\sum_{c\in\mathrm{classes}}\left(p_i(c)-\hat{p}_i(c)\right)^2 i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
IOU是什么?
Intersection over Union(IoU)是一种用于评估目标检测算法性能的常见指标。它通常用于衡量算法检测的边界框(Bounding Box)与实际目标边界框之间的重叠程度。
IoU的计算方式是通过计算两个边界框的交集面积除以它们的并集面积。具体而言,IoU的公式如下:
I o U = A r e a I n t e r s e c t i o n A r e a U n i o n IoU = \frac{Area_{Intersection}}{Area_{Union}} IoU=AreaUnionAreaIntersection
其中, ( A r e a I n t e r s e c t i o n ) (Area_{Intersection}) (AreaIntersection)是两个边界框相交的面积, ( A r e a U n i o n ) (Area_{Union}) (AreaUnion)是两个边界框的并集面积。
IoU的取值范围在0到1之间,其中0表示没有重叠,1表示两个边界框完全重叠。在目标检测任务中,通常将IoU阈值设置为一个特定的值,例如0.5,来判断算法是否成功地检测到了目标。如果IoU大于等于该阈值,则认为检测是正确的,否则认为是错误的。
YOLO9000: Better, Faster, Stronger
Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017, pp. 7263-7271
摘要:
作者采用了一种创新的多尺度训练方法,使得同一个 YOLOv2 模型可以在不同尺寸上运行,提供了在速度和准确性之间的一种简单权衡。
作者尝试了使用 RCNN 的RPN结构,结果显示速度仍然更快。
为了提高 YOLO9000 模型的检测能力,作者提出了一种目标检测与分类联合训练的方法,使得 YOLO9000 能够在没有标记检测数据的情况下预测对象类别。
作者通过对边界框的中心位置使用 sigmoid 函数进行限制,以提高模型的稳定性和预测准确性。
在研究中,作者比较了不同数量的聚类先验框对模型性能的影响,结果显示增加聚类先验框的数量可以提高模型的性能。
此外,作者还提出了一个名为 WordTree 的图像分类模型,利用 WordNet 中的语义关系构建了一个层次结构,从而可以有效地组合不同数据集进行分类。
实验结果显示,在 VOC 2007 数据集上,以 67 FPS 的速度下,YOLOv2 获得了 76.8 mAP,在 40 FPS 的速度下,获得了 78.6 mAP。
对于 YOLO9000 模型,在 ImageNet 检测验证集上获得了 19.7 mAP,尽管只有 44 个类别有检测数据。在其他 156 个类别中,模型的 mAP 为 16.0。尽管 YOLO 只能检测到 200 多个类别,但它成功预测了 9000 多种不同对象类别的检测结果,同时仍然能够实时运行。
图1:YOLO9000。YOLO9000可以实时检测各种各样的对象类。
图2展示了在 VOC 和 COCO 数据集上进行的聚类盒维度的结果。使用 k-means 聚类在边界框的维度上进行操作,以获取适用于模型的良好先验。在左图中,展示了在不同 k 值下获得的平均 IOU,发现选择 k = 5 在召回率和模型复杂性之间达到了良好的平衡。
右图则展示了 VOC 和 COCO 的相对质心。两组先验都表现出更薄、更高的边界框的倾向,而 COCO 的先验在尺寸上的变化比 VOC 更为显著。
这一聚类分析提供了在不同数据集上调整先验的指导,确保模型能够更好地适应特定任务的边界框形状和大小。
图3展示了具有尺寸先验和位置预测的边界框。通过预测盒子的宽度和高度作为簇质心的偏移量,实现对边界框尺寸的预测。为了预测框的中心坐标,运用了 sigmoid 函数,将其输出值压缩到 0 和 1 之间。
sigmoid 激活函数的输出与过滤器的位置相乘,从而获得框的中心坐标的预测值。这种方法使能够更精准地定位对象,并有效地捕捉它们的形状和大小。
见图公式:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h {\begin{array}{l}\color{red}{\mathrm{b}_x=}\sigma(t_x)+c_x\\\color{red}{\mathrm{b}_y=}\sigma(t_y)+c_y\\\color{red}{\mathrm{b}_w=}p_we^{t_w}\\\color{red}{\mathrm{b}_h=}p_he^{t_h}\end{array}} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
图4:VOC 2007的精度和速度
在VOC 2007数据集上,YOLOv2模型的平均精度均值(mAP)达到了78.6%,相比于之前的YOLO模型有显著提升。同时,YOLOv2在保持高精度的同时能够实现较快的检测速度。
图5:在ImageNet和WordTree上的预测。大多数ImageNet模型使用一个大的softmax来预测概率分布。使用WordTree,我们对共下位词执行多个softmax操作。
WordTree是一个层次模型,它通过在ImageNet中的概念上构建一个层次结构来简化对象检测和分类问题。这个模型利用WordNet中的语义关系,根据视觉名词在WordNet图中的路径到根节点来构建一棵树。在训练过程中,WordTree可以用于结合多个数据集进行分类,只需将数据集中的类别映射到树中的同义词集即可。为了进行分类,我们假设图像包含一个对象:Pr(physical object) = 1。为了验证这种方法,作者使用WordTree将ImageNet和COCO的标签结合起来,训练了一个大型的检测模型。
图6:使用WordTree层次结构组合数据集。使用WordNet概念图,我们构建了一个视觉概念的层次树。然后我们可以通过将数据集中的类映射到树中的同义词集来合并数据集。这是一个简化的WordTree视图,用于说明。
YOLOv3: An Incremental Improvement
Computer Science - Computer Vision and Pattern Recognition (CVPR)2018
yolo_v3作为yolo系列最新算法,在继承前作基础上做了一些保留和优化:
采用单元格划分检测的思路,这个想法从yolo_v1一直延续,只是划分单元格的数量有所变化。
继续沿用"leaky ReLU"作为激活函数,保持了之前版本的激活方式。
保持了端到端的训练方式,使用一个loss function来搞定整个训练过程,简化了训练的复杂性,只需要专注输入和输出。
从yolo_v2开始,引入了batch normalization,将其与leaky relu层结合在每个卷积层之后,用于正则化、加速收敛和防止过拟合。
引入了多尺度训练策略,权衡速度和准确率。可以在速度和准确率之间进行取舍,追求更快的速度或更高的准确率。
DBL,左下角,也就是代码里的Darknetconv2d_BN_Leaky。简单说,就是卷积+BN+Leaky relu的组合,成了v3最基本的构件。
Resn,这个n是数字,比如res1、res2,一直到res8等等,表示在一个res_block里有多少个res_unit。这是yolo_v3里的大模块,借鉴了ResNet的残差结构。用这种结构让网络深度更深,毕竟从v2的darknet-19到v3的darknet-53,前者可是没这种残差结构的。看图1右下角,看到res_block的构造,其实基本元素还是DBL。
Concat,张量拼接的操作。把darknet中间层和后面某一层的上采样拼接在一起。拼接和残差层的add操作不一样,拼接会增加张量的维度,而add只是简单相加,不改变张量的维度。
Yolo每个版本的提升主要集中在改进主干网络上,从v2的darknet-19到v3的darknet-53。看数字就能看出模型是越做越大的趋势。
整个v3结构里,没有用到池化层和全连接层。在前向传播中,通过调整卷积核的步长(例如stride=(2, 2)),实现了张量尺寸的变化。这样的步骤相当于将图像边长缩小了一半,也就是将面积缩小到原来的四分之一。
在yolo_v2中,前向过程的张量尺寸变换通过了5次最大池化操作。而在yolo_v3中,这种变换则是通过卷积核增大步长的方式,同样也进行了5次(需要注意darknet-53最后有一个全局平均池化,但在yolo-v3中并没有考虑这一层,所以张量维度的变化只针对前面的5次)。
对于不适用池化层和全连接层的猜想:
不采用池化层的主要考虑是为了避免信息损失。池化层通过降采样降低了特征图的空间分辨率,可能导致丢失细节和空间信息,这样做有助于提高目标检测的准确性。
避免使用全连接层的原因在于参数量庞大,可能引发过拟合问题,特别是在训练数据有限的情况下。通过采用全卷积结构,可以减少模型参数数量,提高模型的泛化性。
卷积操作相对于全连接层更加灵活和计算效率更高,这有助于在减小特征图尺寸的同时有效地捕捉图像中的局部特征。通过使用卷积核增大步长的方式,实现了灵活性和计算效率的平衡。
Yolo V3的改进之一是引入了三个不同尺度的特征图,即y1、y2、y3,这体现在论文中提到的"predictions across scales"。这一设计受到了FPN(特征金字塔网络)的启发,通过多尺度对不同大小的目标进行检测,较精细的网格单元可用于探测小物体。
y1、y2、y3的深度均为255,且它们的边长遵循规律:13:26:52。对于COCO数据集的80个类别,每个盒子需要输出一个对每个类别的概率。在Yolo V3中,每个网格单元预测3个盒子,每个盒子需要有(x, y, w, h, confidence)这五个基本参数,以及80个类别的概率。这就导致了每个盒子输出255个数值,即3*(5 + 80) = 3 * 85 = 255。
Yolo V3采用上采样的方式实现多尺度的特征图。结合图1的情况,可以看到图1中的两个张量在拼接时具有相同的尺度(分别是26x26和52x52),通过使用(2, 2)的上采样来确保拼接后的张量具有相同的尺度。与SSD不同,作者并没有直接使用backbone中间层的处理结果作为特征图的输出,而是将其与后续网络层的上采样结果进行拼接,然后再进行处理,形成最终的特征图。
回想一下Yolo V2的边框预测机制:受到Faster R-CNN RPN中anchor机制的启发,但不愿手动设定anchor prior(模板框),于是采用了维度聚类的方法确定anchor box prior。在聚类中,发现选择k=5时的效果不错,因此采用了这个聚类数。然后,由于V2认为anchor机制中线性回归存在不稳定性(因为回归的偏移可以使边框移动到图像的任何位置),所以V2最终采用了自己的方法:直接预测相对位置,即预测边框中心点相对于网格单元左上角的相对坐标。
Yolo V2直接通过预测tx、ty、tw、th、to来确定边框的位置、大小和置信度,无需像RPN中的anchor机制那样遍历每个像素。从下图公式可见,边框的位置、大小和置信度都可通过tx、ty、tw、th、to计算得出。V2以相当直接的方式预测了边框的这些属性。
对于Yolo V3,关于先验框(prior)的处理有明确的解释:选择的先验框数量k为9,对于Tiny Yolo而言,k为6。这些先验框都是在数据集上通过聚类得到的,具体数值如下:
10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
这些先验框(也称为模板框)由两个数字组成,但是一个代表高度,另一个代表宽度。
(注意:9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。每个输出y在每个自己的网格都只会输出3个预测框)
pw和ph就是先验框的宽高,通过下图式子进行转化为bw和bh。
图2:具有维度先验和位置预测的边界框。我们将长方体的宽度和高度预测为与簇质心的偏移。我们使用sigmoid函数来预测框相对于过滤器应用程序位置的中心坐标。(我回头看了下v2,好家伙v2和v3图是一样的)
在Yolo V3中,每次对边框进行预测时,输出与V2相同,都是tx、ty、tw、th、to,然后通过公式1计算出绝对的(x, y, w, h, c)。
在边框预测的过程中,V3采用了logistic regression(逻辑回归)来处理0或1的问题。
逻辑回归用于对锚框周围的区域进行目标性评分(objectness score),即判断这个位置是否有可能包含目标。这一步在进行预测之前执行,它可以帮助过滤掉不太可能包含目标的锚框,从而减少计算量。也就是说如果某个模板框不是最佳的,即使其目标性评分(objectness score)超过我们设定的阈值,我们也不会对其进行预测。
与Faster R-CNN不同,Yolo V3只会操作一个prior,即最佳prior。而逻辑回归用于从9个anchor priors中找到具有最高目标存在可能性得分的那个。逻辑回归通过曲线对prior相对于目标性评分的映射关系进行了线性建模。
loss function:
xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[...,2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \
(1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5],
from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)
xy_loss = K.sum(xy_loss) / mf
wh_loss = K.sum(wh_loss) / mf
confidence_loss = K.sum(confidence_loss) / mf
class_loss = K.sum(class_loss) / mf
loss += xy_loss + wh_loss + confidence_loss + class_loss
以上是一段keras框架描述的yolo v3 的loss_function代码。可以从上述代码看出:除了w, h的损失函数依然采用总方误差之外,其他部分的损失函数用的是二值交叉熵。最后加到一起。
YOLO的不同版本(v1、v2、v3等)代表了算法在不同时间点的演进。以下是YOLO版本之间的一些主要区别:
YOLOv1(YOLO):
YOLOv2(YOLO9000):
YOLOv3:
参考资料:https://blog.csdn.net/leviopku/article/details/82660381
YOLOv4: Optimal Speed and Accuracy of Object Detection
2020年4月,YOLOv4在悄无声息中发布,引起了目标检测领域的广泛关注。在YOLO系列的原作者Joseph Redmon宣布退出CV领域后,表明官方不再更新YOLOv3。然而,在过去的两年中,AlexeyAB继承了YOLO系列的思想和理念,对YOLOv3进行不断改进和开发,并于今年4月发布了YOLOv4,获得了原作者Joseph Redmon的认可。
YOLOv4能够使用传统GPU进行快速准确的训练和测试,实现实时、高精度的目标检测。在与其他最先进目标检测器的比较中,YOLOv4在性能相当的情况下,推理速度比EfficientDet快两倍。相较于YOLOv3,YOLOv4的AP和FPS分别提高了10%和12%。YOLOv4的主要贡献可以总结如下:
提出了一种实时、高精度的目标检测模型,可使用通用GPU(如1080Ti或2080Ti)进行快速准确的训练。
在检测器训练阶段,验证了一些最先进的Bag-of-Freebies和Bag-of-Specials方法的效果。
对SOTA方法进行改进,使其更加高效,更适合单GPU训练,包括CBN、PAN和SAM等。
参考资料:https://zhuanlan.zhihu.com/p/342570549
“Bag of Freebies”(Freebies的袋子)是一个在深度学习领域中用来描述一系列无代价或低代价的技术和方法的术语。这些技术和方法的目的是提高深度神经网络的性能、稳定性和泛化能力,而不会显著增加训练成本或复杂性。
这个术语通常与另一个术语 “Bag of Tricks”(Tricks的袋子)一起使用,它们一起描述了一系列用于改善深度学习模型的技巧和策略。
“Bag of Freebies” 可能包括以下一些常见的技术:
数据增强:通过对训练数据进行变换,增加模型的鲁棒性。
学习率调度:动态调整学习率,以提高训练的稳定性和效果。
权重初始化:使用更有效的权重初始化策略,以加速模型的收敛。
Batch Normalization:在每个小批量数据上进行归一化,有助于加速训练。
这些技术通常被称为 “Freebies”,因为它们是相对低成本的、容易实施的方法,可以在训练过程中“免费”地提高模型的性能。在深度学习社区中,研究人员和从业者经常分享和讨论这些方法,以帮助改进模型的训练和表现。
“Bag of Specials”(Specials的袋子)是深度学习领域中的一个术语,通常与 “Bag of Freebies” 一起使用,用来描述一系列相对于“Freebies”而言代价较高或复杂的技术和方法。这些特殊的技术和方法可能在一定程度上提高模型的性能,但通常需要更多的计算资源、时间或专业知识。
这些技术通常被称为 “Specials”,因为它们相对于 “Freebies” 更为复杂、需要更多的专业知识,或者对计算资源的要求更高。在实践中,选择使用 “Freebies” 还是 “Specials” 取决于具体的问题、数据和可用资源。
通常目标检测器都接收一张图像作为输入,并通过卷积神经网络的主干将特征压缩。在图像分类中,这些主干网络就是网络的末端,可以在其基础上进行预测。
在目标检测中,需要在图像周围绘制多个边界框,并进行分类,因此需要将卷积主干的特征层进行特征融合,这一过程发生在网络的颈部部分。
目标检测可以分为两类:一阶段检测和二阶段检测。检测过程通常在网络的"head"层。
二阶段检测将目标定位和每个边界框的分类任务解耦。
一阶段检测同时对目标的定位和分类进行预测。
YOLO是一种一阶段检测器,因此称为"You Only Look Once"。
目标检测器的主干网络通常在ImageNet分类任务上进行预训练。
预训练意味着网络的权重已经被调整以识别图像中的相关特征。
在目标检测的新任务中模型将会被微调。
作者考虑了以下主干网络用于YOLOv4目标检测器。
CSPResNext50
CSPDarknet53
EfficientNet-B3
CSPResNext50和CSPDarknet53都基于DenseNet。DenseNet的设计旨在通过以下动机连接卷积神经网络中的层:缓解梯度消失问题(在非常深的网络中通过反向传播损失信号是困难的)、增强特征传播、鼓励网络重复使用特征以及减少网络参数的数量。
CSPResNext50和CSPDarknet53的思想是消除DenseNet中的计算瓶颈。在CSPResNext50和CSPDarknet53中,对DenseNet进行了修改,通过复制并发送一个副本,直接发送另一个副本到下一阶段来分离层的特征图。
EfficientNet是由Google Brain设计的,主要用于研究卷积神经网络的缩放问题。在扩展ConvNet时,有许多决策可以进行,包括输入大小、宽度缩放、深度缩放以及对上述所有因素进行缩放。EfficientNet论文认为在所有这些因素中都存在一个最优点,并通过搜索找到这个点。
EfficientNet在图像分类方面优于其他同等规模的网络。然而,YOLOv4的作者认为,其他网络在目标检测环境中可能工作得更好,并决定对所有网络进行实验。
基于他们的直觉和实验结果(又称大量实验结果),最终的YOLOv4网络实现了CSPDaknet53作为骨干网络。
目标检测的下一步是混合和组合ConvNet主干中形成的特征,为检测步骤做准备。YOLOv4考虑了几种颈部组件:
FPN (Feature Pyramid Network): 特征金字塔网络,旨在解决目标检测任务中不同尺度目标的问题,通过构建多尺度的特征金字塔来提高检测性能。
PAN (Path Aggregation Network): 路径聚合网络,用于改善特征传播和整合,特别是在处理不同尺度特征图时。
NAS-FPN (Neural Architecture Search - FPN): 神经结构搜索 - 特征金字塔网络,通过神经网络结构搜索方法来自动搜索和优化特征金字塔网络的结构。
BiFPN (Bi-directional Feature Pyramid Network): 双向特征金字塔网络,是一种改进的特征金字塔网络,旨在更好地处理不同尺度的特征。
ASFF (Adaptive Spatial Feature Fusion): 自适应空间特征融合,用于目标检测中的特征融合,通过自适应地融合不同尺度和分辨率的特征。
SFAM (Selective Feature Aggregation Module): 选择性特征聚合模块,是一种用于自动选择和聚合具有信息丰富性的特征的模块,通常用于图像分类任务中。
颈部的组件通常在层之间上下流动,并且仅连接卷积网络末端的少数层。
YOLOv4选择PAN作为网络的特征聚合。他们没有写太多关于这一决定的理由。
YOLOv4部署与YOLOv3相同的YOLO HEAD检测层,都是具有基于锚的检测步骤和三个级别的检测粒度的检测。这里就不细说了。
YOLOv4采用了一种被称为"Bag of Freebies"的方法。
大多数"Bag of Freebies"都涉及数据增强。
作者对YOLOv4中数据增强的具体细节进行了深入探讨。在此总结这些技术。
其中许多策略已经为计算机视觉社区所知,YOLOv4只是在验证它们的有效性。新的贡献是 mosaic数据增强,它将四个图像拼接在一起,教会模型找到更小的对象,而不太关注对象周围的周围场景。
作者在数据扩充方面做出的另一个独特贡献是自我对抗训练(SAT)。SAT的目标是找到网络在训练过程中最依赖的图像部分,然后编辑图像以掩盖这种依赖,迫使网络推广到有助于检测的新特征。
YOLOv4的作者提供了一项消融研究,证明他们使用的数据增强是合理的。
另一个贡献是CIoU loss函数。YOLOv4的作者使用CIoU损失,它与预测边界框与实际边界框的重叠方式有关。基本上,仅仅查看重叠是不够的,因为在没有重叠的情况下,还想看一下预测框与实际框的距离有多近,并鼓励网络将预测框拉得更接近实际框。当然这涉及到很多数学工程。
YOLOv4还采用了一种被称为"Bag of Specials"的策略,它们在推理时间上只添加了边际的增加,但在性能上有显著提升。
作者尝试了各种激活函数。激活函数在信息通过网络时对特征进行转换。对于传统的激活函数,如ReLU,很难使网络将特征的创建推向最佳点。
Mish激活函数。
作者使用DIoU NMS(Distance Intersection over Union Non-Maximum Suppression)来分离预测的边界框。在目标检测任务中,网络有时会预测多个边界框,涉及同一个物体。
DIoU NMS是对传统IoU NMS的改进,IoU(Intersection over Union)用于度量两个边界框之间的重叠程度。DIoU引入了边界框中心点的距离,考虑了预测边界框和真实边界框之间的距离,从而更全面地评估边界框的匹配质量。
使用YOLOv3,它需要一些更好的NMS
YOLOv4中这不能同时是两种吉普车(绿色标签是Jeep TJ,棕色标签是Jeop YJ)
对于批处理规范化,作者使用了Cross mini batch normalization(CmBN)
YOLOv4使用DropBlock正则化。在DropBlock中,图像的某些部分被隐藏,使其在网络的第一层中不可见。DropBlock是一种技术,可以迫使网络学习那些它可能不太依赖的特征。例如,您可以将其比喻为一只狗将头部藏在灌木丛后。网络应该能够从狗的躯干以及头部来识别它。
https://arxiv.org/pdf/1905.04899.pdf?ref=blog.roboflow.com