Simple-Faster-RCNN 源碼學習
項目github地址: https://github.com/chenyuntc/simple-faster-rcnn-pytorch
源碼
源文件: model/utils/bbox_tools.py
方法: loc2bbox(src_bbox, loc)
參數含義:
- src_bbox描述的是bbox的座標.
- loc表示的偏移(offsets)和縮放尺度(scales).
給出邊界框的偏移及縮放尺寸,該函數將表示轉換爲2D的圖像座標.
即通過對原邊界框src_bbox附加上loc對應的變換,從而得到新的邊界框.
先將座標表示法src_bbox轉換成中心表示法
再結合loc數組中的偏移和縮放
根據如下公式,做轉換並得到:
得到中心表示法,以後,再經過一步轉換得到座標表示法dst_bbox.
方法: bbox2loc(src_bbox, dst_bbox)
參數含義:
- src_bbox描述的是第一個bbox的座標.
- dst_bbox描述的是第二個bbox的座標.
返回值: 返回從src_bbox變換到dst_bbox所需要的偏移和縮放信息.
方法: bbox_iou(bbox_a, bbox_b)
計算二者的IoU的值,即.
如果參數的維度是,參數的維度是,那麼返回值的維度就是
方法: 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,總共就是個Anchors,其中K是像素點的數量.
返回值的形狀是
方法:RegionProposalNetwork.forward(self, x, img_size, scale=1.)
經過1層的卷積層,做一下語義變換,從而得到作爲特徵響應圖.
再後面特徵響應圖經過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等信息.
源文件: creator_tool.py
類: ProposalCreator
該類是可調用的,它接收RPN預測的一些Anchor的座標,前景分數,以及特徵圖所生成的所有Anchor等信息,並且用於生成RoIs.
爲了生成Proposal,先將anchor的中心表示法轉換爲圖像座標表示法.
爲了防止生成的Proposal越界,我們需做一個clip操作,使得最小值爲0,最大值爲對應維度的最大值.
隨後將寬度和高度小於閾值的proposal丟掉.
對所有proposal,按照其前景分進行排序,並且只取前n_pre_nms
個.
隨後再進行non_maximum_supression
非最大值抑制,就是說交叉度大的幾個Anchors只保留前景分最大的.
類: ProposalTargetCreator
對於給定的RoIs,對於每一個RoI,將其與所有的GT(Ground Truth)進行比對,求其,隨後選擇最大的