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)
这是除了R-CNN以外很多论文都只是简略阐述的一部分内容,所以参考几篇回答以后在这里总结边框回归的具体概念。
过程简述 边框回归的目的:对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样定位会更准确。Bounding-box regression 就是用来微调这个窗口的一种思路。
一个bounding box可以用四维向量( x , y , w , h ) (x,y,w,h) ( x , y , w , h ) 来表示,Ground Truth也可以做出同样表示,那么便可光回顾的总体目标作出粗略描述。
(1.1) G i v e n : ( P x , P y , P w , P h ) Given:( P_x,P_y,P_w,P_h ) tag{1.1} G i v e n : ( P x , P y , P w , P h ) ( 1 . 1 ) (1.2) F i n d : f ( P x , P y , P w , P h ) ≈ G ( P x , P y , P w , P h ) Find: f( P_x,P_y,P_w,P_h ) approx G(P_x,P_y,P_w,P_h) tag{1.2} F i n d : f ( P x , P y , P w , P h ) ≈ G ( P x , P y , P w , P h ) ( 1 . 2 )
那么经过何种变换才能从图 2 中的窗口P P P 变为窗口G G G 呢? 比较简单的思路就是平移结合尺度放缩。
先做平移( Δ x , Δ y ) ( Δ x , Δ y ) , Δ x = P w d x ( P ) , Δ y = P h d y ( P ) Δ x = P w d x ( P ) , Δ y = P h d y ( 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) ( Δ x , Δ y ) ( Δ x , Δ y ) , Δ x = P w d x ( P ) , Δ y = P h d y ( P ) Δ x = P w d x ( P ) , Δ y = P h d y ( P ) (1.3) G x = P w d x ( P ) + P x , G_x=P_wd_x(P)+P_x,tag{1.3} G x = P w d x ( P ) + P x , ( 1 . 3 ) (1.4) G y = P h d y ( P ) + P y , G_y=P_hd_y(P)+P_y,tag{1.4} G y = P h d y ( P ) + P y , ( 1 . 4 ) 然后再做尺度缩放( S w , S h ) ( S w , S h ) , (S_w,S_h)(S_w,S_h), ( S w , S h ) ( S w , S h ) , S w = e x p ( d w ( P ) ) , S h = e x p ( d h ( P ) ) S w = e x p ( d w ( P ) ) , S h = e x p ( d h ( P ) ) , S_w=exp(d_w(P)),S_h=exp(d_h(P))S_w=exp(d_w(P)),Sh=exp(d_h(P)), S w = e x p ( d w ( P ) ) , S h = e x p ( d h ( P ) ) S w = e x p ( d w ( P ) ) , S h = e x p ( d h ( P ) ) , 对应论文中:(1.5) G w = P w ⋅ e x p ( d w ( P ) ) , G_w=P_w cdot exp(d_w(P)),tag{1.5} G w = P w ⋅ e x p ( d w ( P ) ) , ( 1 . 5 ) (1.6) G h = P h ⋅ e x p ( d h ( P ) ) , G_h=P_h cdot exp(d_h(P)),tag{1.6} G h = P h ⋅ e x p ( d h ( P ) ) , ( 1 . 6 ) 观察( 1.3 ) (1.3) ( 1 . 3 ) ~( 1.6 ) (1.6) ( 1 . 6 ) 我们发现, 边框回归学习就是d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) 这四个变换。接下来就是设计算法得到这四个映射。
算法过程
输入: 该窗口对应的CNN特征,通常指的是Pool5 feature那个特征向量,以及所需要的Ground Truth(通常指的是偏移量t ∗ = ( t x , t y , t w , t h ) t_* = (t_x,t_y,t_w,t_h) t ∗ = ( t x , t y , t w , t h ) 其中$t x = ( G x − P x ) / P w tx=(Gx−Px)/Pw t x = ( G x − P x ) / P w ,t y = ( G y − P y ) / P h ty=(Gy−Py)/Ph t y = ( G y − P y ) / P h ,t w = l o g ( G w / P w ) tw=log(Gw/Pw) t w = l o g ( G w / P w ) ,t h = l o g ( G h / P h ) th=log(Gh/Ph) t h = l o g ( G h / P h ) 输出: d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) 回归: 使得d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) 与( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) ( t x , t y , t w , t h ) 尽量接近
优化函数:l o s s = ∑ i N ( t i − w i T Φ 5 i ) 2 + λ ∣ ∣ w i ∣ ∣ 2 loss=∑_i^N(t_i−w^T_iΦ_{5i})^2+λ||wi||^2 l o s s = i ∑ N ( t i − w i T Φ 5 i ) 2 + λ ∣ ∣ w i ∣ ∣ 2
2 YOLO技术框架
2.1 预测
首先是需要对图片进行分割成为 SxS 个网格,在作者论文里面给出的是S=7,于是把原图分成 7x7=49 个网格,每一个网格的大小是 64x64 。每个网格要预测B个bbox,每bbox除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的bbox中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:(2.1) P r ( O b j e c t ) ∗ I O U ( t r u t h ∣ p r e d ) P_r(Object)∗IOU(truth|pred) tag{2.1} P r ( O b j e c t ) ∗ I O U ( t r u t h ∣ p r e d ) ( 2 . 1 ) 其中如果有object落在一个grid cell里,P r ( O b j e c t ) P_r(Object) P r ( O b j e c t ) 取1,否则取0。 第二项是预测的bbox和实际的groundtruth之间的IoU值。 在预测的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
(2.2) P r ( C l a s s i ) ∗ I O U ( t r u t h ∣ p r e d ) P_r(Class_i)∗IOU(truth|pred) tag{2.2} P r ( C l a s s i ) ∗ I O U ( t r u t h ∣ p r e d ) ( 2 . 2 ) class信息是针对每个网格的,confidence信息是针对每个bounding box的。Attention 每个bbox要预测的是( x , y , w , h ) (x, y, w, h) ( x , y , w , h ) 和c o n f i d e n c e confidence c o n f i d e n c e 共5个值. 其中( x , y , w , h ) (x, y, w, h) ( x , y , w , h ) 并不是每个bbox的起始坐标和窗口宽度,x , y x,y x , y 是相对于其对应的网格的偏移o f f s e t offset o f f s e t ,w , h w,h w , h 是该窗口对应于整张图像的长宽比例。每个网格还要预测一个类别信息,记为C类。则S × S S times S S × S 个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S × S × ( 5 ∗ B + C ) S times S times (5*B+C) S × S × ( 5 ∗ B + C ) 的一个向量。
在算法的最后使用了非极大值抑制算法,求每一个网格的多个bbox到底哪个bbox是最有可能的窗口:(2.2) P r ( C l a s s i ) ∗ I O U ( t r u t h ∣ p r e d ) P_r(Class_i)∗IOU(truth|pred) tag{2.2} P r ( C l a s s i ) ∗ I O U ( t r u t h ∣ p r e d ) ( 2 . 2 )
2.2 训练
将标注框和相应grid cell匹配到一起
调整相应grid cell对应的分类
检查grid cell对应的B个预测窗口bbox,找到最好的那个并调整该窗口,并增加该窗口对应的confidence;与样本不太匹配的窗口bbox则降低置信度。
对于没有检测到ground truth的窗口,检测bbox的置信度并降低其对应预测窗口bbox的置信度,但是不改变分类、窗口坐标。
损失函数
$$$$
2.3 可能的提升
YOLO对于靠的很近的物体或者是小群体的检测效果不好,这是因为每个grid cell只能预测属于同一类的框。
当同一个测试对象出现不同尺度的时候,这种方法的检测效果欠佳。