YOLO算法理解与思考

看完YOLO算法后,觉得真的是非常棒的一个对象检测算法。

最主要的亮点是他的检测速度快,这和其中的只用一次卷积提取特征有关,也就是说,该算法不是先对图像进行区域划分再进行卷积提特征分类,而是一个端到端的一次性的回归出bounding box和classification,即输出 n * n * 8个参数(假设对象有3类)。Pc:是否有对象,bx:对象中心点的x坐标(小于1),by:对象中心点的y坐标(小于1),bh:bounding box的高度(可以大于1),bw:bounding box的宽度(可以大于1),类别的onehot:c1,c2,c3,这样加起来一个方格有8各参数。n*n代表小方格的个数。这里的bounding box的位置是根据小方格给出的,比如中心点如果离小方格的左上顶点向右有1/5,那么中心点的x就是0.2,这也就是为什么bounding box的长和宽可以大于1的原因,因为对象的宽可能是小方格的好几倍。

算法步骤中的亮点:

1.对图片进行小方格划分,这里的划分不是为了得到bounding box,而是为了缩小对象检测的范围,把对象最好都能够分配到一个属于它的小方格中(属于 与 不属于的判断是通过对象的中心点是否在划分的方格中判断的,这点非常重要),这样使得输出的8个参数更准确,检测的性能更好。这也就是YOLO算法为什么performance好的原因了

2.这样我们输入一张图片,通过卷积网络,输出一个n*n*m(根据类别个数而定,上述举例中是8)的三维矩阵。这个亮点是相当于很好的利用了卷积操作和池化操作的特点,使得网络的输出可以输出n*n*m这种形状的矩阵,并且1*1*m就刚好代表一个小方格所检测出来的对象并且给其分了类别。这也就是为什么YOLO算法的速度快的原因了。

3.非极大值抑制(non-max suppression):用来在预测的bounding box中选出最终的答案,里面用到了IoU,通过非极大值抑制的方法,可以找到多个对象,比如有三个 车 对象,那么用一次非极大值抑制就会得到3个Pc概率高的输出,并且她们的IoU小于0.5。如果有2个不同的对象,比如有一个车 和 人,那么需要循环迭代两次 non-max suppression算法。

如下图,可以很明显的看出YOLO算法的亮点:

YOLO算法理解与思考

4.anchor box的提出,使得两个对象中心点落在同一个小方格中的问题得以解决,在制作标签的过程中,假设有5个anchor box,有两个中心点落在了同一个方格中,哪个bounding box与anchor box的IoU最大,就放到对应anchor box的位置。但是anchor box对两个对象以上中心点落在同一个小方格的效果不好。

个人认为anchor box的提出的思路是想着用一个方格的回归结果得到两个对象的参数,因此参数增倍,但是拿什么来区分这两个对象呢,于是就有了anchor box。

但是我个人认为存在有一个不足之处:

数据集的标签不好构造,需要得到每个小方块的对象的m个参数,如果m越大,越耗时