之前實現過faster rcnn, 但是因為各種原因,有需要實現一次,而且發現許多博客都不全面。現在發現了一個比較全面的博客。自己根據這篇博客實現的也比較順利。在此記錄一下(照搬)。
原博客:https://blog.csdn.net/char_QwQ/article/details/80980505
文章代碼連接:https://github.com/endernewton/tf-faster-rcnn
顯卡:TiTan RTX/Qudro K2200(麗台k2200)。--我分別在兩張顯卡都實現過
Python 3.6 + TensorFlow-gpu 1.2.0rc2 + Cuda8.0 + Cudnn v5.1
一、克隆代碼
git clone https://github.com/endernewton/tf-faster-rcnn.git
二、根據你的顯卡更改下對應的計算單元。
在tf-faster-rcnn/lib/setup.py的第130行。TiTan RTX對應的是sm_52, K2200對應的是sm_30。在這可以查看每種顯卡對應的計算單元:http://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/
三、編譯Cython
仍然在lib路徑下,編譯Cython模塊(確保你已經安裝了easydict, 如果沒有,pip install easydict):
1. make clean 2. make 3. cd ..
四、安裝COCO API.
這點按照GitHub的步驟走就ok,沒啥錯誤:
1. cd data 2. git clone https://github.com/pdollar/coco.git 3. cd coco/PythonAPI 4. make 5. cd ../../..
五、下載數據:
Download the training, validation, test data and VOCdevkit
1. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar 2. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar 3. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
Extract all of these tars into one directory named VOCdevkit
1. tar xvf VOCtrainval_06-Nov-2007.tar 2. tar xvf VOCtest_06-Nov-2007.tar 3. tar xvf VOCdevkit_08-Jun-2007.tar
It should have this basic structure
1. $VOCdevkit/ # development kit 2. $VOCdevkit/VOCcode/ # VOC utility code 3. $VOCdevkit/VOC2007 # image sets, annotations, etc. 4. # ... and several other directories ...
Create symlinks for the PASCAL VOC dataset
1. cd $FRCN_ROOT/data 2. ln -s $VOCdevkit VOCdevkit2007
注:這里有個小問題,我的軟連接似乎不起作用了,於是我直接把VOCdevkit文件拷貝到tf-faster-rnn/data路徑下,並重命名為VOCdevkit2007,記得刪除那個VOCdevkit的軟連接。
六、下載預訓練模型
需要FQ,如果翻不了牆就從網盤下載吧。
鏈接:https://pan.baidu.com/s/1F8VfDKjlq9x42ZDrrvfx2A 密碼:8ahl
七、建立預訓練模型的軟連接
在tf-faster-rcnn目錄下建立output文件夾,並使用軟連接來使用預訓練模型,這里按照步驟走就行,沒啥問題:
1. NET=res101 2. TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval 3. mkdir -p output/${NET}/${TRAIN_IMDB} 4. cd output/${NET}/${TRAIN_IMDB} 5. ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default 6. cd ../../..
八、對一些圖片進行測試。
仍然按步驟走:
1. GPU_ID=0 2. CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py
九、 使用訓練好的faster模型對數據進行測試。
這里有點地方需要修改:首先把tf-faster-rcnn/lib/datasets/voc_eval.py的第121行的
with open(cachefile,'w') as f
改成:
with open(cachefile,'wb') as f
同時還要把第105行的
cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile)
改成:
cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile.split("/")[-1].split(".")[0])
然后再按照步驟走就Ok了!
1. GPU_ID=0 2. ./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101
測試結果:

十、訓練模型
這里按照步驟走可能會連不上外網,我把權重數據存網盤了。
網盤地址:https://pan.baidu.com/s/1aD0jlYGHhZQeeTvNJy0GGQ
密碼:45ef
在data目錄下創建一個imagenet_weights文件夾,解壓權重數據並把解壓后的vgg_16.ckpt重命名為vgg16.ckpy,因為后面在調用權重數據的時候需要對應的上。
開始訓練(這里最后的vgg16就是對應的權重數據, 名字要對的上, 0是GPU的ID, pascal_voc是訓練使用的數據集):
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
為了節省時間並排除錯誤,我把迭代次數只設置了20次,把
./experiments/scripts/train_faster_rcnn.sh里的第22行把ITERS=70000改成ITERS=20,同時記得把./experiments/scripts/test_faster_rcnn.sh的ITERS也改成20.
注意:因為我使用的是pascal_voc數據集,所以只需要更改對應數據集的ITERS的就行了,訓練和測試的都要改,因為在train_faster_rcnn.sh的末尾會執行test_faster_rcnn.sh
訓練過程的loss:

訓練結果:

可以看到結果很差,因為就迭代了20輪。
十一、替換自己的數據
首先,在tf-faster-rcnn/lib/datasets目錄下的pascal_voc.py里的第36行更改自己的類別,‘_background_'切記不可刪掉,把后面的原來的20個label換成自己的,不用更改類別數目,也沒有地方可以更改。
然后把你的xml文件放置在tf-faster-rcnn/data/VOCdevkit2007/Annotations路徑下,記得把原來的刪掉;同時把你的jpg文件放在
tf-faster/rcnn/data/VOCdevkit2007/VOC2007/JPEGImages路徑下,xml和jpg替換完了,現在該txt了,把之前生成的四個txt文檔放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Layout 和tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main。
在開始訓練之前,還需要把產生的模型以及cache刪除掉,分別在tf-faster-rcnn/output/vgg16/voc_2007_trainval/default路徑下和tf-faster-rcnn/data/cache路徑下,然后就可以開始訓練了:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
因為我只訓練了20輪,所以效果很差,不過能跑通就行了。

