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