之前參考過幾篇文章發現沒有可以走通的訓練自己的數據集的例子,根據網上的幾篇文章自己做了個完整的,並且已驗證訓練出的model
paper:https://arxiv.org/abs/1512.02325
作者代碼:https://github.com/weiliu89/caffe/tree/ssd
-
製作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
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
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
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.快捷鍵
建議用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.txt和val.txt
%trainval佔總數據集的50%,test佔總數據集的50%;train佔trainval的50%,val佔trainval的50%;
%上面所佔百分比可根據自己的數據集修改,如果數據集比較少,test和val可少一些
%%
%注意修改下面四個值
xmlfilepath='D:\Data\Annotations';
txtsavepath='D:\Data\ImageSets\Main\';
trainval_percent=0.5;%trainval佔整個數據集的百分比,剩下部分就是test所佔百分比
train_percent=0.5;%train佔trainval的百分比,剩下部分就是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下創建VOC2007和VOC2012然後把Annotations、ImageSets和JPEGImages文件夾及其中包含的xml 圖片一起考到以上兩個文件夾
(9). 修改$CAFFE_ROOT/data/$dataset_name/下create_list.sh和create_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