-
two-stage:two-stage往往是region-based方法,一个典型的region-based方法的流程是先通过计算机图形学(或者深度学习的方法,对图片进行分析,找到若干个可能存在物体的区域,将这些区域裁剪下来,放入一个图片分类器中,由分类器分类。
-
one-stage:yolo被称为region-free方法,yolo只需要一个网络达到画框和分类回归,yolo不需要提前找到可能存在目标的region(没有SS或RPN这样的过程),只需要浏览一次就可以识别出来图中的物体的类别和位置。
1. YOLOv1结构
去掉候选区这个步骤以后,yolo的结构非常简单,和普通的CNN对象分类网络几乎没有本质区别,就是卷积、池化最后加了两层全连接。
图1-1 YOLOv1的网络结构
图1-2 YOLOv1的网络结构
那么yolo是如何通过简单的卷积网络预测出目标的类别和位置信息的呢?
2. YOLOv1思想
2.1 映射关系
图2-1 输入→输出
由图2-1,每个格子对应着一个30维的向量。我只需要目标物体的点落在这个格子里,我甚至不用特别设置候选框及这框的大小位置,自然由30维的向量推断出这个物体的大小和位置,以及类别。
图2-2 30维输出向量
-
输入:输入图片先reshape为448×448大小,然后将图片分割成S2S^2(通常S=7S=7)个grid,每个grid的大小都是相等的,YOLOv1只要求物体的中心落入这个grid之中。
-
输出:
- 我们要让S2S^2个grid每个预测出BB(通常BB=2)个bounding box和CC(PASCAL VOV=20)个类别的概率。
- 每个bounding box包括5个量:bounding box的预测置信度(confidence)+目标物体的中心位置(x,y)+物体的高(h)和宽(w)。
- 输出的shape:(S,S,B×5+C)
对于输出:
1.x,y,w,h是需要先进行归一化的:
x=x在该grid的距离/grid的宽
y=y在该grid的距离/grid的高
w=w/输入宽(448)
h=h/输入高(448)
2.bounding box的预测置信度(confidence):
confidence就是这个bounding box有多大的信心判定就是这个类。
该图被分成了49个grid,每个grid预测2个bounding box,因此上面的图中有98个bounding box。这里根据置信度不同设定边框粗细,置信度高的比较粗,置信度低的比较细。confidence的公式:
confidence=Pr(obj)∗IOUtruthpredconfidence=Pr(obj)*IOU^{pred}_{truth}Pr(obj)=1Pr(obj)=1,有物体;Pr(obj)=0Pr(obj)=0,无物体;
IOUtruthpredIOU^{pred}_{truth}是bounding box和ground truth的交并比。
2.2 个人理解
回到最开始的问题yolo是如何通过简单的卷积网络预测出目标的类别和位置信息的呢?
我理解为:通过将输入划分S2S^2个grid,经过一系列的卷积池化,输出(S,S,B×5+C)的参数,这参数就表示每个grid预测的类别和B个bounding box(他们很粗糙地覆盖了图片的整个区域),包括每个bounding box的位置和confidence。经过不断训练这个网络,在损失函数的约束下,类别和bounding box的5个参数会越来越准确。
这里的一个小点:在两个bounding box的类别参数都是相同的情况下,即同一个物体被多个bounding box识别了,用NMS选择confidence大的那一个。
3.YOLOv1损失函数
图3-1 损失函数
损失就是网络实际输出值与样本标签值之间的偏差:
图3-2 真实标签与预测误差