yolo 目标检测算法个人总结(yolov1)

https://zhuanlan.zhihu.com/p/27515705

yolo 目标检测算法个人总结

目前yolo目标检测有两个版本,分别为v1和v2。因工作需要用yolo算法检测人物,所以这段时间重点看了这两篇论文,并实现了对应的tensorflow代码。这里记录下在论文阅读过程中的一些细节信息,留给自己,同时也希望各位能指出本人理解错误的地方,谢谢!

一:yolo v1

关于yolo v1算法的详解在网上已经非常多了,在这里我大概叙述下算法的流程,以及在开发过程中遇到的一些想不明白的细节问题,以及最后自己的解决方法。

yolo v1在检测目标时,不同于之前RCNN系列的方法,是将检测对象的类别和位置同时进行预测,是一种回归问题。主要步骤为:卷积层进行图像特征提取;全连接层用于后续类别和目标位置的回归预测。

具体预测方法:目标可能位于图像的不同局部区域,因此,作者首先将图像分割成S*S个栅格单元,并同时期望每一个栅格单元能完成识别和检测落入到该单元的目标。基于此,作者提出对每一个栅格单元,主要预测以下几个值:1 预测的B个Box的置信度;2 每个Box的位置(Box中心坐标x,y以及Box的宽和高);3 在当前栅格单元有对象的条件下,输入每个类别的概率;作者同时还指出,一个栅格单元只负责检测一个目标,并且B个Box只有一个用于预测目标的位置,这句话为我们对Train的Image的类别标记和计算loss值提供了依据。具体loss计算文章中有非常详细的介绍,截图如下:

yolo 目标检测算法个人总结(yolov1)

关于loss中的参数,原文有非常详细的介绍,在这里就不一一展开。只列举出,我在实现的过程中为难的地方

1 文章中每一个栅格单元会预测2个Box,那么类别标记的时候这两个Box怎么处理的?

我在实现过程中,并没有找到作者关于这2个Box的说明,更别说其他的细节了。后来,我想,其实这里预测几个Box其实并不重要,作者的目标是一个栅格单元只检测出一个目标,理论上一个Box就能达到要求,作者在这里选择两个Box我想主要是由于不同的物体形状上可能差异比较大,两个Box可以分别负责预测两种形状的物体(w>h or w<h)。因此,我在处理时,对于根据目标的长、宽比确定选择哪一个Box作为作者所说的"responsible"。并没有计算Box与ground truth的IOU,并找到最大的那个。(这里有处理错误,还请指出来)

yolo 目标检测算法个人总结(yolov1)

 

2 作者说每一个栅格单元是否包含object的判断方法是:检测目标Box的中心点是否落入到该单元。由于我的最终目标是要检测人,人一般会比较大,Box的中心点位置标记为object往往不能覆盖到人的有用信息(如下图中黄色矩形示意),这会较低召回率。为此,类别标记时,我们将一个object差分为4个object,具体如图所示(原来的框+3个新框)。这样明显增加了类别的召回率。测试时确实效果好了不少。

yolo 目标检测算法个人总结(yolov1)

 

对于每一个grid会预测两个box的位置(x1,y1,w1,h1,x2,y2,w2,h2),两个box的confidence(C1,C2),以及当前grid属于某个目标类别的概率(p1,p2,...)。最后test的时候,对于每一个类别都会有7*7*2=98个box,以及这98个box的得分(p*c),最后根据设定的阈值以及NMS算法确定最后检测出的目标的box