1. 程式人生 > >TF-Faster-RCNN訓練篇(基礎版)結合自己訓練的修改過程而撰寫

TF-Faster-RCNN訓練篇(基礎版)結合自己訓練的修改過程而撰寫

這裡,我就主要記錄一下自己在跑tensorflow框架下的faster-rcnn。

首先,就是硬體要求,這裡只能做到使用一塊GPU。

具體環境要求:

        1.Ubuntu  16.04系統、CUDA 8.0和cudnn(可以支援NVIDIA的GPU運算,當然有很多人在說這個環境,可以再參考其他相關文章)

        2.python版本opencv和gpu版本的tensorflow,自己的python版本是2.7的, 所以自己就找了2.7版本的opencv和tensorflow(必須是gpu版,因為我們要使用gpu)。

一、資料集準備

我們在做目標識別時,大家都知道要有訓練集、驗證集以及測試集,當然資料集格式也有很多種,我們這裡使用的是pascal_voc資料格式。如下圖是voc2007資料集資料夾格式

JPEGImages--------用來儲存你的資料圖片,當然,對於faster-rcnn來講,所有的圖片必須是jpg/jpeg格式,其他格式的話要轉換一下。另外,一定要對圖片進行編號,一般按照voc資料集格式,採用六位數字編碼,如000001.jpg、000002.jpg等。Annotations----------這裡是存放你對所有資料圖片做的標註,每張照片的標註資訊必須是xml格式。lmageSets-----------該檔案下有一個main檔案,main檔案下有四個txt檔案,分別是train.txt、test.txt、trainval.txt、val.txt,裡面都是存放的圖片號碼,當然,我們現在只關注訓練,所以要將所有用做訓練的圖片號碼放入train.txt中,一行一個編號。這裡需要說明一下,如果想訓練一個比較好的模型,資料集的量一定要大,自己之前使用了一個1000多張的訓練資料集,經過自己驗證,無法訓練出來一個好的分類器模型。當然,大家想自己製作資料集,並且做標註,這也是一個十分大的工程,具體如何做標註,大家可以參考其他部落格。當然,大家只需要修改voc2007資料集中的這三個檔案即可,這樣就可以避免一些更繁瑣的步驟。

二、程式和環境編譯

我的建議是大家在執行前,先理解faster-rcnn結構,然後去看它的python版本和matlab版本程式碼,最後在下載Faster-RCNN-TF的程式,這樣會讓我們在修改的時候節省很多時間,同時,也讓自己的思路清晰。對於faster-rcnn-tf的程式,最主要的資料夾如下圖:


data-----------------這裡是用來存放你的資料圖片的

experiments------這個資料夾決定了你要採用什麼樣的方式去訓練你的資料,大家都知道,faster-rcnn提供了兩種訓練方式:

                               1.交替訓練(alt_opt)

                               2.近似聯合訓練(end-to-end)

                               這裡我們就使用的是第二種,因為它速度更快,同時也能保證準確率,但是兩者修改程式碼是不一樣的。

lib--------------------存放python的介面檔案,如需要資料讀入等。

tools-----------------存放的是訓練、測試等python檔案,這裡是我們的重點。

output是用來存放自己訓練好的模型的,所以在未訓練前,裡面是空的。我建議大家要仔細閱讀README.md檔案,可以很好的幫助我們執行程式。

我們現在已經有程式程式碼了,然後我們現在先建立Cython環境

進入終端,我們找到Faster-rcnn-TF的資料夾


點選回車,如果大家之前的軟體環境都有的話,這一步會完成編譯。

之後,我們需要下載一個已經訓練好的模型,用來測試它的demo.py(也就是例程),這裡直接用它README.md中給的網站下載就可以了,然後把模型放在tools/model(新建model資料夾)資料夾中就可以,方便我們呼叫。另外,這個程式是基於voc2007資料集訓練的,所以它訓練的是21類,測試例程的模型也是區分21類物體的。


這裡,對於model模型存放的位置,大家根據自己修改,另外,對於tensorflow版本的模型來講,它由三個檔案(字尾名為data-00000-of-00001、index、meta)組成,所以大家只需要寫到ckpt即可。這裡我使用的是自己訓練好的一個模型,所以大家湊合看即可。如果demo.py執行順利,我們就可以訓練自己的資料模型了。

三、訓練

1.替換資料。大家應該提前下好voc資料集,並儲存在data/VOCdevkit2007下,那麼替換資料就是將自己訓練集的Annotations、lmageSets和JPEGlmages檔案和原檔案替換即可。大家替換資料後,一定要將data/cache中的pkl檔案刪除,不然不會獲得修改後的資料。

2.修改程式碼      我們採用的是VGG16的網路以及近似聯合訓練,所以修改也依據此。
(1)lib/datatsets/pascal_voc.py
2 .lib/datasets/imdb.py  (第22行0改為5)
3. lib/networks/VGGnet_train.py  (第7行)

同理,VGGnet_test.py修改同上()

4. 為了大家測試demo.py的方便,所以大家也把tools/demo.py中的類別改成自己的類別

(5)修改迭代次數等引數

這裡大家根據自己的計算,選擇合適的迭代次數以及學習率等, 個人認為,初試學習率0.001,如果不收斂再減小一個量級,另外,70000次在gpu(看自己的gpu效能,我的是1080)上跑,也只是需要半天多的時間,所以還是可以接受的迭代次數,至於選擇多少迭代次數合適,可以根據不同次數訓練好的模型,測試驗證。

首先在experiments/scripts/faster_rcnn_end2end.sh檔案中修改迭代次數:在ITERS中修改成自己想要的引數
然後,我們進入lib/fast_rcnn/config.py,對config.py進行修改:
其中,第一項,就是學習率,STEPSIZE就是你對訓練步長的修改,這裡一定要小於等於前面訓練檔案的ITERS引數。其他大家可以選擇保持一致,對於動量和伽馬引數不用修改,當然,對於訓練每隔多少次顯示,大家根據自己情況修改,這裡是10次一顯示。除此,我們可以修改batch的大小,第一個引數是每次輸入faster-rcnn網路中圖片數量,第二個引數就是訓練batch的大小。還有關於模型儲存問題:
這裡,第一個引數是訓練時,每迭代多少次儲存一次模型;第二個引數是儲存時模型的名字。另外,大家要在訓練的時候,可以將rpn檢測目標設定為True,這個根據自己情況了

大家需要注意一點,就是修改py檔案前,大家把它對應的pyc檔案刪掉,修改後再重新編譯一下。上面的步驟都需要重新編譯一下。

(6)接下來就可以輸入訓練命令了進入你的Faster-rcnn資料夾,然後直接輸入     ./experiments/scripts/faster_rcnn_end2end.sh gpu 0  VGG16  pascal_voc這裡的%DEVICE 是你使用cpu還是gpu,當然,我是使用的gpu。%DEVICE_ID是你輸入gpu的編號。另外,可能會遇到資料夾許可權低的問題,這裡我有個提升資料夾許可權的操作。進入root許可權,然後輸入提升資料夾許可權的命令
這樣的話,你就可以使用訓練命令了,當然,大家如果想了解這個指令的解釋,可以直接去百度查。大家需要注意一點,就是修改py檔案前,大家把它對應的pyc檔案刪掉,修改後再重新編譯一下。上面的步驟都需要重新編譯一下。