基于深度学习的目标检测算法1----RCNN(Region with CNN features)
Girshick R, Donahue J, Darrell T, et al. Rich feature hierarchies for accurate object detection and semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2014: 580-587.
和图像分类不同,目标检测需要解决的一个关键问题就是怎么去定位图像里的目标?另外还有一个问题是带标签的数据不够如何去训练CNN?带着两个问题去学一下RCNN。
1.关于定位问题的解决,使用recognition using regions的方法,也就是给出2000个候选区域。
2.标签数据不够的解决,是使用无监督的预训练,然后进行有监督的微调。在一个大的辅助数据集(ILSVRC)上进行有监督的预训练,然后在小数据集(pascal)上进行特定领域的微调,这是在数据稀缺时学习大容量CNN的有效方法。
RCNN的流程如下:
主要包含三个模块:
- 产生类别之间相互独立的候选区域(
category-independent region proposalsRegion proposals
),这些候选区域后面作为CNN的输入; - 卷积网络CNN,用来产生固定长度的特征;
- 线性SVM分类器,用来对每一个输入的候选区域进行分类。
RCNN的具体流程:
1.通过selective search 算法提取大概2000个候选区域;
2.对每一个候选框进行warp成相同的尺寸,然后送入CNN,输出特征向量。
3.对每一个类别,都分别训练了一个SVM,使用SVM对这个特征向量进行评分,从而得到这个区域对应的分数。
4.求出所有区域对应的得分之后,送入全连接网络进行回归(Bounding box regression),精细修正候选框位置坐标信息。运用非极大值抑制(每个类别之间相互独立),去除大于交并比阈值的那些区域,只保留最主要的区域。
RCNN的优点:
- 所有的类别都共享CNN参数;
- 经过CNN计算出来的参数都是低维特征向量;
对每一类特定的计算是特征向量和支持向量机权重之间的点积和非最大抑制计算。
非极大值抑制:是一种去除非极大值的算法。
给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si, 1<=i<=N。
0、建造一个存放待处理候选框的集合H,初始化为包含全部N个框; 建造一个存放最优框的集合M,初始化为空集。
1、将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;
2、遍历集合 H 中的框,分别与框 m 计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m 重叠,将此框从集合 H 中去除。
3、回到第1步进行迭代,直到集合 H 为空。集合 M 中的框为我们所需。
需要优化的参数:IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。
参考自这里。
交并比函数: I O U = area ( R O I T ∩ R O I G ) area ( R O I T ∪ R O I G ) I O U=\frac{\operatorname{area}\left(R O I_{T} \cap R O I_{G}\right)}{\operatorname{area}\left(R O I_{T} \cup R O I_{G}\right)} IOU=area(ROIT∪ROIG)area(ROIT∩ROIG)
两个区域的交集面积/并集面积。
假设矩形T的左下角坐标(X0,Y0)(X0,Y0),右上角坐标(X1,Y1)(X1,Y1);
矩形G的左下角坐标(A0,B0)(A0,B0),右上角坐标(A1,B1)(A1,B1).
公式可以化为:
I O U = area ( R O I T ∩ R O I G ) S X Y + S A B − area ( R O I T ∩ R O I G ) I O U=\frac{\operatorname{area}\left(R O I_{T} \cap R O I_{G}\right)}{S_{X Y}+S_{A B}-\operatorname{area}\left(R O I_{T} \cap R O I_{G}\right)} IOU=SXY+SAB−area(ROIT∩ROIG)area(ROIT∩ROIG)
只需要求解两个区域的相交面积。
具体可以参考这里。
如何去训练得到正确的候选区域?
考虑训练二元分类器来检测汽车,那么紧紧围绕汽车的图像区域应该是正标签。同样,很明显,一个与汽车无关的背景区域应该是一个负标签。关键是一个与骑车部分交叠的图像区域,应该怎么处理?定义一个交并比函数intersection-overunion(IoU)阈值,低于这个阈值的就认为是负标签,阈值一般取{0,0.1,…,0.5}。阈值的选取具有重要影响。
Ground Truth: 就是指正确打标签的训练数据 或 简单来说就是有效的正确的数据
为什么RCNN单独训练了一个SVM而不是直接用卷积层的softmax输出?
作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度。
参考自R-CNN论文详解(论文翻译)。
BoundingBox-Regression(BBR)
1.为什么要进行边框回归?
Selective Search提取的Region Proposal与Ground Truth差距较大,不能准确定位,就需要使用Bounding-box regression对Region Proposal进行微调,使得更接近Ground Truth。
2.边框回归是什么?
对于窗口一般使用四维向量(x,y,w,h) 来表示, 分别表示窗口的中心点坐标和宽高。 对于下图, 红色的框 P 代表原始的Proposal, 绿色的框 G 代表目标的 Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G 更接近的回归窗口
G
^
\hat{G}
G^。
目标:给定
(
P
x
,
P
y
,
P
w
,
P
h
)
\left(P_{x}, P_{y}, P_{w}, P_{h}\right)
(Px,Py,Pw,Ph),找一个映射使得:
f
(
P
x
,
P
y
,
P
w
,
P
h
)
=
(
G
^
x
,
G
^
y
,
G
^
w
,
G
^
h
)
f\left(P_{x}, P_{y}, P_{w}, P_{h}\right)=\left(\hat{G}_{x}, \hat{G}_{y}, \hat{G}_{w}, \hat{G}_{h}\right)
f(Px,Py,Pw,Ph)=(G^x,G^y,G^w,G^h),并且,
(
G
^
x
,
G
^
y
,
G
w
^
,
G
^
h
)
≈
(
G
x
,
G
y
,
G
w
,
G
h
)
\left(\hat{G}_{x}, \hat{G}_{y}, \hat{G_{w}}, \hat{G}_{h}\right) \approx\left(G_{x}, G_{y}, G_{w}, G_{h}\right)
(G^x,G^y,Gw^,G^h)≈(Gx,Gy,Gw,Gh)。
经过的变换就是:平移+尺度放缩,
1)先做平移,
(
Δ
x
,
Δ
y
)
,
Δ
x
=
P
w
d
x
(
P
)
,
Δ
y
=
P
h
d
y
(
P
)
(\Delta x, \Delta y), \quad \Delta x=P_{w} d_{x}(P), \Delta y=P_{h} d_{y}(P)
(Δx,Δy),Δx=Pwdx(P),Δy=Phdy(P)
那么:
G
^
x
=
P
w
d
x
(
P
)
+
P
x
,
(
1
)
G
^
y
=
P
h
d
y
(
P
)
+
P
y
,
(
2
)
\begin{aligned} \hat{G}_{x} &=P_{w} d_{x}(P)+P_{x},(1) \\ \hat{G}_{y} &=P_{h} d_{y}(P)+P_{y},(2) \end{aligned}
G^xG^y=Pwdx(P)+Px,(1)=Phdy(P)+Py,(2)
2)再做尺缩,
(
S
w
,
S
h
)
,
S
w
=
exp
(
d
w
(
P
)
)
,
S
h
=
exp
(
d
h
(
P
)
)
\left(S_{w}, S_{h}\right), S_{w}=\exp \left(d_{w}(P)\right), S_{h}=\exp \left(d_{h}(P)\right)
(Sw,Sh),Sw=exp(dw(P)),Sh=exp(dh(P)),那么:
G
^
w
=
P
w
exp
(
d
w
(
P
)
)
,
(
3
)
G
^
h
=
P
h
exp
(
d
h
(
P
)
)
,
(
4
)
\begin{aligned} \hat{G}_{w} &=P_{w} \exp \left(d_{w}(P)\right),(3) \\ \hat{G}_{h} &=P_{h} \exp \left(d_{h}(P)\right),(4) \end{aligned}
G^wG^h=Pwexp(dw(P)),(3)=Phexp(dh(P)),(4)
观察(1)-(4)我们发现, 边框回归学习就是
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P)
dx(P),dy(P),dw(P),dh(P)这四个变换。下一步就是设计算法那得到这四个映射。
线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近. 即 Y ≈ W X Y \approx W X Y≈WX 。 那么 Bounding-box 中我们的输入以及输出分别是什么呢?
输入
RegionProposal → P = ( P x , P y , P w , P h ) \rightarrow P=\left(P_{x}, P_{y}, P_{w}, P_{h}\right) →P=(Px,Py,Pw,Ph),这个是什么? 输入就是这四个数值吗?其实真正的输入是这个窗口对应的 CNN 特征,也就是 R-CNN 中的 Pool5 feature(特征向量)。 (注:训练阶段输入还包括 Ground Truth, 也就是下边提到的 t ∗ = ( t x , t y , t w , t h ) t_{*}=\left(t_{x}, t_{y}, t_{w}, t_{h}\right) t∗=(tx,ty,tw,th)。
输出
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P)
dx(P),dy(P),dw(P),dh(P)这四个变换就是我们要得到的输出,它们得到的并不是真实值 G, 而是预测值
G
^
\hat{G}
G^。那么,经过 Ground Truth 和 Proposal 计算得到的真正需要的平移量是下面这些:
t
x
=
(
G
x
−
P
x
)
/
P
w
,
(
6
)
t_{x}=\left(G_{x}-P_{x}\right) / P_{w},(6)
tx=(Gx−Px)/Pw,(6)
t
y
=
(
G
y
−
P
y
)
/
P
h
,
(
7
)
t_{y}=\left(G_{y}-P_{y}\right) / P_{h},(7)
ty=(Gy−Py)/Ph,(7)
t
w
=
log
(
G
w
/
P
w
)
,
(
8
)
t_{w}=\log \left(G_{w} / P_{w}\right),(8)
tw=log(Gw/Pw),(8)
t
h
=
log
(
G
h
/
P
h
)
,
(
9
)
t_{h}=\log \left(G_{h} / P_{h}\right),(9)
th=log(Gh/Ph),(9)
那么,将目标函数设为
d
∗
(
P
)
=
w
∗
T
Φ
5
(
P
)
d_{*}(P)=w_{*}^{T} \Phi_{5}(P)
d∗(P)=w∗TΦ5(P),
Φ
5
(
P
)
\Phi_{5}(P)
Φ5(P)是输入 Proposal 的特征向量,
w
∗
w_{*}
w∗是要学习的参数,(*表示 x,y,w,h, 也就是每一个变换对应一个目标函数) ,
d
∗
(
P
)
d_{*}(P)
d∗(P)是得到的预测值。 我们要让预测值跟真实值
t
∗
=
(
t
x
,
t
y
,
t
w
,
t
h
)
t_{*}=\left(t_{x}, t_{y}, t_{w}, t_{h}\right)
t∗=(tx,ty,tw,th)差距最小, 得到损失函数为:
Loss
=
∑
i
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
i
)
)
2
=\sum_{i}^{N}\left(t_{*}^{i}-\hat{w}_{*}^{T} \phi_{5}\left(P^{i}\right)\right)^{2}
=∑iN(t∗i−w^∗Tϕ5(Pi))2
函数优化目标为:
W
∗
=
argmin
w
.
∑
i
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
i
)
)
2
+
λ
∥
w
^
∗
∥
2
W_{*}=\operatorname{argmin}_{w .} \sum_{i}^{N}\left(t_{*}^{i}-\hat{w}_{*}^{T} \phi_{5}\left(P^{i}\right)\right)^{2}+\lambda\left\|\hat{w}_{*}\right\|^{2}
W∗=argminw.∑iN(t∗i−w^∗Tϕ5(Pi))2+λ∥w^∗∥2
利用梯度下降法或者最小二乘法就可以得到 w∗。
这一块主要参考边框回归(Bounding Box Regression)详解。
因为这一块知识比较重要,在很多目标检测算法中都涉及,因此在此,又摘录一遍,加深理解。