Yolov3算法详解
YOLO系列算法是当前目标检测领域的当红算法,是一阶段目标检测算法的经典代表,正如其名称“You Only Look Once”所述,其只需要一趟完整的过程即可完成目标的识别和位置定位,能够近乎实时得完成目标检测任务,堪称众多目标检测算法中速度之最。
YOLO系列算法到现如今已有五个版本,最新的版本为Yolo v5,但本文先介绍YOLO v3算法,因为YOLO系列算法是从YOLO v3开始“走红”进而被广泛应用,接下来的YOLO v4 和YOLO v5虽然是在YOLO v3基础上进一步改进,但都是在细枝末节上进行的优化,反而丢失了YOLO v3在工业界的普遍适用性。
1 Darknet-53¶
在YOLOv2版本时,其主干网络是一个Darknet-19网络,到了YOLOv3版本,主干网络进化为了Darknet-53网络,网络层数更多,同时也引进了更加先进的Resnet残差网络。与Darknet-19网络相比,Darknet-53网络在处理大量图片时整体效率上有所不如,但是准去率上确提高了很多,且经证明,在相同准确率下,Darknet-53速度却要由于Darknet-19。
Darknet-19与Darknet-53网络结构对比如下所示。
2 特征金字塔(Feature Pyramid Netword, FPN)¶
进行目标检测时,一副图像与可能存在多个物体,物体有大有小,所以目标检测模型必须要有检测不同大小物体的能力。而在实际卷积神经网络各层输出的特征图中,不同深度的卷积层所检测到的特征是有区别的,浅层网络的输出的特征图经过的卷积操作少,保留较多的小尺寸细节信息,例如物体颜色、位置、边缘等,信息更加低级、具体,随着网络深度的加深,输出的特征图经过了更多层卷积操作,包含了更广视野范围的图像信息,特征图所提取的信息变得抽象,例如物体的语义信息(物体的类别特征:猫、狗、汽车等)。另外,针对这一现象,许多模型开始尝试使用不同层次的特征图进行预测,主要有一下几种主流的方法:
(a) 这种方法最直观。首先对于一幅图像建立图像金字塔,不同级别的金字塔图像被输入到对应的网络当中,用于不同大小物体的检测。但这样做的结果就是每个级别的金字塔都需要进行一次处理,速度很慢。
(b) 检测只在最后一个特征图阶段进行,这个结构无法检测不同大小的物体。
(c) 对不同深度的特征图分别进行目标检测。SSD算法中采用的便是这样的结构。每一个特征图获得的信息仅来源于之前的层,之后的层的特征信息无法获取并加以利用。
(d) 与(c)很接近,但有一点不同的是,当前层的特征图会对未来层的特征图进行上采样,并加以利用。这是一个有跨越性的设计。因为有了这样一个结构,当前的特征图就可以获得“未来”层的信息,这样的话低阶特征与高阶特征就有机融合起来了,提升检测精度。YOLOv3中正是使用这一种方案。
3 Yolov3中的主干网络¶
将特征金字塔与Darknet-53网络模型相结合,就有了Yolov3的主干网络。这里需要说明的是,在整个Yolov3网络中,没有池化层,只有卷积层,通过调节卷积步长控制输出特征图的尺寸。所以对于输入图片尺寸没有特别限制。
以输入416 $\times$ 416尺寸的图像为例,在YOLOv3的Darknet-53网络中特征提取过程如下图所示。
从上图中可以到,虚线框内的Darknet-53网络对右侧网络有3个输出,最底下的输出是13×13×1024的特征图,这一输出经过最多层卷积操作,包含更高级、更抽象、视野范围更大的特征,适合尺寸较大的目标检测,在右侧网络中,这一特征图再次经过卷积的特征图先两个方向传递,一个是再次经过3×3和1×1的卷积后输出13×13×75的特征图用于目标检测,另一个是进行上采样改变特征图大小后与Darknet-53网络的第二个输出特征图进行堆叠组成新的特征图,这个新的特征图再次进行卷积,也同样进行两个方向的传递,其中一个方向最终输出26×26×75的特征图用于目标检测中,另一个方向的是进行上采样转变尺寸后与Darknet-53网络第一个输出的特征图进行堆叠后形成新的特征图进行特征提取,最终输出52×52×75的特征图,这一特征图包含了浅层网络提取的特征图对小尺寸目标检测更有一定提升。
在上述过程中,两次用到上采样和特征堆叠,其中上采用是将小尺寸特征图通过插值等方法,生成大尺寸图像。例如使用最近邻插值算法,将88的图像变换为1616,注意,上采样层不改变特征图的通道数。而特征堆叠是指的是concat操作,源于DenseNet网络的设计思路,将特征图按照通道维度直接进行拼接,例如8816的特征图与8816的特征图拼接后生成8832的特征图。
总结而言,经过上述主干网络后,将输出以下三种不同大小的特征图:
-
13×13×75
-
26×26×75
-
52×52×75
4 输出结果解析¶
在本文开题处我们就说过,Yolo系列算法时一种典型的“一阶段”目标检测算法,这是Yolo最为出彩的设计,一次性即可完成对目标的定位和识别——这是RCNN等其他类型的目标检测算法所不能完成的。不过这也要求Yolo模型的输出结果中必须包含目标物体的定位信息和类别信息。
对于模型的输出,Yolov3算法在这一点上的设计堪称绝妙。
主干网络产生了3种不同的特征图,这三中特征图将被分别传入logistic层中,进而运算产生模型的输出。这里多问一句,为什么不使用softmax呢?这是因为softmax对每个框只产生一个分类,在目标检测任务中,存在多个目标物体重合的情况,也就是存在多个分类,softmax就不适用了,所以在Yolo算法中使用了logistic。
有多个输入自然就有多个输出,Yolov3主干网络的3中特征图分别经过logistic层后,也将产生3个输出。在介绍模型输出结果之前,我们有必要先说说Yolov3中应用到的另一种思想——分而治之。
目标检测任务极具挑战性的一个很大原因是因为原始图像中可能包含的目标物体大小不确定。对于这一难题,Yolov3算法的解决思路时将原始图像使用不同的粒度进行划分网格,例如划分为13×13、26×26、52×52的网格。13×13的大网格用于检测大的目标物体,26×26的网格用于检测中等的目标物体,52×52的网格用于检测小目标物体。有没有觉得13、26、52这几个数字很眼熟?没错,这是与主干网络输出的3种特征图的大小是一一对应的。在logistic层的输出结果中,对每个划分单元格都有一个对应的向量来描述目标检测的结果,即在该单元格是否有物体、物体的位置、物体的分类。
在logistic层的输出结果中具体是怎么来描述的检测结果的了?这还得从原始输入图像说起,我们从13×13的网格划分方式为例进行说明。如下图所示,我们将一张图像输入到模型中,13×13的单元格与主干网络的13×13×75的特征图对应,也就是说,13×13×75的特征图经过logistic层后的输出结果将包含$13×13=169$个单元格的检测结果,如图中红色框标识的单元格所示,将包含169个这种向量。每个向量又可以分为3个相同结构的子向量,每个子向量对应一个先验框的检测结果。
先验框是什么鬼,之前没说过呀?别急,现在说也不迟。我们之前所在目标检测任务中一大难点就是目标物体的大小是不确定的,但其实除了大小不确定外,位置也是不确定的,所以我们很难保证在同一个单元格中会不会有多个目标物体覆盖,也即是说,有可能一个单元格需要多个输出,对应可能的多个物体。Yolov3中规定,每个单元格输出3个结果,每个结果对应一个先验框(外文资料中称为Anchor Box,中文翻译各不相同,本文姑且称之为先验框),因为有三种网格划分,所以共有9种先验框。先验框的长宽是在建模前使用k-means对数据集中的标签框进行聚类,得到类别中心点的9个框,作为先验框。在Yolov3作者论文中提出3种尺寸的单元格对应的先验框分别为:
-
13×13:(10×13), (16×30), (33×23)
-
26×26:(30×61), (62×45), (59×119)
-
52×52:(116×90), (156×198), (373×326)
继续,我们来解析一下输出结果相对先验框的含义。
-
$t_x$,$t_y$:预测框中心点相对于单元格中心点的坐标;
-
$t_w$,$t_h$:预测框相对于先验框的长宽;
-
$p_0$:衡量单元格是否有目标物体存在的置信度;
-
$p_1,p_2,…,p_c$:衡量每个类别物体是否存在的置信度,每个值对应一个类别。
通过这些值,可以进一步换算出预测框的位置、长宽:
式中,$b_x, b_y, b_w, b_y$分别是预测框的位置和长宽,$p_w, p_h$是对应的先验框的长宽,$c_x, c_y$是对应单元格左上角位置坐标,$ \sigma$是指$sigmod$激活函数。
5 非极大值抑制¶
每个网格将会输出3个预测框,所以一张原始图像经过Yolov3网络后将产生的预测框数量为:3×13×13 + 3×26×26 + 3×52×52 = 10647个预测框,你能想象满屏都是这种预测框吗?所以,大部分了的预测框都是没必要的,那么,怎么提出无效预测框,保留最准确的预测框了?
如下图所示,首先,我们可根据置信度判断判断预测款内是否有目标物体的存在,如果置信度过低(小于某个阈值),那么,直接删除这个预测框。例如下方图片中的预测框$H$。
接下来才是真正的难题,删除类似$H$这种置信度低的预测框后仍有$A$、$B$、$C$、$D$、$E$、$F$等预测框留下,且这些预测框相对雷索都还算准确,但,我们对每个目标物体依然只需要保留一个预测框,怎么办呢?
在Yolov3模型中,作者引入了非极大值抑制法(Non-Maximum Suppression,NMS)来解决这一问题。
先对所有留下的预测框,根据分类器的类别分类概率做排序,假设从小到大依次为:$A$、$D$、$B$、$F$、$E$、$C$。
(1)从最大概率预测框A开始,分别判断$D~C$与A的重叠度IOU是否大于某个设定的阈值;
(2)明显,$B$、$C$与A的重叠度比较大,假设超过阈值,那么就扔掉$B$、$C$;并标记第一个矩形框$A$,是我们保留下来的。
(3)从剩下的预测框$D$、$E$、$F$中,选择概率最大的$D$,然后判断$D$与$E$、$F$的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的预测框。最终,保留下来的预测框为$A$和$D$。这就是非极大值抑制法。
在上述过程中,有一个新的概念,即IOU。IOU(Intersection over Union)通俗来讲就是交并比,如下图所示。
上述就是非极大值抑制法的完整过程。这里需要说明,使用非极大值抑制法存在一定不足,在上图中,狗所在的区域与自行车所在的区域存在重合,这样的话,如果同时要识别自行车,那么,自行车的预测框因为与狗的预测框存在很大重叠,就会别丢弃,导致自行车识别失败,针对这一问题,一些学者基于非极大值抑制法提出soft-nms等方法,大家可自行研究。
6 总结¶
至此,yolov3算法整个流程基本结束,本来还想再捋一捋loss计算部分内容,但总感觉没有领悟透,最近事多,姑且搁置。
作者:奥辰
微信号:chb1137796095
Github:https://github.com/ChenHuabin321
欢迎加V交流,共同学习,共同进步!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。