ubuntu16.04中gpu版本caffe-ssd模型訓練自己的數據

前天跑了一下caffe-ssd模型,並在pascal voc上跑了兩天,效果不錯,今天突然發現caffe-ssd目錄沒有了,,好像莫名被刪除了,於是早上重新裝了一遍,下午開始摸索如何用caff-ssd跑自己的數據,一個下午時間總算摸索出來了,記錄一下,方便有需要的朋友參考.

caffe-ssd訓練自己的數據其實挺簡單的,生成目標檢測的lmdb數據時候需要根據caffe-ssd中的代碼生成,下面講解一下如何操作:

需求說明:使用caffe-ssd訓練文本區域檢測的ssd模型,簡單說就是檢測一張紙上面的文字區域,檢測類別只有一類textarea.(如果你有多個檢測類別也可以,一樣的操作方法)

1,數據準備:不管你的數據是用什麼標註工具標的,肯定可以得到一個.txt文件吧(自己寫一個程序把標註工具標註的文件解析出來),.txt文件裏面如下第一行所示:(xmin, ymin,xmax, ymax)

data/data_ori/IMG_20171113_114301.jpg 924 740 2593 3549 0(我只有一個類別,所有標籤是0)

data/data_ori/IMG_20171113_114301.jpg 332 484 1913 3261 0 1076 1036 2669 3785 1(如果你是多個類別,那一張圖片肯定對應如這行一樣的多個標籤和座標值)

數據先任意放在一個目錄處理即可,然後寫個程序該圖片名字,改成和VOC一樣的命名,改成數字開頭即可,比如從00000000.jpg開始的圖片,圖片改爲名字記得對應的.txt文件中也要改哈,提供一個改名字的參考代碼:https://pan.baidu.com/s/14zNf5BhsKa35SsRbQ6M1fg(在data目錄下放着)(124行函數爲改名字代碼,輸入參數爲你的.txt文件路徑,改完名字之後需要保存的圖片目錄,新生成的改名之後圖片對應的label.txt文件,裏面是改名後的圖片對應的bbox座標和標籤類別)

改爲名字後開始生成改完名字圖片的xml文件,看第127行,127行是生成每個改名之後圖片的voc格式的xml文件,輸入參數爲保存的改名後的圖片目錄,需要保存的xml文件的路徑,剛剛改完名後的圖片對應的.txt文件

注意:1,生成每個圖片的voc格式的xml時參考127行代碼,代碼121行 node_folder.text = 'VOC_textarea'改成你的,隨便前一個名字就行,我起的VOC_textarea,2,17行有個width=1609, height=500,改成你圖片的大小,我的圖片同一個設備拍的,所以所有圖片長寬一樣,3,第40行改成你的標籤類別,比如我只有有個類別就是textarea,所有就是這個,如果你是多個檢測目標,那麼在36-37行之間根據c的值判斷,這個值是多少,比如你的0代表aa,1代表bb,2代表cc,那麼就把node_name.text ="aa"等.

2,將數據劃分成訓練和測試數據:參照上一篇博客下載編譯caffe-ssd,我的caffe-ssd目錄是/home/user/yjf/caffe,進入caffe目錄,在

caffe/data/VOCdevkit目錄下新建文件夾VOC_textarea,這個名字要和你剛剛生成xml文件時21行的node_folder.text = 'VOC_textarea'名字一樣.然後在該目錄下在新建Annotations,ImageSets,JPEGImages三個目錄.將之前改完名字後的圖片放到JPEGImages目錄下.將之前生成的xml文件放在Annotations目錄下.

參照我上傳的代碼中的mian方法中的第三和第四步生成訓練和測試文件.第三步生成訓練數據其實就是把所有數據按比例分別寫到txt文件中而已,如下所示:(注意生成的時候路徑從剛剛新建的

VOC_textarea開始寫)

VOC_textarea/JPEGImages/000000238.jpg VOC_textarea/Annotations/000000238.xml
VOC_textarea/JPEGImages/000000291.jpg VOC_textarea/Annotations/000000291.xml

生成的時候把我的代碼放在data目錄下執行,執行結束會在data目錄生成test.txt,trainval.txt,注意不要改這個文件夾名字!然後在參照的代碼中的第四步對所有test.txt文件中的圖片生成一個對應的test_name_size.txt裏面如下:

000000238 3968 2976
000000291 3968 2976

第一列爲test.txt中圖片的名字,第二列爲圖片高度,第三列爲圖片寬度,參照我的第四步代碼寫就行

3.生成lmdb數據:在caffe/data目錄新建VOC_label,這個名字自己起,然後將剛剛生成的data目錄下的test.txt,test_name_size.txt,trainval.txt拷貝到這個目錄.並在這個目錄在創建一個文件labelmap_voc.prototxt,命名不要改,就寫這個名字.內容如下:

item {
  name: "textarea"
  label: 0
  display_name: "textarea"
}
item {
  name: "none_of_the_above"
  label: 1
  display_name: "background"
}

因爲我只有一個檢測目標,加上背景一共是2類,第二類是背景,如果你有多個類,就繼續加,將背景類到最後一個就行,寫的時候注意 name要和你生成xml時候40行 node_name.text = 'textarea'指定的一樣

然後將caffe/data/VOC0712/create_data.sh複製到caffe/data/VOC_label目錄下.註釋掉cur_dir,和root_dir,添加一個root_dir=/home/user/yjf/caffe,這是caffe-ssd目錄,將裏面的dataset_name改成VOC_label,然後修改caffe/scripts/create_annoset.py,在開始添加sys.path.insert(0,'/home/user/yjf/caffe/python'),最後在caffe目錄執行./data/VOC_label/create_data.sh開始生成lmdb數據

過程如下:

結束之後會在caffe/data/VOCdevkit/VOC_label目錄生成lmdb文件夾,也即是訓練數據.

4,模型訓練:修改caffe/examples/ssd/ssd_pascal.py,其中的gpus='0,1,2,3' 該成gpus='0'和文件地址等等,我複製了一份這個文件爲ssd_pascal_textarea.py到同目錄,放在網盤,大家參考我的修改就好,注意num_classes = 2改成你的類別,我是一個類別加背景所以是2,background_label_id=1,因爲我的背景是標號爲1,所以寫1(在data/VOC_label/labmap_voc.protxt查看你的背景是第幾類),還有其他修改,參考我的一步步改就行(包括圖片大小,name_size_file, label_map_file等路徑等等).改完記得在caffe/models/VGGNet目錄下存放預訓練模型.參考上篇博客,最後python /examples/ssd/ssd_pascal_textarea.py就開始訓練.

訓練如下:

訓練過程如果出現loss爲nan,則是學習率太大,降低學習率即可.

5,預測:生成的模型會自動在/home/user/yjf/caffe/models/VGGNet/VOC_label/SSD_384x521目錄下,將/example/ssd/score_ssd_pascla.py複製一份,我複製爲sccore_ssd_textarea.py,裏面加入caffe目錄,在最開始,在caffe目錄執行

python examples/ssd/score_ssd_textarea.py即可對模型進行評價,不需要指定模型地址,程序會自己在生成模型的目錄下找模型編號最大的一個.評價會輸出一個值,參考上篇截圖.值越大模型越好.

將/example/ssd/ssd_detect.pyf複製一份,我複製爲ssd_detect_textarea.py然後加入caffe目錄在開始,最後在caffe目錄執行python examples/ssd/ssd_detect_textarea.py --gpu_id 0 --labelmap_file data/VOC_label/labelmap_voc.prototxt --image_file data/VOCdevkit/VOC_textarea/JPEGImages/000000220.jpg --model_def models/VGGNet/VOC_label/SSD_384x521/deploy.prototxt --model_weights models/VGGNet/VOC_label/SSD_384x521/VGG_VOC_label_SSD_384x521_iter_4500.caffemodel即可對輸入圖片預測,如下所示:

 

當然畫的框比較細哈,當然換可以正在視頻預測,把python examples/ssd/ssd_pascal_video.py,改下這個函數就行,我就不試了哈,各位如果有實現過程有什麼問題隨時留言,很樂意幫助大家

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