轉載 https://blog.csdn.net/char_QwQ/article/details/80980505
一、克隆代碼
git clone https://github.com/endernewton/tf-faster-rcnn.git
二、根據你的顯卡更改下對應的架構。
在tf-faster-rcnn/lib/setup.py的第130行,Tesla K40m對應的是sm_35
三、編譯Cython
仍然在lib路徑下,編譯Cython模塊(確保你已經安裝了easydict,如果沒有,pip install easydict):
make clean
make
cd ..
四、安裝COCO API。
這點按照GitHub的步驟走就ok,沒啥錯誤:
cd data
git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI
make
cd ../../..
五、下載數據:
Download the training, validation, test data and VOCdevkit
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
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
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
It should have this basic structure
$VOCdevkit/ # development kit
$VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc.
# ... and several other directories ...
Create symlinks for the PASCAL VOC dataset
cd $FRCN_ROOT/data
ln -s $VOCdevkit VOCdevkit2007
這裏有點小問題,我的軟連接似乎不起作用了,於是我直接把VOCdevkit文件夾拷貝到tf-fater-rcnn/data路徑下,並重命名爲VOCdevkit2007,記得刪除那個VOCdevkit的軟連接。
六、下載預訓練模型
需要翻牆,如果翻不了牆就從網盤裏下吧,我存網盤了。鏈接:預訓練模型 密碼:8ahl
七、建立預訓練模型的軟連接
在tf-faster-rcnn目錄下建立output文件夾,並使用軟連接來使用預訓練模型,這裏按照步驟走就行,沒啥問題:
NET=res101
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
cd ../../..
八、對一些圖片進行測試。
仍然按步驟走:
GPU_ID=0
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了!
GPU_ID=0
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101
測試結果:
十、訓練模型
在data目錄下創建一個imagenet_weights文件夾,解壓權重數據並把解壓後的vgg_16.ckpt重命名爲vgg16.ckpt,因爲後面在調用權重數據的時候名字需要對應的上。
開始訓練(這裏最後的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輪。
十一、替換自己的數據
在替換數據之前,先介紹一下標註工具,我用的labelImg對數據進行標註的,其界面如下:
具體怎麼安裝以及用法就不介紹了,GitHub上已經介紹的很詳細了。然後介紹一下xml數據格式:
<annotation>
<folder>fire_data</folder>
<filename>000001.jpg</filename> #圖像名稱
<path>/home/htu/yc/fire_data/000001.jpg</path> #路徑
<source>
<database>Unknown</database>
</source>
<size>
<width>450</width> #寬
<height>253</height> #高
<depth>3</depth> #RGB三通道
</size>
<segmented>0</segmented>
<object>
<name>fire</name> #目標名稱
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox> #BBOX值
<xmin>146</xmin>
<ymin>22</ymin>
<xmax>207</xmax>
<ymax>60</ymax>
</bndbox>
</object>
</annotation>
其中需要說明的是:圖像名稱一定要命名爲000001.jpg,以及xml也要命名爲000001.xml格式(事實上如果你對圖像名稱是六位數字組成的,xml也會自動生成六位數字)。我之前用的是1,2,3,4這樣命名,結果運行總是會提示Keyerror:"1"。
一般出現keyerror的原因有兩種,一是圖像以及xml命名不符合要求,這就需要你重命名;二是標註的object信息有誤,什麼意思呢?拿我的數據來說,我是對火焰進行標註的,所以label是fire,如果因爲操作失誤導致fire變成如w或者其他字母,就會提示keyerror。爲什麼會是w呢?因爲標註的快捷鍵是w,所以有時候會因爲粗心把w寫到label裏。我就犯過這樣的錯誤,這樣的錯誤排除起來很麻煩,還需要再寫一段代碼,對xml的所有name節點的值進行訪問,如果不是你的label,把對應的索引記錄下來,手動再修改。
xml數據準備完畢後,需要劃分訓練驗證以及測試集,這裏我使用的別人寫好的劃分代碼(讀書人的事,怎麼能叫偷呢?)Creat_FRCNN_DataSet,是matlab的,下載後更改下VOC2007xml.m中前四行的路徑就能用了。執行結果會按比例對你的數據劃分爲訓練集驗證集以及測試集,同時會生成四個txt文檔,分別是test.txt,train.txt,trainval.txt,val.txt。
訓練驗證測試集劃分之後,就開始替換自己的數據了(講了那麼多廢話終於到正點了,其實主要是怕自己以後忘記了,腦子不太好用了)。
首先,在tf-faster-rcnn/lib/datasets目錄下的pascal_voc.py裏第36行更改自己的類別,'__background__'切記不可刪掉,把後面的原來的20個label換成自己的,不用更改類別數目,也沒有地方可以更改。
然後把你的xml文件放置在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations路徑下,記得把原來的刪掉;同時把你的jpg文件放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages路徑下,xml和jpg替換完了,現在該txt了,把之前matlab生成是四個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輪,而且因爲寫博客需要,數據總共就100個,所以效果很差,不過能跑通就行了。