1. 程式人生 > >fast-rcnn訓練實戰

fast-rcnn訓練實戰

這一週訓練了一個fast-rcnn網路,趁著還沒有忘記先記一筆。

關於圖片檢測detection這一類問題,隨著CNN的流行出現了許多新的方法與系統。其中RCNN就是比較出名的一個。Rcnn的論文在此

caffe裡也實現了rcnn具體的demo

在rcnn的paper中第一步在圖片中選取region proposals。第二步用CNN提取proposal 的特徵,最後使用svm演算法進行分類。實現一個detection的任務。

雖然rcnn的效果不錯,但是演算法慢是一個硬傷,感覺時間主要畫在了特徵提取上。我們實驗室用k40顯示卡每一張圖片提特徵在10ms左右,真的像論文說的那樣,提取k級的proposals 一張圖片僅僅提特徵就是秒級。所以RCNN的很多改進方法被提了出來。

Fast-rcnn,Faster-rcnn都能在提高速度基礎上增加準確率。兩個演算法的paper和code如下:

Faster-rcnn沒完全搞明白,所以分享一下fast-rcnn 使用和訓練的經驗和心得。

在fast-rcnn中將img與object proposals直接輸入fully convolutional中,提取了proposals的特徵之後一個全連線FC對映到了特徵向量。整個網路在最後輸出了兩個Loss(softmax probabilities, per-class bounding-boxregression)所以快就可能快在了前面的提特徵,準應該準在了2個loss上。

在clone編譯完fast-rcnn之後,進入tools目錄可以執行demo.py看看效果。這個demo解決的問題是VOC問題,資料是VOC2007,網址如下:

如果,需要detection的class有這個VOC問題中20類的一類,那麼恭喜中獎,需不需要再重新訓練網路感覺不是很重要了,修改一下demo.py中的部分程式碼就可以出色完成detection任務(前期我就是這麼做的:p )。但是如果想去訓練一個新的網路,可能需要花一點時間了。

在探索訓練之路時候這三篇文章對我幫助極大,尤其第一篇,我幾乎是看著這手把手復現的整個訓練過程,在此先po出。如果訓練出現了問題在上面issues會有許多前輩的踩坑經驗,看看受益匪淺。

首先準備好需要訓練的資料,主要是所以圖片,圖片的索引,和標註資訊。


在上面的文章中,標註資訊有兩種組織形式,一種是xml,一種是txt。這兩種資訊都可以,但是選擇哪一種都需要關注lib/datasets/pascal_voc.py 的_load_pascal_annotation方法。這原來是載入xml的,後來上面前輩修改了txt版本的,所以什麼感覺都可以。

之後是構建lmdb格式。我們可以修改本身的pascal_voc.py程式碼,根據標註的資訊寫入你需要detection的類。之後修改目錄下的factory.py檔案,將訓練集的目錄寫到裡面。

之後找fast-rcnn根目錄下的selective_search目錄執行selective_search.m 訓練集把輸出的結果改成train.mat送到資料集的目錄裡去。因為實驗室安裝了matlab和Xmanager所以很輕鬆完成了這一步,如果沒有安裝matlab,上面三篇部落格有一個前輩也沒有用matlab,請參考。

接著,我們需要改一下Prototxt 和 Rename Layers.因為,訓練時候,感覺是將原有的模型finetune一下。所以我們要像finetune一樣修改一下Layers的名字(前後6個)。除了改最後的兩層loss名字和要檢測的類個數,input層改輸入的類個數,cls層改成輸入的類個數,bbox層改成4*類個。這個根據實際需求修改。

之後請注意:

/lib/fast_rcnn/train.py

/lib/fast_rcnn/test_train.py

/lib/fast_rcnn/test.py裡面也有相應的層,也需要修改,要不然迭代了10000次會存不下來的….

至此所有的準備工作就已經完成了。開心的訓練吧。

 ./tools/train_net.py --gpu 0 --solvermodels/CaffeNet/solver.prototxt --weights data/imagenet_models/CaffeNet.v2.caffemodel--imdb train(還有兩個網路可以訓練,如果訓練失敗,看一看之前有沒有執行下載原來model的sh)。

不過,我還是遇到了一個坑。是在訓練時報的這樣一個錯

roidb[i]['image'] = imdb.image_path_at(i)
IndexError: list index out of range。

這個問題請到fast-rcnn-master/data/cache/刪掉原來的東西。

訓練好了之後我們將demo修改一下就可以看到效果啦。在這裡po一張我識別車牌的效果。 雖然裡面有誤框的,但是總體來看準確率相當高。有了這個,就不用為實驗室師兄師姐們沒日沒夜標註資料了~ PS:另外faster-rcnn也許會出現更加好的效果。不過我要detection的東西在VOC裡有:),所以我就開心的用現成的model框了。如果VOC沒有,faster-rcnn關於train這一塊,MATLAB版有train的例子,Python版的討論在此: 如果大神們有這個經驗和技巧,請告訴小弟我,在此先謝過。