Faster-RCNN訓練自己的數據集
就目前我在了解到的資料來看,訓練RCNN系列,一般有兩種思路:
修改CNN的工程代碼,適應自己的數據集格式
將自己的數據格式做成VOC2007形式的數據集
從工作量來看,無疑後者更容易一些,本文的思路也是如此。
首先是圖片的命名格式,雖然圖片的命名理論上不會影響訓練。因為訓練的數據都是從txt文件中讀取圖片的名稱。但是為了統一數據集,仍然建議批量、有規律的命名數據圖片。
我的數據集是jpg格式,和PASCAL_VOC2007一樣。將圖片置於同一個文件夾中,然後運行一段python代碼即可。
代碼見文末
命名之後,就可以進行標註了。我借用了一個網上的標註工具,windows7下運行良好,可惜沒放出源碼,無法學習交流。
標註工具得到了一份標註的集合的txt文件,記錄圖片和標註信息
這裡寫圖片描述
上述都是準備工作,然後就可以製作VOC格式的數據集了。總體來看,VOC格式的數據集格式如下:
---VOC2007
------Annotations
------ImagesSet
---------Main
------JPEGImages
1
2
3
4
5
Annotations中存放的是.xml文件,文件中記錄描述每張圖片的信息
這裡寫圖片描述
ImagesSetMain中存放txt文件,每個文件中寫入訓練和測試所用的數據(也就是圖片名稱的集合)
這裡寫圖片描述
JPEGImages中存放的是數據集中的圖片
關於VOC數據集格式,不清楚的可以下載一份VOC2007數據集,看一下就明白了。
搞明白了數據集包含哪些內容之後就可以製作數據集了。首先是Annotations中的xml文件,這些文件是根據標註信息得到的txt文件生成的。我參考了網上的一些代碼,自己寫了一份python腳本,運行良好。只需要讀入txt文件和遍歷圖片即可。
代碼見文末
因為JPEGImages中只是存放圖片,所以我在生成Annotations時,同時拷貝了每張圖片到JPEGImages中,也就完成了這兩個文件夾的內容。
【注意】: xml文件中很多標籤內容不一定要一樣,可以自己定義,比如作者什麼的,我是根據VOC的xml內容來修改的,大家也可以自己修改。
製作Main中的四個txt文件
txt內容即是圖片名字,所以遍歷一遍JPEGImages或者Annotations都行,我遍歷了Annotations。
test.txt是測試集,大概是整個數據集的50%;
trainval是訓練和驗證數據集,也就是整個數據集的剩餘的50%
train.txt是訓練集,是trainval的50%
val.txt是驗證集,trainval剩餘的50%
代碼見文末
這樣就完成VOC2007格式的數據集的製作。如果想要訓練faster-RCNN,還需要進入faster-RCNN中修改網路的一些參數。請參考:
Faster-RCNN訓練自己的數據集python版本
因為標註過程中,可能存在標註的目標框太靠近邊緣或者自己沒注意,導致標註的數據在訓練時產生了異常,通常是
assert(boxes[:,2]>=boxes[:,0]).all()
這行代碼報錯。(反正我中招了。。。)
原因和解決辦法看這裡
解決faster-rcnn中訓練時assert(boxes[:,2]>=boxes[:,0]).all()的問題
親測前兩步即可解決
TAG:程序員小新人學習 |