论文精读|5th|YOLO v3的新特性

YOLO(You Only Look Once)是当今最有效的快速目标检测算法之一。虽然它现如今已经不是最准确的识别算法了,但依然是进行实时物体检测的最佳选择之一。最近,YOLO发布了它的最新版本YOLO v3,本文重点介绍YOLO v3的新特点。

获得源代码及YOLO论文,请关注公众号并回复:20180508
特点1: 更好,而不是更快,更强YOLO v2(即YOLO9000)在当时是最快、最准确的物目标检测算法。随着技术的进步,其准确率逐渐被RetinaNet和SSD等算法超越,但YOLO v2依然是计算效率最高的算法。在YOLO v3版本中,为了提高准确度,牺牲了一些算法的速度。测试表明,YOLO v2在Titan X上的运行速度为45FPS,而YOLO v3则为30FPS。这是因为新版本增加了底层框架Darknet的复杂度。


特点2:Darknet-53YOLO v2使用的深度底层框架是Darknet-19,包含19个卷积层和5个最大池化层。在此基础上,再叠加11层网络来进行目标检测。但YOLO v2的30层网络结构在识别小尺寸物体时的效果并不是很好。这是因为该算法不断的压缩图像尺寸,从而损失了图像的某些细小特征。YOLO v2采用了恒等映射(identity mapping)方法来弥补这个缺点,计算过程中将前一层的特征映射过来获得低阶特征。但是,YOLO v2依然缺少现在最先进算法的一些必要元素,比如残差模块(residual blocks)、跳跃式传递(skip connection)和上采样(upsampling)。
首先,YOLO v3融合了残差网络和上采样等先进的算法思想。其次,对Darknet进行了改进,将网络深度扩展到53层,并在Imagenet上进行了预训练,物体识别则通过另外的53层网络来实现,YOLO v3完整的卷积底层结构共有106层,这也是YOLO v3较YOLO v2慢的原因。YOLO v3的网络结构如下图所示。

论文精读|5th|YOLO v3的新特性_第1张图片



特点3:从三个尺度进行检测YOLO v3最显著的特点是在三个不同的尺度上对图像展开检测。YOLO v1是一个全卷积神经网络,其通过在特征图(feature map)上应用1x1的卷积核来产生最终输出结果。在YOLO v3中,物体检测则是通过在网络不同位置、不同尺度的特征图应用1x1卷积核来实现的。
用来进行识别的卷积核的尺寸为1 x 1 x ( B x ( 5 +C ) ),其中B代表一个cell中包含的边界框(bounding box)数量,5代表边界框的4个属性和物体置信度,C是物品类别数。YOLO v3在COCO上进行测试时,取B=3和C=80,所以卷积核的尺寸为1 x 1 x 255。注意,该卷积核不会改变特征图的尺寸,但在第3个维度上附属了物品预测信息。
 

论文精读|5th|YOLO v3的新特性_第2张图片


YOLO v3在3个不同尺寸的特征图上进行预测,准确的说,即是对输入图像分别进行32、16和8倍的降采样后再进行预测。
第一次检测发生在第82层,对于前面的81层网络,图像被逐渐的降采样,也就是说对于第81层,其降采样步长为32。假设输入的图像尺寸为416 x 416,那么输出的特征图尺寸为13 x 13。然后应用1 x 1卷积核进行第一次检测,输出尺寸为13 x 13 x 255的检测特征层。
然后对第79层的特征图先进行一系列卷积处理,再进行2倍的上采样,将尺寸扩展到26 x 26。然后再将其与第61层网络在第3个维度上进行拼接。对拼接后的特征层应用一系列的1 x 1卷积核进行处理,将第61层的特征进一步融合。最后在第94层进行第二次物品检测,输出的特征层尺寸为26 x 26 x 255。
第三册检测的处理方法相同,即将第36层和第91层的特征进行融合,并在第106层进行第三次特征检测,输出的特征层尺寸为52 x 52 x 255。

特点4:善于检测更小的物品YOLO v3将上采样层跟前面的层进行拼接融合,该处理方法保留了图像中更细致的特征,这一点对检测微小尺寸物品很有帮助。
对应的,YOLO v3的13 x 13特征层适用于检测大尺寸物品,26 x 26特征层适用于检测中等尺寸物品,52 x 52特征层则用来检测小尺寸物品。

特点5:锚箱的选择YOLO v3总共使用了9个锚箱(anchor box),每个尺度各3个锚箱。如果你在自己的数据集上应用YOLO,你需要使用K平均聚类方法自行创建9个锚箱。然后将各锚箱按降序排列,最大的3个应用到第一类特征层,接下来的3个对于第二类特征层,最后3个处理最后的特征层。

特点6:图像有更多的边界框对于相同的输入图像,YOLO v3比YOLO v2使用了更多的边界框(bounding box)。比如,对于416 x 416的输入图像,YOLO v2共应用了13 x 13 x 5 = 845个边界框。对于每个cell,采用5个锚箱进行检测。
而YOLO v3则在三个不同的尺度设置了边界框。同样的416 x 416图像,预测用边界框的数量则达到10647个。也就是说,YOLO v3预测用的边界框数量比YOLO v2多10倍之多,这也是YOLO v3速度慢的原因所在。在每个尺度,每个cell用3个锚箱,所以 YOLO v3的锚箱总数是9个。


特点7: 损失函数的变化YOLO v2的损失函数如下:

论文精读|5th|YOLO v3的新特性_第3张图片


YOLO v2损失函数的后三项是平方误差,而YOLO v3则更改为交叉熵误差项,也就是说YOLO v3的物品置信度和分离预测使用的是逻辑回归算法。

特点8:不再使用softmax进行分类YOLO v3采用了多标签分类的方法进行目标检测。
在早期的YOLO版本中,通常采用softmax函数对目标进行分类与估值,然后选择有最大分值的物品对边界框进行标识。YOLO v3则改变了这种方式。
softmax分类假定各个物品的类别是互斥的,也就是说一个物品属于某一类,那么它就不可能属于另一类。
但是,当数据库中包含诸如“人类”和“女人”这样的类别时,那么上述假设及不成立了。这也是YOLO的作者放弃softmax分类的原因。在YOLO v3中,每个类别的分值用线性回归来预测,此外还设置了一个门槛值来实现多标签预测。也就是说,当某个类别的分值高于门槛值,则该类别的标签就被赋予相应的边界框。


特点9:基准测试在COCO mAP 50 benchmark数据库上,将YOLO v3与其他的先进算法(如ResNet)在相同的计算条件下进行了比对,结果发现YOLO v3的计算效率更高。

论文精读|5th|YOLO v3的新特性_第4张图片


但是,YOLO在COCO的基准测试中使用了更高的IoU值来拒绝检测。这里不打算解释COCO基准测试是如何工作的,因为它超出了本文的范围,但是在COCO 50基准测试中,50这个数值是用来衡量预测的边界框与对象的Ground Truth框贴合的程度的。这里,50对应的是0.5 IoU。如果预测的边界框与Ground Truth框之间的IoU小于0.5,则该预测被归类为定位错误,并标记为假阳性。
在基准测试中,基准数值越高(比如,COCO 75),则边界框需要更好地与Ground Truth框对齐,以避免被评估指标剔除。测试发现,YOLO v3 的表现不如RetinaNet,因为它的边界框贴合度较RetinaNet差,详细测试表如下所示。

论文精读|5th|YOLO v3的新特性_第5张图片



简单测试为了对比YOLO不同版本的差异,我们进行简单的测试。测试代码来自Github项目repo。运行代码需要PyTorch0.3+,OpenCV3和Python3.5。
不同尺度的特征层
我们来看下不同尺度的特征层识别的目标的差异。


python detect.py --scales 1 --images imgs/img3.jpg
 

论文精读|5th|YOLO v3的新特性_第6张图片




python detect.py --scales 2 --images imgs/img3.jpg
 

论文精读|5th|YOLO v3的新特性_第7张图片



python detect.py --scales 3 --images imgs/img3.jpg

 

论文精读|5th|YOLO v3的新特性_第8张图片



不同的输入分辨率


python detect.py --reso 320 --images imgs/imgs4.jpg

 

论文精读|5th|YOLO v3的新特性_第9张图片



python detect.py --reso 416 --images imgs/imgs4.jpg

 

论文精读|5th|YOLO v3的新特性_第10张图片



python detect.py --reso 608 --images imgs/imgs4.jpg
 

论文精读|5th|YOLO v3的新特性_第11张图片



python detect.py --reso 960 --images imgs/imgs4.jpg
 

论文精读|5th|YOLO v3的新特性_第12张图片




在本例中,较大的输入分辨率并没有多大帮助,但是它们可能有助于检测包含小尺寸物品的图像。另一方面,较大的输入分辨率增加了计算时间,这是一个需要根据需求调整的超参数。你也可以通过运行问repo代码来试验超参数,比如批处理数量、objecityconfidence和NMS阈值对YOLO v3性能的影响。

你可能感兴趣的:(tensorflow)