深度學習ssd檢測模型訓練自己的數據集

之前參考過幾篇文章發現沒有可以走通的訓練自己的數據集的例子,根據網上的幾篇文章自己做了個完整的,並且已驗證訓練出的model


paper:%W@GJ$ACOF(TYDYECOKVDYBhttps://arxiv.org/abs/1512.02325
作者代碼:%W@GJ$ACOF(TYDYECOKVDYBhttps://github.com/weiliu89/caffe/tree/ssd


 


  1. 製作VOC數據集


標註圖片數據(Label Image Data)


Dependencies
Linux


1

2

3

4

$ sudo apt-get install pyqt4-dev-tools

$ sudo pip install lxml

$ make all

$ ./labelImg.py


Mac requires $ brew install libxml2 when installing lxml


Windows


Need to downloadand setup Python 2.6 or later and PyQt4. Also, you needto install other python dependencies.


Open cmd and goto [labelImg]


1

2

$ pyrcc4 -o resources.py resources.qrc

$ python labelImg.py


Usage


After cloningthe code, you should run $ make all to generate theresource file.


You can thenstart annotating by running $ ./labelImg.py. For usage
instructions you can see
Here


At the momentannotations are saved as an XML file. The format is PASCAL VOC format, and theformat is the same as ImageNet


You can also seeImageNet Utils to downloadimage, create a label text for machine learning, etc


General steps from scratch


Build and launch: $ make all; python labelImg.py Click Change default saved annotation folder in Menu/File Click Open Dir Click Create RectBox


The annotationwill be saved to the folder you specify


Create pre-defined classes


You can edit thedata/predefined_classes.txt to loadpre-defined classes


Hotkeys


Ctrl + r : Change the defult target dir which saving annotation files Ctrl + n : Create a bounding box Ctrl + s : Save n : Next image p : Previous image


How to contribute


Send a pullrequest


License


License


(1).安裝依賴庫


1

2

3

$ sudo apt-get install pyqt4-dev-tools

$ sudo pip install lxml

$ make all


(2).圖片名稱批量修改
將圖片名稱統一後方便後期工作,執行:


1

python rename_images.py


默認圖片存放路徑是在JPEGImages,執行成功後會在該文件夾下生成tmp文件夾,裏面有重命名後
的圖片文件,備份或刪除原圖片,JPEGImages下僅保留重命名後的圖片文件


(3). 修改標籤文件


修改data文件下的predefined_classes.txt文件,改成自己所需要分類的類別名稱,限英文


(4).執行標註程序


1

./labelImg.py


PS.快捷鍵


Ctrl + r : Change the defult target dir which saving annotation files Ctrl + n : Create a bounding box Ctrl + s : Save n : Next image p : Previous image


建議用opendir打開圖片所在文件夾後再按Ctrl + r選擇保存xml文件的位置(建議放在xml文件夾下),
以免與圖片混合起來,方便後期工作.


(5). 格式化xml文件(可選)


部分機器會在生成的xml文件加上版本號,後期訓練時需要將生成的xml文件的首行<?xmlversion=1.0 ?>去除,執行:


1

python delete_file_firstRow.py


執行成功後會在該文件夾下生成Annotations文件夾,裏面有格式化後的xml文件


(6). Linux中用命令刪去xml中的路徑sed –i ‘4d’`find ./ -name “*.xml”` (其中4d是指第四行 path在第四行)


(7). 新建一個文件夾,名字爲Annotations,將xml文件全部放到該文件夾裏;


新建一個文件夾,名字爲JPEGImages,將所有的訓練圖片放到該文件夾裏。


新建文件夾,命名爲ImageSets,在ImageSets裏再新建文件夾,命名爲Main。用以下MATLAB程序根據xml生成test.txttrain.txt trainval.txt val.txt


%% 


%該代碼根據已生成的xml,製作VOC2007數據集中的trainval.txt;train.txt;test.txtval.txt 


%trainval佔總數據集的50%test佔總數據集的50%traintrainval50%valtrainval50% 


%上面所佔百分比可根據自己的數據集修改,如果數據集比較少,testval可少一些 


%% 


%注意修改下面四個值 


 


xmlfilepath='D:\Data\Annotations'; 


txtsavepath='D:\Data\ImageSets\Main\'; 


trainval_percent=0.5;%trainval佔整個數據集的百分比,剩下部分就是test所佔百分比 


train_percent=0.5;%traintrainval的百分比,剩下部分就是val所佔百分比


%% 


xmlfile=dir(xmlfilepath); 


numOfxml=length(xmlfile)-2;%減去...  總的數據集大小    


 


trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent))); 


test=sort(setdiff(1:numOfxml,trainval)); 


 


trainvalsize=length(trainval);%trainvalµÄ´óС 


train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent)))); 


val=sort(setdiff(trainval,train)); 


ftrainval=fopen([txtsavepath 'trainval.txt'],'w'); 


ftest=fopen([txtsavepath 'test.txt'],'w'); 


ftrain=fopen([txtsavepath 'train.txt'],'w'); 


fval=fopen([txtsavepath 'val.txt'],'w');


for i=1:numOfxml 


    if ismember(i,trainval) 


        fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4)); 


        if ismember(i,train) 


            fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4)); 


        else 


            fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4)); 


        end 


    else 


        fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4)); 


    end 


end 


fclose(ftrainval); 


fclose(ftrain); 


fclose(fval); 


fclose(ftest);


 


(8).caffe/data下創建VOCdevkit(創建這個名字不用改腳本,名字任意但記得改shell);在VOCdevkit下創建VOC2007VOC2012然後把AnnotationsImageSetsJPEGImages文件夾及其中包含的xml 圖片一起考到以上兩個文件夾


(9). 修改$CAFFE_ROOT/data/$dataset_name/create_list.shcreate_data.sh兩個文件


Create_list.sh:


root_dir=$HOME/data/VOCdevkit   (VOCdevkit下創建的文件夾名字按要求創建的這裏只需要改這個路徑就可以了,否則還需要改其他遍歷的文件夾名字)


create_data.sh


這個文件同樣只需要改data_root_dir路徑就可以了


(10).修改VOCdevkit下的labelmap_voc.prototxt(沒有就創建)


item {


  name:"none_of_the_above"


  label: 0


  display_name:"background"


}


item {


  name:"自己的類名"


  label: 1


  display_name:"自己的類名"


}


然後在VOCdevkit下執行./create_list.sh,將生成的txt及labelmap_voc.prototxt拷貝到../VOC0712下(這個目錄沒有自己創建,目錄名根據shell中定的)


然後在VOCdevkit下執行./create_data.sh


(11). 修改訓練文件$CAFFE_ROOT/data/example/ssd/ssd_pascal.py


改了數據集文件夾名稱的話講程序路徑裏面的VOC0712都替換爲你的數據集名稱$dataset_name,否則不需要修改,爲了不要覆蓋原來的模型建議修改數據集名稱


類別數:num_classes = 你的類別數


測試圖片數量:num_test_image = 你的測試集文件數


solver_param 中的參數根據自己需要修改調整


(12). pythonexample/ssd/ssd_pascal.py


 



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