faster rcnn源码解析.docx
- 文档编号:1801295
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:7
- 大小:23KB
faster rcnn源码解析.docx
《faster rcnn源码解析.docx》由会员分享,可在线阅读,更多相关《faster rcnn源码解析.docx(7页珍藏版)》请在冰豆网上搜索。
fasterrcnn源码解析
fasterrcnn源码解析
整体框架
首先图片进行放缩到W*H,然后送入vgg16(去掉了pool5),得到featuremap(W/16,H/16)
1.然后featuremap上每个点都对应原图上的9个anchor,送入rpn层后输出两个:
这9个anchor前背景的概率以及4个坐标的回归
2.每个anchor经过回归后对应到原图,然后再对应到featuremap经过roipooling后输出7*7大小的map
3.最后对这个7*7的map进行分类和再次回归
(此处均为大体轮廓,具体细节见后面)
数据层
1.主要利用工厂模式适配各种数据集factory.py中利用lambda表达式(泛函)
2.自定义适配自己数据集的类,继承于imdb
3.主要针对数据集中生成roidb,对于每个图片保持其中含有的所有的box坐标(0-index)及其类别,然后顺便保存它的面积等参数,最后记录所有图片的index及其根据index获取绝对地址的方法
#factory.py
fromdatasets.mydatasetimportmydataset
fordatasetin['xxdataset']:
forsplitin['train','val','test']:
name='{}_{}'.format(dataset,split)
__sets[name]=(lambdasplit=split,dataset=dataset:
mydataset(split,dataset))
RPN
anchors生成
经过featureextraction后,featuremap的大小是(W/16,H/16),记为(w,h),然后每个featuremap每个点生成k个anchor,论文中设置了3中ratio,3种scale共产生了w*h*9个anchors
##array([[-83.,-39.,100.,56.],
#[-175.,-87.,192.,104.],
#[-359.,-183.,376.,200.],
#[-55.,-55.,72.,72.],
#[-119.,-119.,136.,136.],
#[-247.,-247.,264.,264.],
#[-35.,-79.,52.,96.],
#[-79.,-167.,96.,184.],
#[-167.,-343.,184.,360.]])
#先以左上角(0,0)为例生成9个anchor,然后在向右向下移动,生成整个featuremap所有点对应的anchor
anchors前背景和坐标预测
正如整体框架上画的那样,featuremap后先跟了一个3*3的卷积,然后分别用2个1*1的卷积,预测featuremap上每个点对应的9个anchor属于前背景的概率(9*2)和4个回归的坐标(9*4)
#rpn
self.rpn_net=nn.Conv2d(self._net_conv_channels,cfg.RPN_CHANNELS,[3,3],padding=1)
self.rpn_cls_score_net=nn.Conv2d(cfg.RPN_CHANNELS,self._num_anchors*2,[1,1])
self.rpn_bbox_pred_net=nn.Conv2d(cfg.RPN_CHANNELS,self._num_anchors*4,[1,1])
rpn=F.relu(self.rpn_net(net_conv))
rpn_cls_score=self.rpn_cls_score_net(rpn)#batch*(num_anchors*2)*h*w
rpn_bbox_pred=self.rpn_bbox_pred_net(rpn)#batch*(num_anchors*4)*h*w
∙
anchortarget
对上一步产生的anchor分配targetlabel,1前景or0背景or-1忽略,以便训练rpn(只有分配了label的才能计算loss,即参与训练)
无NMS
1.对于每个gtbox,找到与他iou最大的anchor然后设为正样本
2.对于每个anchor只要它与任意一个gtboxiou>0.7即设为正样本
3.对于每个anchor它与任意一个gtboxiou都<0.3即设为负样本
4.不是正也不是负的anchor被忽略
注意
正样本的数量由num_fg=int(cfg.TRAIN.RPN_FG_FRACTION*cfg.TRAIN.RPN_BATCHSIZE)控制,默认是256*0.5=128,即最多有128个正样本参与rpn的训练.假如正样本有1234个,则随机抽1234-128个正样本将其label设置为-1,即忽略掉,当然正样本也有可能不足128个,那就都保留下来.
负样本的数量由num_bg=cfg.TRAIN.RPN_BATCHSIZE-np.sum(labels==1),同理如果超额也为多余的忽略.
TRAIN.RPN_FG_FRACTION控制参与rpn训练的正样本的数量
注意在RPN阶段需要的配置参数都有RPN前缀,与后面的fastrcnn的参数区别开
#Maxnumberofforegroundexamples
#__C.TRAIN.RPN_FG_FRACTION=0.5
#Totalnumberofexamples
#__C.TRAIN.RPN_BATCHSIZE=256
#subsamplepositivelabelsifwehavetoomany
num_fg=int(cfg.TRAIN.RPN_FG_FRACTION*cfg.TRAIN.RPN_BATCHSIZE)
fg_inds=np.where(labels==1)[0]
iflen(fg_inds)>num_fg:
disable_inds=npr.choice(
fg_inds,size=(len(fg_inds)-num_fg),replace=False)
labels[disable_inds]=-1
#subsamplenegativelabelsifwehavetoomany
num_bg=cfg.TRAIN.RPN_BATCHSIZE-np.sum(labels==1)
bg_inds=np.where(labels==0)[0]
iflen(bg_inds)>num_bg:
disable_inds=npr.choice(
bg_inds,size=(len(bg_inds)-num_bg),replace=False)
labels[disable_inds]=-1
∙1
∙20
FastRCNN
proposal
对RPNchase的anchor进行处理,有NMS
1.首先利用4个坐标回归值对默认的w*h*9个anchor进行坐标变换生成proposal
2.然后利用前景概率对这些proposal进行降序排列,然后留下RPN_PRE_NMS_TOP_N个proposal训练是留下12000,测试是留下6000
3.对剩下的proposal进行NMS处理,阈值是0.7
4.对于剩下的proposal,只留下RPN_POST_NMS_TOP_N,训练是2000,测试是300
最终剩下的proposal即为rois了
proposaltarget
对留下的proposal(train:
2000,test没有这个阶段,因为测试不知道gt无法分配)分配targetlabel,属于具体哪一个类别,以便训练后面的分类器,下面以train阶段的某个图片为例即该张图片有2000个proposal,gt中含有15个类别的box(不含背景)(全库有20个类别)
#Minibatchsize(numberofregionsofinterest[ROIs])
#__C.TRAIN.BATCH_SIZE=128
#Fractionofminibatchthatislabeledforeground(i.e.class>0)
#__C.TRAIN.FG_FRACTION=0.25控制fastrcnn中rois的正负样本比例为1:
3
num_images=1
rois_per_image=cfg.TRAIN.BATCH_SIZE/num_images#默认为128
fg_rois_per_image=int(round(cfg.TRAIN.FG_FRACTION*rois_per_image))#0.25*128
1.计算每个roi(proposal)与15个gtbox做iou,得到overlaps(2000,15),然后选择最大的iou作为这个roi的gtlabel(坑点:
gtbox的顺序不一定和label对应,一定要取gtbox的第4个维度作为label,因为可能包含15个gtbox,但是全库是有20中label的)
2.然后记roi与其targetlabel的ovlap>TRAIN.FG_THRESH(0.5)的为fg,0.1
iffg_inds.numel()>0andbg_inds.numel()>0:
fg_rois_per_image=min(fg_rois_per_image,fg_inds.numel())
fg_inds=fg_inds[torch.from_numpy(npr.choice(np.arange(0,fg_inds.numel()),size=int(fg_rois_per_image),replace=False)).long().cuda()]
#......
#主要解读npr.choice(np.arange(0,fg_inds.numel()),size=int(fg_rois_per_image),replace=False)
#在np.arange(0,fg_inds.numel())随机取int(fg_rois_per_image)个数,replace=False不允许重复
roipooling
上一步得到了很多大小不一的roi,对应到featuremap上也是大小不一的,但是fc是需要fixedsize的,于是根据SPPNet论文笔记和caffe实现说明,出来了roipooling(spppoolingfroze前面的卷积只更新后面的fc,why见fastrcnn的2.3段解释的)
我主要参考了这篇博客Regionofinterestpoolingexplained,但是我感觉它的示意图是有问题的,应该有overlap的
1. 我们首先根据featuremap和原图的比例,把roi在原图上的坐标映射到featuremap上,然后扣出roi对应部分的feature(蓝色框为实际位置,浮点坐标(1.2,0.8)(7.2,9.7),四舍五入量化到红色框(1,1)(7,10))
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- faster rcnn源码解析 rcnn 源码 解析