什么是Bounding Box、anchor box?
由于最近在看YOLO算法,感觉老是不清楚bounding box和anchor box的概念,看完吴恩达的视频后准备写一篇博客记下笔记。em… 所以也会用吴恩达视频中的例子来讲。
在视频中,有一张图片,假设要检测的目标类别有3类 —— 行人、轿车、摩托车。我们将图片划分为3*3的网格(grid cells),并且设置有两个anchor boxes(即,图中那两个紫色边框)。这样每次检测一个grid cell,就会输出一个向量y = [Pc, bx, by, bh, bw, c1, c2, c3, Pc, bx, by, bh, bw, c1, c2, c2]。对这个y可以这么看,由于anchor box有两个,所以y中元素数量是2 * 8。其中前一部分的(Pc,bx,by,bh,bw,c1,c2,c3),Pc表示anchor box1是否在grid cell中检测到目标(若无,则Pc=0,后面的就不用填了),(bx,by,bh,bw)则是目标的bounding box的位置参数,(c1,c2,c3)表示目标是哪类。
注1:bounding box是怎么来的呢?其实是在检测每个grid cell时,若检测到目标,则会将其标出来(图中的红色框)。这就是bounding box。
注2:设置多个anchor boxes干嘛呢? 是这样的,当有目标时,还要计算bounding box分别与各个anchor boxes的IOU(交并比函数),并选择IOU最大的那个anchor box。这样的话,bounding box的位置参数就保存在那个anchor box对应的(Pc,bx,by,bh,bw,c1,c2,c3)中了。
最后,由于grid cells是3*3的,所以最后输出的Y的shape为(3, 3, 2, 8),这些数字的意义对应为(numbers of grid cells, numbers of grid cells, numbers of anchor boxes, numbers of classes + 5)。
yolo算法都干了点啥?
YOLO 算法是目标检测算法,堪称工业级的目标检测,能够达到实时的要求,能够解决许多实际问题。
YOLO 预测时,很简单。他的大致流程如下:
1.缩放输入的图片
2.将图片送入到卷积神经网络中进行预测
3.通过预测的结果进行置信度的阈值处理,得到最终的结果。
YOLO的的核心思想:
- YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
注:faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。
YOLO的实现方法:
-
将一幅图像分成SxS个网格(grid cell),如果某个object的中心点落在某个网格中,则这个网格就负责预测这个object(似乎神经网络能通过预测出的中心点去感知object的全貌…)
-
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度,其值是这样计算的:
其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。 -
每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测C个类别信息。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。
注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。 -
举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
整个网络结构如下图所示:
-
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,即表示该box的准确度。 -
得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
YOLO的训练过程:
对于任何一种网络,loss都是非常重要的,直接决定网络效果的好坏。YOLO的Loss函数设计时主要考虑了以下3个方面
(1) bounding box的(x, y, w, h)的坐标预测误差。
在检测算法的实际使用中,一般都有这种经验:对不同大小的bounding box预测中,相比于大box预测存在偏差,小box存在偏差肯定更不能被忍受。所以在Loss中同等对待大小不同的box是不合理的。为了解决这个问题,作者用了一个比较取巧的办法,即对w和h求平方根进行回归。从后续效果来看,这样做很有效,但是也没有完全解决问题。
(2) bounding box的confidence预测误差
由于绝大部分网格中不包含目标,导致绝大部分box的confidence=0,所以在设计confidence误差时同等对待包含目标和不包含目标的box也是不合理的,否则会导致模型不稳定。作者在不含object的box的confidence预测误差中乘以惩罚权重 λ n o o b j λ_{noobj} λnoobj=0.5。
除此之外,同等对待4个值(x, y, w, h)的坐标预测误差与1个值的conference预测误差也不合理,所以作者在坐标预测误差误差之前乘以权重 λ c o o r d λ_{coord} λcoord=5。
(3) 分类预测误差
即每个box属于什么类别,需要注意一个网格只预测一次类别,即默认每个网格中的所有B个bounding box都是同一类。
所以,YOLO的最终误差为下:
Loss =
λ
c
o
o
r
d
λ_{coord}
λcoord * 坐标预测误差 +(含object的box confidence预测误差 +
λ
n
o
o
b
j
λ_{noobj}
λnoobj * 不含object的box confidence预测误差)+ 分类误差 =
mAP的概念
目标检测中衡量识别精度的指标是mAP(mean average precision)。
多个类别物体检测中,每一个类别都可以根据recall和precision绘制一条曲线,AP就是该曲线下的面积,mAP是多个类别AP的平均值。