本文笔者给大家分享rcnn、fast-rcnn、faster-rcnn这一系列的文章。
rcnn
rcnn对应的文章是《Rich feature hierarchies for accurate object detection and semantic segmentation》。
训练阶段
Region proposals。由图像生成候选框,每张图提取2000个proposals。
Feature extraction。每个proposal和某一类groundturth的overlap大于0.5为正样本,其余的是负样本,正负样本比率1:3。用该数据来ft的Alexnet的网络结构,使用softmax来分类。
classspecific linear SVM。对CNN提取的特征训练N个SVM二分类,N为类别数。
测试阶段
测试阶段和训练阶段相同,对一张图提取2000个proposal,每个proposal都要归一化到227*227大小,用CNN对其提取特征,然后后svm对其进行分类。注意作者用了一个线性回归做bounding bbox regression。
SPP-net
faster-rcnn系列必须不能少了spp-net,这有这样才能让读者更清晰的理解这个系列。需要注意的是SPP-net依旧采用Region proposals。
sppnet主要是实现spatial pyramid pooling,其不管输入的featureMap大小如何,输出的大小相同。如图所示,最后一个卷积层是256*w*h,256是卷积核的个数,这里分别对每个W*h的区域平均分成4*4=16块、2*2=4块、1*1=1块,然后对每块取max(最大值),得出21维特征,256个拼接起来就是256*21的特征长度。
训练时,分别实验固定224*224大小,采用180*180和224*224两种输入大小,和随机180到224之间大小进行网络训练。在测试的时候,对一张任意大小的图,直接计算出最后一层conv层的featureMap,然后对2000个proposal,计算出其在featureMap上的对应区域块,然后由SPP层算出对应特征,送到svm分类处理。
SPP-net大大提高了预测的速度,对全图计算一次特征即可,其局限性在于,不更新前面卷积层的参数(如要计算回传梯度,训练速度令人发指)。
fast-rcnn
fast-rcnn中使用到了ROI-pooling,ROI即是上图sppnet结构中只有一个网格结构的特例(原图中有4*4,2*2,1*1三种)。
对比与spp-net,fast-rcnn对整个网络层的参数都进行了更新。
训练阶段
每个batch送入2张image,每个image提取64个roi区域,每张image先由对应的CNN生成其featureMap层,然后roi区域根据坐标对应关系,获取其在featureMap上的位置。用对应区域的featureMap进行roi pooling操作,后面对应分类和bbox regression的训练(注意提取roi的时候,已经得到了其类别和bbox偏移量的label信息)。我们注意到roi pooling是有梯度回传函数的,所以前面的CNN网络参数也可以随之更新。
测试阶段
测试阶段每张图上取2000个proposal(fast-rcnn依旧没有摆脱proposal的命运),然后在全图的featuremap上取roi区域送入roi pooling来预测类别和bbox的回归。为了加速处理,将全连接层的权重W进行了SVD分解。
对比fast-rcnn和rcnn,将svm分类和bounding box回归统一到了CNN结构中,对整张图到最后一个卷积层featureMap的计算也只需全图计算一次,大大降低了重复的计算量。
faster-rcnn
随着fast-rcnn我们想到Region proposal一定需要从传统方法来解决么?faster-rcnn来帮助我们解决这一问题。faster-rcnn可以分解为region proposal network(RPN)加上fast-rcnn,此处笔者只介绍RPN的训练过程。
由faster-rcnn的结构图所示可以看出,论文用RPN来代替了传统的proposal方法。在RPN训练阶段,假设一张图在提取完特征后,最后一个卷积层的featureMap 是 256*W*H(这里假设为ZF模型,如果是VGG模型则是512*W*H),紧接着经过一个kernel是3pad是1的卷积核处理后,featureMap的大小不变还是256*W*H。此后分为两路,一路接一个卷积核为1*1,pad为0,输出为18的卷积层,处理后featureMap变为18*W*H;另一路接接一个卷积核为1*1,pad为0,输出为36的卷积层,处理后featureMap变为了36*W*H。注意到,这两路核为1*1的卷积层其实是其到fc层的作用,W*H的featureMap上的每个点,对应9*2个得分,9*4个bounding box的值,9即是anchors的个数。理论上,featureMap 上W*H个点对应的9*W*H个anchors的得分和bounding box的值都可以计算得到,但是在计算loss的时候,为了保证正负样本的比率问题,论文选用正负样本比率为1:1一共选择256个anchors来计算loss。loss的计算公式这里不详细介绍。
最后,我们注意到在整体训练faster-rcnn的时候,有4个loss,分别如下:
rpn_loss_cls: 用来判断某个anchor时候是roi区域;
rpn_loss_bbox:对anchor的坐标位置进行修正;
loss_cls : 对roi区域进行分类;
loss_bbox: 对roi区域的坐标位置进行修正;
关于faster-rcnn,笔者只介绍这么多,理解了RPN和fast-rcnn,也就理解了faster-rcnn这个系列。后续笔者会介绍yolo、ssd、rfcn检测系列和人脸识别的相关系列文章。
本文暂时没有评论,来添加一个吧(●'◡'●)