1. 程式人生 > >深度學習ssd檢測模型訓練自己的資料集

深度學習ssd檢測模型訓練自己的資料集

各種教學視訊或文件資料 +QQ:635992897

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

paper:https://arxiv.org/abs/1512.02325
作者程式碼:https://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

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

(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