python3 + Tensorflow + Faster R-CNN訓練自己的數據


之前實現過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輪,所以效果很差,不過能跑通就行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM