在许多新的算法里,涉及到bounding box时,往往会转化成回归问题。而做出这种转变的开山之作,据我所知应该是YOLO。关于YOLO,网上有很多很好的解读,我也在之前的文章中多次提到过YOLO的一些要素,这里不一一列举了,也不重复了,可以使用我网站内的搜索功能看一下相关内容。Andrew Ng在卷积神经网络的公开课上好像也特地围绕YOLO的相关内容讲了一周吧,也可以去看看。本文主要是想记录一下YOLO设计损失函数的一点trick和一些理解。
注意,本文讨论的是YOLOv1。
损失函数
我们直接看YOLO的损失函数。
可以看到,这里所有的损失都是利用ground truth和预测作差。熟悉机器学习相关知识的读者应该会知道,一般我们计算分类的损失时,一般会使用交叉熵或者逻辑回归,而YOLO的类别损失(上图最后一项)依旧使用了直接作差的方法,所以我们说,YOLO把整个检测问题作为一个回归问题来处理。
暂时不关注其它损失项,我觉得这里比较巧妙的是第二项也就是宽高误差。善于观察的话肯定会发现,宽高误差在这里所有的损失项中略显突兀,即它在作差之前分别对ground truth和预测值开了根号,这是为什么呢?
实际上,YOLO的一个motivation就是解决密集物体和小物体的检测(虽然还是没能很好的解决)。相比于大的Bbox产生预测误差,作者更加关注小的Bbox产生的误差。而平方误差损失(sum-squared error loss)中对同样的偏移loss值是一样的。因此这里用了一种比较巧妙的办法,就是用长和宽的平方根来代替原值,这时小的Bbox发生偏移时,其横轴上反应的loss比大的Bbox发生偏移时要大。
这为我们提供了一种很好的思路,若我们对大跨度的目标更感兴趣或者说更希望较大的目标预测更精确时,我们不妨也可以使用平方或是立方来增强大尺度时的反应。其实我觉得这里的思想其实和Gamma校正是一致的。
YOLO优点
速度快且容易优化
YOLO(You Only Look Once)只需读取一次图像就可以进行端到端的优化,这使得它的速度可以很快。它将检测问题转化为回归问题,可以满足实时性的要求。我手机上的一款APP用的就是YOLO的改进版。背景误识别率低
YOLO对全图进行卷积学习,综合考虑了全图的上下文信息,因此背景的误检测较少。泛化能力强
这也是因为综合考虑了图片全局,因此能够更好地学习数据集的本质表达,从而使得泛化性能更好。
YOLO缺点
定位精度不够
这尤其是对于小目标,因为网络较深,使得细粒度特征和小物体特征不明显。因为它是端到端的检测算法(one-stage),没有Faster RCNN那样提取候选框的操作,这也导致了它的精度不高。
补充:由于one-stage和two-stage检测都存在着速度与精度平衡的问题,所以后来的SSD(也是端到端)在借鉴YOLO的网络架构和Faster RCNN中的anchor box实现多尺度的思想的基础上,设计出了更好的算法。可以看一下computer-vision笔记:SSD和DSSD。
对密集目标的识别存在不足
这主要是因为一个grid cell只能预测一个物体。如下图所示,当两个bicycle靠得比较近时,只预测出了一个bicycle。
异常长宽比的目标识别不佳
因为YOLOv1是最后直接学习框的值,这导致了它对异常长宽比的目标识别不佳。对目标个数有限制
由于YOLOv1最后的输出是固定的7x7,也就是说它最多只能预测49个目标。在我前面APP的截图中可以看到标注了max为100,这说明该版本的YOLO固定输出10x10。