fast r-cnn笔记

来源:互联网 发布:windows 98 双核 编辑:程序博客网 时间:2024/06/06 02:07
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 有一定的自适应能力







原创粉丝点击