yolo之前已经出现了两版,最近,yolov3出现在作者官网。相关代码可见github网址。文中如有理解偏差,请各位指正。该论文中新增加的改进技术可详细查看这里。
摘要
作者对YOLO进行了一些改进!通过一堆小的设计变化使之变的更好。作者训练了这个新的模型,其性能很棒。模型比上次的有点大但是更加准确。速度仍然很快,所以不必担心。对320*320的图片测试时,YOLOv3的速度和mAP分别为22ms和28.2,和SSD一样准确,但是速度比SSD快三倍。当采用旧的检测标准,即0.5的IOU时,YOLOv3表现的相当好。可在TitanX GPU上运行51ms,达到57.9,而RetinaNet的速度为198ms,为57.5。相似的性能,但是速度快3.8倍。同往常一样,所有代码公布在网上https://pjreddie.com/yolo/。
1. 引言
有时,你只是打打电话,一年就过去了,你知道么。今年作者没有做大量的研究,在Twitter上花的好多时间。稍微研究了下GANs。去年留下了一点动力[10][1](文献10是牛顿的《自然哲学的数学原理》),并设法对YOLO做了一些改进。但是,说实话,没什么更有趣的内容,只是一些小变化使YOLO变的更好。作者也多少帮助过其他人的研究工作。
实际上,那些就是作者今天发表论文的内容。作者有个论文定稿的截止时间,需要引用一些对YOLO做出的改进,但是没有资源。所以,准备了一篇技术报告。
有关技术报告的优势就是不需要介绍,你都知道报告的目的。因此,引言的最后将指明文章后续内容。首先,作者告诉读者YOLOv3进行了什么处理;其次,作者告诉读者具体做法,还会介绍一些尝试后失败的工作内容;最后,是作者的总结和思考。
2. 解决方案
这是YOLOv3的解决方案:作者大部分是汲取了他人的思想。同时还训练了个新的分类器,它比其它分类器要好。作者从零开始讲解整个系统,以便读者能完全理解。
2.1 边界框预测
延续YOLO9000的做法,作者的系统使用聚类后的框作为anchor来预测边界框。网络为每个边界框(即anchor)预测4个坐标值:。如果单元格(cell)距离图像左上角的坐标为,当前的边界框(the bounding box prior,即anchor)的宽高为,则预测的坐标值为:
训练时,采用误差平方和损失函数。如果预测坐标对应的真实值为则梯度为真实值(从真实边界框计算而来)减去预测值。真实坐标可以通过变换上述公式而来。
YOLOv3使用逻辑回归预测每个边界框中是否为物体的得分。如果边界框(the bounding box prior)和真实边界框重叠比例超过其他的边界框,则当前边界框包含物体的得分为1。沿用论文[15]的做法,如果边界框重叠比例不是最大的,但没有超过设定的阈值,则忽略概况的预测。作者使用0.5的阈值。不同于[15]中的地方是,作者仅为每个真实的物体分配一个边界框。如果边界框没有对应真实的物体,则不计算该框的坐标和分类损失,仅计算是否为物体的损失函数。
2.2 类别预测
每个边界框使用多标签分类的方法来预测其包围物体的类别。作者没有使用Softmax函数,因为它的性能对于网络好的性能不是必须的,相反,作者只是使用了独立的逻辑回归分类器。训练时,对类别预测采用的是二分类的交叉熵损失函数。
损失函数对更复杂的检测场景有帮助,如Open Images Dataset[5]。在这个数据集中,有许多重叠的标签(如Woman和Person)。使用Softmax激活函数强制假设了每个边界框中仅包含一个类别的物体,这通常不符合(该数据集的)实际情况。多标签方法能更好的对这些数据进行建模。
2.3 跨尺度预测
YOLOv3预测了3个尺度的边界框。作者采用类似FPN[6]中的方法在每个尺度下提取特征。作者对基础特征提取网络添加了几个卷积层。卷积层的最后预测一个3维的变量用于编码边界框,是否为物体及类别预测。针对COCO[8]数据集的实验中,作者在每个尺度下预测3个边界框,因此变量为N*N*[3*(4+1+80)],其中4表示边界框的偏移,1表示是否为物体,80表示类别数。
接着,作者从相邻的前两层中提取特征图,并上采样至原来的2倍。作者还从网络更初始的层(earlier)中提取了一个特征图并按照像素加成的方式融合至上采样的特征中。这种做法使得可以从上采样特征中获得更多有意义的语义信息和早期特征图中的细粒度信息。然后作者加了一些的卷积层来处理融合后的特征图,最终获得一个相似的变量,尽管此时分辨率为原来的2倍。
作者再次执行相同的设计来预测最终尺度的边界框。这样当在第三个尺度预测时,可以得益于之前所有的计算和网络初始层中的细粒度特征。
作者仍然采用k-means聚类的方法获得边界框的先验信息。随意选择了9个聚类簇和3个尺度,然后在整个尺度上均分聚类簇。针对COCO数据集,9个聚类簇分别为:(10*13); (16*30); (33*23); (30*61); (62*45); (59*119); (116 * 90); (156 * 198); (373 *326)
2.4 特征提取器
作者使用新的网络进行特征提取。新网络融合了YOLOv2中的Darknet-19和新奇的残差网络。网络使用连续的3*3和1*1的卷积层,但是也有一些短连接,并且网络显得更大。网络有53个卷积层,因此作者称之为Darknet-53。
这个网络比Darknet-19更强大,但是仍然比ResNet-101和ResNet-152更高效。如下是针对ImageNet的一些测试结果。
每个网络采用相同的设置进行训练,并测试网络输入为256*256分辨率的单精度准确性(可查看文献3)。运行时间是在Titan X上对256*256的大小进行测试的。由此,Darknet-53远超过最新技术的分类器,但是浮点运算次数更少、速度更快。Darknet-53比ResNet-101网络更优,且速度快1.5倍。Darknet-53和ResNet-152有相似的准确率,速度快2倍。
Darknet-53还实现了最高的每秒浮点运算次数(FLOPS)。这意味着该网络结构更好的使用了GPU,使其评估更有效,并因此速度更快。(ResNets网络FLOPS低)那主要是因为ResNets层数太多,效率不高。
2.5 训练
作者仍然在整图上进行训练,没有进行难分负样本挖掘(hard negative mining)(可查看文献4)或那样类似的操作。作者采用多尺度训练,数据增强,块归一化,所有都是标准的操作(all the standard stuff)。使用Darknet神经网络进行训练和测试[12]。
3 实现方法
YOLOv3的效果相当好。查看表3。就COCOs数据集奇怪的平均AP的标准而言,YOLOv3和SSD变体的效果差不多,但速度快3倍。但是就这种标准下,其效果有点落后于像RetinaNet等其它的模型。
然而,当观察旧的检测标准,即IOU=0.5时的mAP(或表中的值),YOLOv3的效果很强大。它的效果几乎和RetinaNet的持平,远超SSD的变体模型。这表明,YOLOv3是个很强大的检测算子,能更好的为物体产生边界框。然而,当IOU阈值提高时,其性能下降明显,这表明YOLOv3不擅长将边界框与物体进行对齐。
过去,YOLO对小物体的检测效果不好。然而,作者在表中观察到相反的情况。使用新的多尺度预测的方法,YOLOv3产生相对较高的性能。然而,对中等和大尺度的物体,其性能相对较差。更多的观察可见表3。
当基于的标准绘制准确性对速度的图(图3)时,作者发现YOLOv3比其它检测系统有明显的优势。也就是说,YOLOv3更快、更好。
4 失败案例
当实验YOLOv3时,作者尝试了许多工作。其中有很多没有效果。如下是需要记住的东西。
Anchor box x,y offset predictions. 作者尝试使用常规的anchor边界框预测机制,此时使用线性激活函数来预测x,y相对于边界框宽或高的倍数偏移。作者等人发现这种计算方法使模型稳定性下降且效果不是很好。
Linear x,y predictions instead of logistic.作者尝试使用线性激活函数而不是逻辑回归激活函数来直接预测x,y的偏移。这倒是mAP几个点的下降。
Focal loss. 作者尝试采用focal损失函数。结果使mAP下降了2个百分点。YOLOv3可能已经对focal loss要解决的问题具有鲁棒性,因为它将是否为物体的检测和有条件的类别预测进行了分开处理。这样,对于大部分的样本,没有类别预测的损失。或者是别的因素,作者不是十分确定。
Dual IOU thresholds and truth assignment. Faster R-CNN在训练中使用了两个IOU阈值。如果预测框和真实框重叠比例超过0.7,则其被视为正样本,比例在0.3到0.7间的被忽略,和所有真实框重叠比例低于0.3的视为负样本。作者尝试了相似的策略,但是没有获得好的结果。
作者相当喜欢当前的计算公式,至少眼下其性能最佳。一些技术有可能最终产生好的结果,可能需要一些调整来稳定训练。
5 总结及思考
YOLOv3是一个好的检测算子。它又快又准。尽管基于COCO数据集IOU等于0.5到0.95标准下的平均AP时,它不是非常棒的,但是在旧的IOU=0.5时的检测标准下其性能很好。
为什么非要改变标准?COCO原论文中有这么一句:一旦评估服务器完成,将会添加评估标准的完整讨论。Russakovsky等人在报告中指出:人类很难对IOU是0.3还是0.5进行区分!训练人类从视觉上观察一个IOU=0.3的检测框,并将其与IOU=0.5的检测框进行区分是相当困难的。[16]如果人类很难区分差异,那能有多大意义呢?
但是一个好的问题应该是:对于现在我们拥有的检测算子,我们会做些什么?很多人在Google和Facebook做这些研究。作者猜想至少我们知道技术在可靠的人手里,且必定不会被用来收集个人信息然后出售给……等等,你是说这就是它的用途??
好吧,其他大力资助视觉研究的人是军方,他们从来不做可怕的事情,比如使用新技术杀死许多人。
作者很希望大部分使用计算机视觉的人仅仅是做些开心的,好的事情,像计算自然公园中斑马的数量[11],或者跟踪在房子周围闲逛的猫[17]。但是,计算机视觉已经被用于可疑的场景,那么作为研究者,我们有责任至少应该考虑自己的工作造成的损害,并想办法减轻伤害。我们欠这个是世界太多了。
最后,别@作者(因为作者已经不用Twitter了)。
参考文献: