深度学习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

扫描二维码关注公众号,回复: 3527796 查看本文章


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


 




猜你喜欢

转载自blog.csdn.net/liu_xiao_cheng/article/details/78563632