目标检测算法
R-CNN
- 利用selective search提出region proposal(RP),将这些RP warp到统一的大小。
- 将上一步的RP一个接一个串联的送入卷积神经网络提取特征,并将这些特征保存到硬盘上。
- 读取硬盘上保存的特征送入SVM进行分类。
- 将SVM分类好的RP送入bbox regressor进行回归处理。
优点
- 使用了卷积神经网络进行特征提取。
- 使用bounding box regression进行目标包围框的修正。
- 精度显著提高,PASCAL VOC2010从35.1%到53.7%。
- 将CNN网络应用于目标检测领域并实现了图像特征自动提取。
缺点
- 耗时的selective search,对一帧图像,需要花费2s。
- 耗时的串行式CNN前向传播,对于每一个RoI,都需要经过一个AlexNet提特征,为所有的RoI提特征大约花费47s。
- 三个模块是分别训练的,并且在训练的时候,对于存储空间的消耗很大。
SPP-Net
pipeline
- 同样也用selective search等方法提取出候选区域(RP)。
- 对原图进行一次特征提取,计算出RP在feature map上的映射patch。
- 将patch送入spp layer统一池化到相同的大小。
- 在送到之后的层,完成分类和回归。
优点
- 引入了空间金字塔池化,适应各种不同尺寸的特征图。
- R-CNN要对每个RP算一次卷积,而SPP-Net只算一次卷积,再找出RP在feature map对应的patch,通过spp layer统一到同样大小,节约了大量时间。
缺点
- 同样该网络不是end-end的。
Fast R-CNN
pipeline
- 同样也是用selective search选择出2000个region proposal(RP)。
- (像SPP-Net一样)对原图进行一次特征提取,找到RP在feature map上映射的patch,将patch送入ROI pooling layer统一下采样到7 x 7。
- 之后跟全连接层,使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去Region Proposal提取阶段)。
优点
- 引入spp pooling,只用对图像做一次特征提取然后在feature map上找到对应patch,pool到统一大小。
- 引入多任务学习,分类和回归共享卷积特征。
- 除去region proposal外整个网络是end to end的。
- 在VOC2012的mAP提升到了68.4%,而R-CNN为62.4%。
缺点
- 还是要预先提取region proposal,非常耗时。
Faster R-CNN
主要改变是取消了region proposal,提出一个新的网络region proposal network(RPN)来生成待检测区域。
pipeline
- 使用共享的卷积层提取图片特征,将提取到的特征送入RPN生成待检测框,并对待检测框进行修正。
- 根据RPN的输出在feature map上选取对应的patch,送入ROI pooling layer,输出统一大小(6 x 6)。
- 之后和Fast R-CNN一样,送入全连接层,然后进行回归和分类。
优点
- Faster R-CNN是真真正正的end to end的网络。
- 采用了先验框,网络学习的是对于先验框的偏移,比直接学习框的位置要容易些。
- 在GPU上达到了实时(5fpsbased VGG & 17fps based ZF)。
- 精度高了,COCO检测42.1%,而Fast R-CNN为39.3%。
缺点
- 对小物体的检测还是不太好。
- 速度还是不够快。
细节
因为faster r-cnn的细节较多,这里单列一个小节来着重讲解。
-
RPN
RPN在feature map上先进行3 x 3的滑动窗口卷积且output_channels = 256,之后在分别进行两个1 x 1的卷积 ,第一个卷积是输出cls,输出channel为2 * k(2是二分类,判断anchor是前景还是背景,即判断这个anchor里有没有目标,k是anchaor数量,文中设置为9);第二个卷积是输出reg,输出channel为4 * k(4是anchor的4个坐标偏移量[x, y, w, h],k同上)。
- k个anchor
文中为每个位置预先设定好了k=9个长宽比与面积的先验框,这9个先验框包含三种面积(128 x128,256 x 256, 512 x 512),每种面积又包含三种长宽比(1:1,1:2, 2:1) 。
- anchor的分类
anchor的分类采用softmaxLoss进行训练,那么anchor的label是什么呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。在作者进行RPN网络训练的时候,只使用了上述两类anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。而由于一张图生成的anchor数量比较多(对于40 x 60的特征图,有40 x 60 x 9 = 21600个),因此随机抽取128个前景anchor与128个背景anchor进行训练。
- anchor的回归
anchor的回归主要是训练anchor的修正值[ t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th],这四个值的意思是修正后的anchor在原来anchor基础上x和y方向上的偏移(由 t x , t y t_x, t_y tx,ty决定),并且长宽放大一定倍数(由 t w , t h t_w, t_h tw,th决定)。让我们看看[ t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th]的公式定义:
t x = ( x − x a ) / w a , t x ∗ = ( x ∗ − x a ) / w a t y = ( y − y a ) / h a , t y ∗ = ( y ∗ − y a ) / h a t w = l o g ( w / w a ) , t w ∗ = l o g ( w ∗ / w a ) t h = l o g ( h / h a ) , t h ∗ = l o g ( h ∗ / h a ) t_x = (x - x_a) / w_a, \quad t_x^* = (x^* - x_a) / w_a \\ t_y = (y - y_a) / h_a, \quad t_y^* = (y^* - y_a) / h_a \\ t_w = log(w/w_a), \quad t_w^* = log(w^*/w_a) \\ t_h = log(h/h_a), \quad t_h^* = log(h^*/h_a) tx=(x−xa)/wa,tx∗=(x∗−xa)/waty=(y−ya)/ha,ty∗=(y∗−ya)/hatw=log(w/wa),tw∗=log(w∗/wa)th=log(h/ha),th∗=log(h∗/ha)x, y, w, h分别代表anchor的中心点坐标和宽高。x代表预测的anchor, x a x_a