YOLO - You Only Look Once: Unified, Real-Time Object Detection

YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。

1 边框回归 (Bounding Box Regression)

目标检测(Object Detection) YOLO
这是除了R-CNN以外很多论文都只是简略阐述的一部分内容,所以参考几篇回答以后在这里总结边框回归的具体概念。

过程简述
边框回归的目的:对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样定位会更准确。Bounding-box regression 就是用来微调这个窗口的一种思路。

一个bounding box可以用四维向量(x,y,w,h)(x,y,w,h)来表示,Ground Truth也可以做出同样表示,那么便可光回顾的总体目标作出粗略描述。

(1.1)Given:(Px,Py,Pw,Ph)Given:( P_x,P_y,P_w,P_h ) tag{1.1}
(1.2)Find:f(Px,Py,Pw,Ph)G(Px,Py,Pw,Ph)Find: f( P_x,P_y,P_w,P_h ) approx G(P_x,P_y,P_w,P_h) tag{1.2}

那么经过何种变换才能从图 2 中的窗口PP 变为窗口GG呢? 比较简单的思路就是平移结合尺度放缩。

先做平移(Δx,Δy)(Δx,Δy)Δx=Pwdx(P),Δy=Phdy(P)Δx=Pwdx(P),Δy=Phdy(P)(Δx,Δy)(Δx,Δy), Δx=P_wd_x(P),Δy=P_hd_y(P)Δx=P_wd_x(P),Δy=P_hd_y(P)
(1.3)Gx=Pwdx(P)+Px,G_x=P_wd_x(P)+P_x,tag{1.3}
(1.4)Gy=Phdy(P)+Py,G_y=P_hd_y(P)+P_y,tag{1.4}
然后再做尺度缩放(Sw,Sh)(Sw,Sh),(S_w,S_h)(S_w,S_h), Sw=exp(dw(P)),Sh=exp(dh(P))Sw=exp(dw(P)),Sh=exp(dh(P)),S_w=exp(d_w(P)),S_h=exp(d_h(P))S_w=exp(d_w(P)),Sh=exp(d_h(P)), 对应论文中:
(1.5)Gw=Pwexp(dw(P)),G_w=P_w cdot exp(d_w(P)),tag{1.5}
(1.6)Gh=Phexp(dh(P)),G_h=P_h cdot exp(d_h(P)),tag{1.6}
观察(1.3)(1.3)~(1.6)(1.6)我们发现, 边框回归学习就是dx(P),dy(P),dw(P),dh(P)d_x(P),d_y(P),d_w(P),d_h(P)这四个变换。接下来就是设计算法得到这四个映射。

算法过程

输入:
该窗口对应的CNN特征,通常指的是Pool5 feature那个特征向量,以及所需要的Ground Truth(通常指的是偏移量t=(tx,ty,tw,th)t_* = (t_x,t_y,t_w,t_h) 其中$tx=(GxPx)/Pwtx=(Gx−Px)/Pwty=(GyPy)/Phty=(Gy−Py)/Phtw=log(Gw/Pw)tw=log(Gw/Pw)th=log(Gh/Ph)th=log(Gh/Ph)
输出:
dx(P),dy(P),dw(P),dh(P)d_x(P),d_y(P),d_w(P),d_h(P)
回归:
使得dx(P),dy(P),dw(P),dh(P)d_x(P),d_y(P),d_w(P),d_h(P)(tx,ty,tw,th)(t_x,t_y,t_w,t_h)尽量接近

优化函数:
loss=iN(tiwiTΦ5i)2+λwi2loss=∑_i^N(t_i−w^T_iΦ_{5i})^2+λ||wi||^2

2 YOLO技术框架

目标检测(Object Detection) YOLO

2.1 预测

目标检测(Object Detection) YOLO
首先是需要对图片进行分割成为 SxS 个网格,在作者论文里面给出的是S=7,于是把原图分成 7x7=49 个网格,每一个网格的大小是 64x64 。每个网格要预测B个bbox,每bbox除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的bbox中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
(2.1)Pr(Object)IOU(truthpred)P_r(Object)∗IOU(truth|pred) tag{2.1}
其中如果有object落在一个grid cell里,Pr(Object)P_r(Object)取1,否则取0。 第二项是预测的bbox和实际的groundtruth之间的IoU值。
在预测的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:

(2.2)Pr(Classi)IOU(truthpred)P_r(Class_i)∗IOU(truth|pred) tag{2.2}
class信息是针对每个网格的,confidence信息是针对每个bounding box的。
Attention
每个bbox要预测的是(x,y,w,h)(x, y, w, h)confidenceconfidence共5个值.
其中(x,y,w,h)(x, y, w, h)并不是每个bbox的起始坐标和窗口宽度,x,yx,y是相对于其对应的网格的偏移offsetoffsetw,hw,h是该窗口对应于整张图像的长宽比例。每个网格还要预测一个类别信息,记为C类。则S×SS times S个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S×S×(5B+C)S times S times (5*B+C)的一个向量。

在算法的最后使用了非极大值抑制算法,求每一个网格的多个bbox到底哪个bbox是最有可能的窗口:
目标检测(Object Detection) YOLO
(2.2)Pr(Classi)IOU(truthpred)P_r(Class_i)∗IOU(truth|pred) tag{2.2}
目标检测(Object Detection) YOLO

2.2 训练

  1. 将标注框和相应grid cell匹配到一起
  2. 调整相应grid cell对应的分类
  3. 检查grid cell对应的B个预测窗口bbox,找到最好的那个并调整该窗口,并增加该窗口对应的confidence;与样本不太匹配的窗口bbox则降低置信度。
  4. 对于没有检测到ground truth的窗口,检测bbox的置信度并降低其对应预测窗口bbox的置信度,但是不改变分类、窗口坐标。
    损失函数
    $$$$

2.3 可能的提升

  • YOLO对于靠的很近的物体或者是小群体的检测效果不好,这是因为每个grid cell只能预测属于同一类的框。
  • 当同一个测试对象出现不同尺度的时候,这种方法的检测效果欠佳。