您的位置:首页 > 其它

fast r-cnn笔记

2017-11-22 09:59 211 查看
1. Introduction

关键点:从多阶段(multi stage)训练合并到single stage 训练

1.1 R-CNN存在的问题

多个训练阶段 multi stage pipeline:finetuing, svm classifier, bbox regressor

空间、时间上expensive:SVM, bbox regressor训练输入的cnn特征保存在磁盘

目标检测速度慢:每一个proposal都要经过cnn计算特征

SPPnet:基于R-CNN每个proposal都要计算cnn特征提出的改进,主要利用了spatial pyramid pooling技术(2006年论文):

图片输入到CNN,获得该图片的卷积特征。再从该feature map上提取feature vector用来表示region proposal.

方法:提取多个固定大小的pooling,拼接在一起

a.max pooling the portion of the feature map inside the proposal into a fixed size output.e.g. 6*6

b. multiple output sizes are pooled, and concatenated by spatial pyramid pooling.

除了SPPnet的改进点,其他和R-CNN差不多:如多阶段训练。但SPPnet训练不更新spatial pyramid pooling之前的卷积层

1.2创新点

更高的检测准确率

单阶段训练,使用多任务loss

训练时可更新所有网络层

不需要写磁盘

2.架构

输入:整张图片和proposal集合,输入图片生成feature map。对于每一个proposal,RoI(region of Interest)pooling layer从feature map中提取固定长度feature vector。feature vector输入全连接层,之后分两路:softmax分类层(K类+背景)和bbox回归层(为每个k类中的对象输出四个实数值--bbox位置的修订值)。

2.1 RoI pooling layer

使用max pooling to convert the features inside any valid region of interest into 固定大小H*W(H,W为超参数)的feature map

RoI定义:卷积feature map中的一个矩形window。(r,c,h,w):左上角坐标和高度、宽度

RoI max pooling:将h*w的RoI窗口分为H*W的网格子窗口,子窗口size大约为h/H * w/W,每个子窗口上做max pooling形成网格输出。(如同标准max pooling,在每个channel上都做pooling)。因此无论h、w多大,最终输出是统一大小,为H*W 

RoI layer可以认为是SPPnet中spatial pyramid pooling layer(只有一个pyramid level)的特例。pooling子窗口的计算同SPPnet。

2.2网络结构

预训练cnn模型最后一层max pooling替换为RoI pooling层,H,W的设置要符合网络的第一个全连接层大小(对于VGG16,H=W=7???---因为原始fc之前为7*7*512?)

最后一层fc层替换为:fc+softmax(k+1分类),fc + bbox regressor

网络输入:图片list, 图像的RoI list

2.3

fast R-CNN可以更新网络所有的权重。

SPPnet不能更新spp层之前的权重的原因:每个训练样本(如RoI)comes from a different image时(R-CNN和SPPnet正是按这样的训练方式。理解:R-CNN训练输入是region proposal图片,一个批次有很多图片。那么若使用RoI层,感受野是很大的),bp算法通过spp层时效率很低--RoI可能有非常大的感受野,甚至跨越整张图片。因为前向计算需要处理整个感受野,所以训练输入会很大(比如整张图片)

我们提出的训练方法更有效,利用了训练阶段的feature sharing:SGD minibatch垂直采样--先采样N张图片,然后每张图片采样R/N个RoI。同一张图片的RoI在前向后向阶段中共享计算和内存。N取较小值降低了minibatch的计算量。例如,N=2,R=128,比从128张图片中采样1个RoI(这正是R-CNN、SPPnet的方式)快64倍(me:想象一下,输入128张图片,经过RoI层,能得到好的金字塔采样特征吗?)

concern:该策略可能导致训练收敛慢,因为同一张图片的RoI相关性很大。但实践中并未出现--使用N=2,R=128比R-CNN的训练迭代次数更少。

除了垂直采样,fast R-CNN在finetuning阶段联合优化softmax分类和bbox回归

Multitask loss

参考;http://www.echojb.com/image/2016/10/21/241511.html

两个输出层:

softmax层:全连接层的k+1个输出,计算softmax p=(p0..pk)

bbox回归层:k类中对每一个类都输出bbox regression offset tk(txk,tyk,twk,thk),k为索引。tk指定了相对于proposal box的scale-invariant translation(尺度不变的平移)和log-space heigh/width shift(对数空间中相对于proposal的高和宽),即预测的offset值。

每个training RoI都标记了一个ground truth类u和一个ground truth bbox回归目标v。

对每个标记的RoI使用multi task loss L联合训练:

L(p,u,tu,v) = Lcls(p,u) + lambda[u>=1]Lloc(tu,v)

其中Lcls(p,u) = -logpu ,即true class u的log loss

Lloc:对类别u,其真实bbox回归目标(即标记的bbox值,即R-CNN公式中的真实目标值)为(vx,vy,vw,vh),

预测的offset(特征向量乘以待学习参数向量后的预测值)为 tu=(txu,tyu,twu,thu)

Lloc(tu,v)=ΣsmothL1(tiu-vi) i=(x,y,w,h)

smoothL1(x) = 0.5*x*x       if|x|<1

           = |x| - 0.5     otherwise

smooth L1相对于L1更为robust,和L2相比,对outliers异常值不敏感。如果回归目标unbounded,使用L2训练需要小心调整学习率避免梯度爆炸(me:smooth L1的函数,当x比较大时,输出是线性增长的,若采用均方误差函数,势必造成输出膨胀)

[u>=1]:u>=1时值为1,否则为0(背景类u=0,即背景类不考虑bbox,忽略损失函数)

lambda参数平衡两个loss权重,设为1。vi经过归一化处理,0均值,unit variance。

minibatch sampling

N=2,R=128 每个batch两张图片,每个图片采样64个RoI

25%(32个)的RoI为与ground truth bbox IoU overlap超过0.5的proposal,作为forground class,即u>=1

75%的RoI从与ground truth bbox IoU overlap[0.1,0.5)区间中采样,即background class,u=0.

阈值0.1貌似起到了启发式 hard example mining的作用。

data augmentation:图片50%概率水平翻转,

RoI pooling layer的反向传播计算

设xi为RoI层的第i个输入,

yrj为RoI层第r个RoI的第j个输出

根据定义,yrj=xi*(r,j),i*(r,j)=argmax xi'

即x为subwindow中使x取得最大值的值

那么loss L对输入xi求偏导数,相当于当i=i*(r,j)时对yrj求偏导数(求和:类似于bp公式推导中的步骤?)

,而对yrj导数可求出,故对xi也可求出。

SGD超参数

softmax、bbox全连接层:高斯分布,均值0,标准差分别为0.01、0.001.

偏值参数初始为0.

global learning rate 0.001

...

scale invariance

尺度不变的目标检测两种训练方法(参考SPPnet论文):

brute-force训练:每个图片训练、测试时都是预定义好的尺寸

图像金字塔:测试时使用图像金字塔归一化每个object proposal.训练时,采样一张图片时随机选择一个金字塔尺度作为数据增广。

3. fast R-CNN detection

输入:图片(或图片金字塔,a list of images)、R个object proposals

若使用图片金字塔,每个RoI赋予一个尺度scale,使得scaled RoI最接近224*224大小

对于每个RoI r,计算类别概率p、4个offset(对于每个类别k都计算offset)。

检测置信度:pk

对每个类别k执行非极大值抑制(和R-CNN类似)

3.1 Truncated SVD for faster detection

要处理的RoI较多,前向过程中将近一半时间花在全连接层的计算。而全连接层可使用truncated SVD来压缩,加速计算

截断奇异值分解(Truncated singular value decomposition,TSVD):u*v的权重矩阵W可以使用SVD分解(factorize)为UΣtVT

U:u*t矩阵,comprising the first t left-singular values of W

Σt:t*t diagonal matrix containing the top t singular values of W

V: v*t矩阵,comprising the first t right-singular values of W

TSVD将参数量由u*v降低到t(u+v),如果t比min(u,v)小很多,则价值大。

实现:W对应的全连接层替换为两个全连接层,without non-linearity

第一个使用权重矩阵ΣtVT,无bias

第二个使用U,有bias

section 4

voc2007测试结果:VGG16上和SPPnet(使用5个scale)相比,fast R-CNN只使用single scale for train/test,但卷积层finetune带来很大提升(详见4.5节,对于深层网络如vgg16,finetune卷积层很有必要!!)

4.4

fast R-CNN和R-CNN相比:

预测:

不使用TSVD:快146倍,使用TSVD:快213倍

训练:减小9倍

TSVD:预测速度提升30%,准确率只降低0.3

4.5

对于深层网络如vgg16,finetune卷积层很有必要。但所有卷积层都要tune吗?

不是!对于小型网络,conv1足够通用(generic and task independent),文献14最早提出。

对于vgg16,conv3_1及以上的层才有必要tune:实验表明从conv2_1层开始tune,训练时间1.3倍,但是mAP只提高了0.3

5. design evaluation

多任务训练有帮助吗?

尺度不变如何训练?brute force还是多尺度?

需要更多的训练数据吗?

SVM分类超过softmax了吗?

更多proposal是否总是更好?---sparse vs dense?

5.1 multi task loss help?

对比实验:对准确率有提高

5.2 scale invariance

scale s: the length of image's shortest side

vgg16 s设为600,主要考虑内存占用。---用更大值效果会更好

(若输入图片较小,扩大图片相当于上采样;若较大,相当于图片压缩)

single-scale和muti scale效果相当---网络对scale 有一定的自适应能力
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息