faster rcnn 學習 搭建

轉載 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個,所以效果很差,不過能跑通就行了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章