最近阅读YOLO的文章和代码,学到很多东西,在这里做成笔记,便于以后查阅
YOLOv3的论文原文只是一篇tech report,似乎并没有发表到CVPR,整个abstract和introduction也也写很像日记。从Google scholar上搜索,从arxiv下载下来时,文件名也不和前两年的文章一样,长度也更短,仅6页。
前两年的:
YOLOv3的:
这篇report分了几个部分来写,首先告诉我们做了什么(The Deal),然后是做的如何(How We Do),他们做了什么尝试却没成功(Things We Tried That Didn’t Work)以及这些东西意味着什么(What This All Means)。
作者承认大多数好的ideas来自于借鉴别人
沿用YOLO 9000的方法,使用尺寸聚类得到anchor boxes。同样,每个bounding box预测4个坐标:tx、ty、tw、th,计算方式同YOLO 9000,如下:
训练期间使用平方误差损失,梯度为t_hat - t_pre,这个t_hat值能通过转换上面的公式轻易计算出来。YOLOv3每个bounding box都使用logistic regression来预测objectness score(即置信度,是否包含物体)。
如果这个bounding box的先验框比其他先验框都更和ground truth重叠,那这个值就应该是1。如果这个bounding box的先验框不是最好的,则直接忽略掉,即便它和ground truth的IOU超过了某个阈值(原文设置的是0.5),这一点不像Faster R-CNN。如果一个bounding box先验框没被分配给一个ground truth,则它不会导致coordinate或者classification预测的loss,只有objectness的loss(如IOU并没到达阈值却给出了非0的objectness score)
使用多标签分类,每个bounding box预测边界框可能包含的类。作者发现对于好的性能来说,使用softmax是不必要的,相反,他们仅简单地使用独立的逻辑分类器(logistic classifier)。在训练阶段,classification的loss使用二值交叉熵损失。
这将有利于模型移植到其他更复杂的域,如Open Images Dataset。这个数据集包含很多重叠的labels,比如woman和person。在这种情况下使用softmax的话会给模型强加一种设想:每个框里只有一个类,但通常不是这样的。
这种多标签的方法能更好地对数据进行建模。
YOLOv3在3个不同尺度预测bounding boxes。YOLOv3使用类似于FPN的方法从这些尺度提取特征。在最基本的特征提取器上增加几个卷积层,最后一层预测出一个3维的tensor,其中包含了坐标、置信度和分类预测。在COCO的例子中,在每个scale中,每个网格预测3个bounding boxes,所以tensor的尺寸为【N * N * [3 * (4 + 1 + 80)]】;其中4代表bounding box的偏移值(tx、ty、tw、th),1代表置信度,80代表类别预测。
下一步,对两层前的特征图进行2倍上采样,并提取网络中更早的特征图,然后使用concatenation方法合并这两个特征图。这种策略使得我们从上采样特征里得到更有意义的语义信息,并能从更早的特征图里得到更细粒度的信息。然后额外增加一些卷积层来处理这个结合版特征图,最终预测一个类似的tensor,尽管这个在size上为之前那个的两倍。
再次使用上述同样的方法来对最后一个尺度上的特征图进行预测。因此,第3个尺度能得益于之前所有的计算,包括网络中早期的细粒度特征。
作者仍然使用k-means聚类来决定bounding boxes先验框。选择9个聚类,即9个先验框和3个尺度。在3个尺度上均匀地分布9个先验框,即每个scale上3个先验框。具体地,在COCO数据集上,9个先验框大小为:(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116 × 90),(156 × 198),(373 × 326)
作者使用一种新的网络来进行特征提取。这个新的网络是YOLOv2中使用的Darknet-19和新流行的残差网络的杂交品种。该网络使用连续的3*3和1*1的卷积层,并带有shortcut连接,比之前的网络大了很多。共有53个卷积层,所以叫做Darknet-53。
该网络在ImageNet的结果如下:
每个网络都被以同样的参数设定进行训练,并都在256*256的单一尺寸上进行准确率评估。
从BFLOP/s可见Darknet-53的结构更好地利用了GPU,也因此使其更快。
同样使用多尺度训练(即训练时变换图像的size输入),很多数据增强,batch normalization,以及一些标准的东西。当然,也是使用darknet框架进行所有的工作。
YOLOv3很棒,如下图:
就COCO的奇怪的average mean AP度量标准而言,YOLOv3和SSD与其变体势均力敌,但快3倍多。虽然在这个度量标准下,在其他模型如RetinaNet面前还有点落后。然而,在IOU=0.5下的mAP,YOLOv3是很强的,几乎和RetinaNet可以匹敌,并远胜于SSD与其变体。
之前,YOLOv2在小目标检测方面还很挣扎,但现在,不一样了。伴随新的多尺度预测方法,YOLOv3在小目标检测的性能方面大大提升。但在中等、大目标方面的性能相对更差(和SSD相比),要搞清楚这是为什么,作者还需要更多的研究。
在探究YOLOv3的过程中,作者尝试了很多方法,很多都没有成功,如下是一些他们还记得的东西:
他们尝试使用一般的anchor box预测机制,直接使用线性激活预测x、y的偏移量就像预测box宽高的倍数那样,即相对于anchor box的坐标偏移。这会降低模型稳定性且并不好使。看来还是要预测基于grid cell的偏移,基于anchor box的宽高倍数。
作者尝试使用线性激活来直接预测x、y的偏移而不是logistic activation,这导致mAP下降了好多个百分点。看来预测基于grid cell的偏移时,需要用logistic activation来预测限制范围为0-1(即sigmoid)。
尝试了使用focal loss,它降低了大约2个百分比的mAP。YOLOv3可能已经强壮到不需要focal loss来解决问题了(focal要解决的问题即正负样本不均的问题,像YOLOv1的loss函数那样减少负样本在loss中的比重),因为它已经能够区分objectness的预测和条件类概率预测了。因此,对于大多数例子来说,类别预测基本没有loss了?作者也并不完全确定。
Faster R-CNN在训练阶段使用了两个IOU阈值。如果一个预测和ground truth的IOU超过0.7,它就是正例;0.3到0.7之间就会被忽略;和所有ground truth物体都小于0.3就是负例。作者试了这种方法但没得到好的效果。
目前的方法是作者很喜欢的,至少它是个局部最优。也有可能这些没成功的方法最终能产出好的结果,只是它们可能需要一些调整来稳定训练过程。
YOLOv3在0.5到0.95 IOU的mAP不是那么好,但在老式的0.5 IOU的标准下是很好的。
原始的COCO论文提到这么一句含糊的话:A full discussion of evaluation metrics will be added once the evaluation server is complete。其中还提到,对人类来说,判断一个检测框是基于IOU=0.3还是0.5是非常困难的,如果人类都很难指出这其中的差别,那它还有什么重要的呢?(作者的意思是反对这种说法,因为COCO的标准更加倾向于IOU越高越好,而作者认为classification比localization更重要)
作者更担心的是,虽然领域相关的研究人员大多在Google和Facebook,似乎他们都是好人,技术掌握在他们手里似乎是好的。但真相是这样吗?还有军队对技术的赞助,用于什么…
作者开始反思,甚至有些忏悔。原本以为计算机视觉技术将用于数公园里斑马的数量,找到跳到邻居房顶上的猫咪。但现实的应用和这样的幻想出入很大。作为研究者的我们有责任去考虑我们的工作会对社会产生什么样的影响。毕竟我们欠世界这么多。
作者感谢所有的评论者,嘲讽催着review的人,宣布放弃tweet,如果你tweet他,他不会知道的。
第二个reviewer名叫Dan Grossman(谐音damn gross man,作者都忍不住笑),他坚持说作者的图有两个非0的原点,作者也承认,这是为了让图看起来更好看,而不是简明直白地承认自己在为这2-3%的mAP而苦苦挣扎努力工作着。不过作者也贴上了被要求提交的图,而且作者的态度表明:哪怕就一个原点,我们的图看起来也非常好!
第四个reviewer JudasAdventus在Reddit上写道:读起来很有趣,但对MSCOCO度量标准的反对论点显得不够有力度。作者上头了,表示“我就知道你总会是第一个跟我作对的人”。作者表示,这种反对只是为了在自己做出还不错的工作时,找一种方法来证明它确实是不错的,所以作者才稍微抱怨了一下COCO的mAP度量标准。作者用理性克制着解释完这句话后,情绪来了:既然我已经在这座山上踩点了,我还不如死在山上(意思是说,我既然怼了,你也这么较真,那干脆怼的彻底吧!)
作者开始解释:mAP已经有些问题了,所以基于这个标准的更新应该在某种程度上解决一些它之前的问题,或者至少证明更新版到底比原来的好在哪。作者的意思就是,COCO的mAP就是缺乏这种合理性证明!对于PASCAL VOC,IOU阈值“故意设置得低,为了考虑ground truth数据中边界框的不准确性问题”,可是COCO呢?COCO的数据集比VOC有更好更准确的边界框标注吗?当然这有可能,因为COCO有图像分割的mask label,可能这样的labels确实是更值得信任的,所以我们不需要担心这个边界框的不准确性。但是,作者的问题是:缺乏合理性证明。
作者说:COCO的度量标准强调更好的bounding boxes,但是这种强调一定暗示着对其他方面的不强调,在COCO的案例中,即对classification准确率的不强调。可是我们有理由认为精确的bounding boxes比更好的classification更重要吗?不是的,一个被错误分类的物体所体现出来的问题比一个稍微有点移位的bounding box的问题更加明显。
作者说:mAP已经完蛋了,因为对它来说重要的仅仅只是每个类别的排列顺序。比如,如果你的测试集仅仅只有如下两张图片,按照mAP的标准来的话,这两个detector的检测效果是同样好的!
因为在第二个detector上,虽然有很多错误,但每个类别中概率大小排在第一的依然是正确的最好的那个,因此即便检测效果非常差,可按mAP的标准,他们的检测效果计算出来是一样好的。
作者说:当然,这很明显是对mAP的问题的过度夸大,但我的新的观点是:“现实世界”的人们所关心的东西与我们当前的度量标准之间存在着明显的差异,所以我认为如果我们要提出新的度量标准,我们就应该关注这些差异。而且,mAP已经是mean average precision了,我们怎么能称呼COCO的度量标准为average mean average precision?
作者又说:我有个提议,人们实际关注的是:给定一个图像和检测器,这个检测器能多好地找到并分类图像上的物体。去掉每个类的AP,只计算全局平均精度,怎么样?或者,计算每张图片的AP,然后在所有图片中取平均?
作者最后总结:不管怎么样,Boxes真的很蠢,要不是我没法让YOLO学习图像分割的mask,我可能是mask真正的信徒。
[1] Redmon, J. and Farhadi, A., 2018. Yolov3: An incremental improvement. arXiv preprint arXiv:1804.02767.
[2] https://openaccess.thecvf.com/content_ICCV_2017/papers/Lin_Focal_Loss_for_ICCV_2017_paper.pdf
[3] https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b