之前参考过几篇文章发现没有可以走通的训练自己的数据集的例子,根据网上的几篇文章自己做了个完整的,并且已验证训练出的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