代碼來自https://github.com/ruotianluo/pytorch-faster-rcnn
除了nms, roi_pooling, roi_align三部分用cuda完成,其他部分都是基於pytorch完成的。
首先看一下整個文件結構(二級):
├── data
│ ├── demo
│ ├── imgs
│ └── scripts
├── experiments
│ ├── cfgs
│ ├── logs
│ └── scripts
├── lib
│ ├── datasets
│ ├── layer_utils
│ ├── make.sh
│ ├── model
│ ├── nets
│ ├── nms
│ ├── roi_data_layer
│ └── utils
└── tools
├── convert_from_tensorflow_mobile.py
├── convert_from_tensorflow.py
├── convert_from_tensorflow_vgg.py
├── demo_all_bboxes.py
├── demo.ipynb
├── demo.py
├── _init_paths.py
├── reval.py
├── test_net.py
└── trainval_net.py
主要函數都在/lib文件夾下,train和test的腳本用bash完成,在/experiments文件夾下,數據集默認存儲在/data下。
下面看一下/lib文件夾的結構:
lib/
├── datasets 主要包括imdb類以及對VOC,COCO兩種數據集的包裝解析,可以在此基礎上自定義數據集
├── layer_utils 主要包括對proposal和anchor的操作,以及roi的兩個cuda實現
├── make.sh
├── model 主要負責
├── nets
├── nms
├── roi_data_layer
└── utils
重點解析/lib/net/networks.py定義的Network類:
class Network(nn.Module):
#首先來看Network類的函數:
1. train_step(self, blobs, train_op) 以及 train_step_with_summary(self, blobs, train_op)
這是兩個直接被/lib/model/train_val.py中SolverWrapper類 調用的函數,在每個iter中調用一次。
train_op 傳入的是 optimizer,在SolverWrapper類的construct_graph()中,定義為SGD,momentum由/lib/model/config.py定義,
事實上,幾乎所有的hyperparameter都在該文件中定義。
主要來看blobs這個參數:
向前追溯,blobs=self.data_layer.forward()
我們來看看data_layer是什么:
self.data_layer = RoIDataLayer(self.roidb, self.imdb.num_classes)
from roi_data_layer.layer import RoIDataLayer
再來到/lib/roi_data_layer/layer.py:
這里定義了一個類RoIDataLayer,該類的主要功能類似一個dataloader,需要注意有幾個參數,_cur表示當前的roidb序號(有一點困惑,難道不應該是imdb?),
真正返回的值實際上是調用了另一個函數get_minibatch(minibatch_db,self._num_classes)
好吧,get_minibatch.py 還是在/lib/roi_data_layer/minibatch.py 里面:
這個函數的功能更像是對roidb的內容進行了包裝:
### layer_utils
def proposal_layer(rpn_cls_prob, rpn_bbox_pred, im_info, cfg_key, _feat_stride, anchors, num_anchors):
input:
1. rpn_cls_prob
rpn_cls_prob = rpn_cls_prob_reshape.view_as(rpn_cls_score).permute(0, 2, 3, 1) # batch * h * w * (num_anchors * 2)
rpn_bbox_pred