Simple-Faster-RCNN源码学习笔记
Simple-Faster-RCNN 源碼學習
項目github地址: https://github.com/chenyuntc/simple-faster-rcnn-pytorch
源碼
源文件: model/utils/bbox_tools.py
方法: loc2bbox(src_bbox, loc)
參數含義:
給出邊界框的偏移及縮放尺寸,該函數將表示轉換為2D的圖像坐標.
即通過對原邊界框src_bbox附加上loc對應的變換,從而得到新的邊界框.
先將坐標表示法src_bbox轉換成中心表示法px,py,pw,php_x,p_y,p_w,p_hpx?,py?,pw?,ph?
再結合loc數組中的偏移和縮放dx,dy,dw,dhd_x,d_y,d_w,d_hdx?,dy?,dw?,dh?
根據如下公式,做轉換并得到gx,gy,gh,gwg_x,g_y,g_h,g_wgx?,gy?,gh?,gw?:
gy=dyph+pyg_y = d_yp_h+p_ygy?=dy?ph?+py?
gx=dxpw+pxg_x = d_xp_w+p_xgx?=dx?pw?+px?
gh=dhexp(ph)g_h = d_hexp({p_h})gh?=dh?exp(ph?)
gw=dwexp(pw)g_w = d_wexp({p_w})gw?=dw?exp(pw?)
得到中心表示法gx,gy,gh,gwg_x,g_y,g_h,g_wgx?,gy?,gh?,gw?,以后,再經過一步轉換得到坐標表示法dst_bbox.
dstx1=gx?0.5gwdst_{x1} = g_x-0.5g_wdstx1?=gx??0.5gw?
dstx2=gx+0.5gwdst_{x2} = g_x+0.5g_wdstx2?=gx?+0.5gw?
dsty1=gy?0.5ghdst_{y1} = g_y-0.5g_hdsty1?=gy??0.5gh?
dsty2=gy+0.5ghdst_{y2} = g_y+0.5g_hdsty2?=gy?+0.5gh?
方法: bbox2loc(src_bbox, dst_bbox)
參數含義:
返回值: 返回從src_bbox變換到dst_bbox所需要的偏移和縮放信息.
方法: bbox_iou(bbox_a, bbox_b)
計算二者的IoU的值,即Area(A∩B)Area(A∪B)\frac{Area(A∩B)}{Area(A∪B)}Area(A∪B)Area(A∩B)?.
如果參數aaa的維度是(N,4)(N,4)(N,4),參數bbb的維度是(K,4)(K,4)(K,4),那么返回值的維度就是(N,K)(N,K)(N,K)
方法: generate_anchor_base(base_size=16, ratios=[0.5, 1, 2],anchor_scales=[8, 16, 32])
生成多種(樣例是3種)不同面積(面積即為base_size*anchor_scales)的Anchor, 每一種Anchor又會生成多種(樣例中是3種)具有不同長寬比的Anchor.(樣例中總Anchors數目是9種)
最后將生成的Anchor全部都統一到圖像坐標表示法返回.
源文件: model/region_proposal_network.py
方法: _enumerate_shifted_anchor(anchor_base, feat_stride, height, width)
用于生成所有的Anchors,傳入anchor_base,對于特征圖的每一個像素點位置,都生成A個Anchors,總共就是K?AK*AK?A個Anchors,其中K是像素點的數量.
返回值的形狀是(K?A,4)(K*A,4)(K?A,4)
方法:RegionProposalNetwork.forward(self, x, img_size, scale=1.)
經過1層3?33*33?3的卷積層,做一下語義變換,從而得到hhh作為特征響應圖.
再后面特征響應圖hhh經過2個分支,分別產生Anchor的前景得分以及中心表示法坐標.
其中rpn_fg_scores即Anchor的前景得分,rpn_scores是同時包含前景背景的得分,rpn_locs表示的是Anchor的中心表示法的坐標.
上述代碼的意思是:對于Batch中的每一個樣本,把用RPN預測的Anchor坐標,前景得分,圖像大小,以及所有Anchor坐標,圖片大小等信息傳入proposal_layer中去,可以得到一些Anchor.
最后,該方法返回:rpn_locs,rpn_scores,rois,roi_indices,anchor等信息.
值得注意的是,訓練時僅返回2000個roi,測試時僅返回300個.
源文件: creator_tool.py
類: ProposalCreator
該類是可調用的,它接收RPN預測的一些Anchor的坐標,前景分數,以及特征圖所生成的所有Anchor等信息,并且用于生成RoIs.
為了生成Proposal,先將anchor的中心表示法轉換為圖像坐標表示法.
為了防止生成的Proposal越界,我們需做一個clip操作,使得最小值為0,最大值為對應維度的最大值.
隨后將寬度和高度小于閾值的proposal丟掉.
對所有proposal,按照其前景分進行排序,并且一開始只取前n_pre_nms個.
隨后再進行non_maximum_supression非最大值抑制,就是說交叉度大的幾個Anchors只保留前景分最大的,返回的時候,只返回n_post_nms個框,訓練時這個值為2000,測試時這個值為300…
類: ProposalTargetCreator
對于給定的RoIs,對于每一個RoI,將其與所有的GT(Ground Truth)進行比對,求其IoUIoUIoU,隨后選擇最大的IoUIoUIoU的索引作為gt_assigment,這個值設置為max_iou.并且計算出前景框的索引pos_index,從中隨機選取大概64個正樣本.
同理,從中選取相等數量的作為負樣本.
將正負樣本疊加在一起,返回與之對應的樣本roi,gt框,gt框索引.
總結
以上是生活随笔為你收集整理的Simple-Faster-RCNN源码学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女为悦己者容男为悦己者穷意思 怎么理解女
- 下一篇: CVPR19 基于图卷积网络的多标签图像