Bounding-Box regression
最近一直看检测有关的Paper, 从rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到今年cvpr最新的yolo9000。这些paper中损失函数都包含了边框回归,除了rcnn详细介绍了,其余的paper都是一笔带过,或者直接引用rcnn就把损失函数写出来了。前三条网上解释比较多,后面的两条我看了不少paper,才得出这些结论。web
为何要边框回归?
什么是边框回归?
边框回归怎么作的?
边框回归为何宽高,坐标会设计这种形式?
为何边框回归只能微调,在离Ground Truth近的时候才能生效?
为何要边框回归?
这里引用王斌师兄的理解,以下图所示: 算法
对于上图,绿色的框表示Ground Truth, 红色的框为Selective Search提取的Region Proposal。那么即使红色的框被分类器识别为飞机,可是因为红色的框定位不许(IoU<0.5), 那么这张图至关于没有正确的检测出飞机。 若是咱们能对红色的框进行微调, 使得通过微调后的窗口跟Ground Truth 更接近, 这样岂不是定位会更准确。 确实,Bounding-box regression 就是用来微调这个窗口的。app
边框回归是什么?
继续借用师兄的理解:对于窗口通常使用四维向量
( x , y , w , h )
来表示, 分别表示窗口的中心点坐标和宽高。 对于图 2, 红色的框 P 表明原始的Proposal, 绿色的框 G 表明目标的 Ground Truth, 咱们的目标是寻找一种关系使得输入原始的窗口 P 通过映射获得一个跟真实窗口 G 更接近的回归窗口
G ^
。svg
边框回归的目的既是:给定
( P x , P y , P w , P h )
寻找一种映射
f
, 使得
f ( P x , P y , P w , P h ) = ( G x ^ , G y ^ , G w ^ , G h ^ )
而且
( G x ^ , G y ^ , G w ^ , G h ^ ) ≈ ( G x , G y , G w , G h )
函数
边框回归怎么作的?
那么通过何种变换才能从图 2 中的窗口 P 变为窗口
G ^
呢? 比较简单的思路就是: 平移+尺度放缩 学习
先作平移
( Δ x , Δ y )
,
Δ x = P w d x ( P ) , Δ y = P h d y ( P )
这是R-CNN论文的:
G ^ x = P w d x ( P ) + P x , ( 1 )
G ^ y = P h d y ( P ) + P y , ( 2 )
而后再作尺度缩放
( S w , S h )
,
S w = e x p ( d w ( P ) ) , S h = e x p ( d h ( P ) )
, 对应论文中:
G ^ w = P w e x p ( d w ( P ) ) , ( 3 )
G ^ h = P h e x p ( d h ( P ) ) , ( 4 )
观察(1)-(4)咱们发现, 边框回归学习就是
d x ( P ) , d y ( P ) , d w ( P ) , d h ( P )
这四个变换。下一步就是设计算法那获得这四个映射。优化
线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得通过线性回归后的值跟真实值 Y(Ground Truth)很是接近. 即
Y ≈ W X
。 那么 Bounding-box 中咱们的输入以及输出分别是什么呢?atom
R e g i o n P r o p o s a l → P = ( P x , P y , P w , P h )
,这个是什么? 输入就是这四个数值吗?其实真正的输入是这个窗口对应的 CNN 特征,也就是 R-CNN 中的 Pool5 feature(特征向量)。 (注:训练阶段输入还包括 Ground Truth, 也就是下边提到的
t ∗ = ( t x , t y , t w , t h )
)spa
Output:
须要进行的平移变换和尺度缩放
d x ( P ) , d y ( P ) , d w ( P ) , d h ( P )
, 或者说是
Δ x , Δ y , S w , S h
。 咱们的最终输出不该该是 Ground Truth 吗? 是的, 可是有了这四个变换咱们就能够直接获得 Ground Truth, 这里还有个问题, 根据(1)~(4)咱们能够知道, P 通过
d x ( P ) , d y ( P ) , d w ( P ) , d h ( P )
获得的并非真实值 G, 而是预测值
G ^
。 的确, 这四个值应该是通过 Ground Truth 和 Proposal 计算获得的真正须要的平移量
( t x , t y )
和尺度缩放
( t w , t h )
。 这也就是 R-CNN 中的(6)~(9): .net
t x = ( G x − P x ) / P w , ( 6 )
t y = ( G y − P y ) / P h , ( 7 )
t w = log ( G w / P w ) , ( 8 )
t h = log ( G h / P h ) , ( 9 )
那么目标函数能够表示为
d ∗ ( P ) = w T ∗ Φ 5 ( P )
,
Φ 5 ( P )
是输入 Proposal 的特征向量,
w ∗
是要学习的参数(*表示 x,y,w,h, 也就是每个变换对应一个目标函数) ,
d ∗ ( P )
是获得的预测值。 咱们要让预测值跟真实值
t ∗ = ( t x , t y , t w , t h )
差距最小, 获得损失函数为:
L o s s = ∑ i N ( t i ∗ − w ^ T ∗ ϕ 5 ( P i ) ) 2
函数优化目标为:
W ∗ = a r g m i n w ∗ ∑ i N ( t i ∗ − w ^ T ∗ ϕ 5 ( P i ) ) 2 + λ | | w ^ ∗ | | 2
利用梯度降低法或者最小二乘法就能够获得
w ∗
。
为何宽高尺度会设计这种形式?
这边我重点解释一下为何设计的
t x , t y
为何除以宽高,为何
t w , t h
会有log形式!!!
首先CNN具备尺度不变性 , 以图3为例:
x,y 坐标除以宽高
上图的两我的具备不一样的尺度,由于他都是人,咱们获得的特征相同。假设咱们获得的特征为
ϕ 1 , ϕ 2
,那么一个无缺的特征应该具有
ϕ 1 = ϕ
。ok,若是咱们直接学习坐标差值,以x坐标为例,
x i , p i
分别表明第i个框的x坐标,学习到的映射为
f
,
f ( ϕ 1 ) = x 1 − p 1
,同理
f ( ϕ 2 ) = x 2 − p 2
。从上图显而易见,
x 1 − p 1 ≠ x 2 − p 1
。也就是说同一个x对应多个y,这明显不知足函数的定义。边框回归学习的是回归函数,然而你的目标却不知足函数定义,固然学习不到什么。
宽高坐标Log形式
咱们想要获得一个放缩的尺度,也就是说这里限制尺度必须大于0。咱们学习的
t w , t h
怎么保证知足大于0呢?直观的想法就是EXP函数,如公式(3), (4)所示,那么反过来推导就是Log函数的来源了。
为何IoU较大,认为是线性变换?
当输入的 Proposal 与 Ground Truth 相差较小时(RCNN 设置的是 IoU>0.6), 能够认为这种变换是一种线性变换, 那么咱们就能够用线性回归来建模对窗口进行微调, 不然会致使训练的回归模型不 work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这里我来解释:
Log函数明显不知足线性函数,可是为何当Proposal 和Ground Truth相差较小的时候,就能够认为是一种线性变换呢?你们还记得这个公式不?参看高数1。
l i m x = 0 l o g ( 1 + x ) = x
如今回过来看公式(8):
t w = log ( G w / P w ) = l o g ( G w + P w − P w P w ) = l o g ( 1 + G w − P w P w )
当且仅当
G w − P w
=0的时候,才会是线性函数,也就是宽度和高度必须近似相等。
对于IoU大于指定值这块,我并不认同做者的说法。我我的理解,只保证Region Proposal和Ground Truth的宽高相差很少就能知足回归条件。x,y位置到没有太多限制,这点咱们从YOLOv2能够看出,原始的边框回归其实x,y的位置相对来讲对很大的。这也是YOLOv2的改进地方。详情请参考个人博客YOLOv2 。
总结
里面不少都是参考师兄在caffe社区的回答 ,原本不想重复打字的,可是美观的强迫症,让我手动把latex公式巴拉巴拉敲完,固然也为了让你们看起来顺眼。后面还有一些公式那块资料不多,是我在阅读paper+我的总结,不对的地方还请你们留言多多指正。