Yolo学习1-Yolov3训练自己的数据

匿名 (未验证) 提交于 2019-12-03 00:19:01

前提:

可运行的yolov3环境,环境搭建见官网https://pjreddie.com/darknet/yolo/

目的:

实现利用yolov3训练自己的数据集(voc格式)

方法:

1)构建VOC数据集

  • 将你手中的数据集的标注txt修改成voc格式的txt,voc格式如下:
000002.jpg car 44 28 132 121   000003.jpg car 54 19 243 178   000004.jpg car 168 6 298 164  

其中第一列为图片名,第二列为目标类别,最后是目标的包围框坐标(左上角和右下角坐标)。

批量修改文件名python代码:

pic_path = "D:/VOCdevkit/VOC2007/JPEGImages/" piclist = os.listdir(pic_path) total_num = len(piclist) i = 1 for pic in piclist:     if pic.endswith(".jpg"):         old_path = os.path.join(os.path.abspath(pic_path), pic)         new_path = os.path.join(os.path.abspath(pic_path), '000' + format(str(i), '0>5') + '.jpg')         os.renames(old_path, new_path)         i = i + 1

批量合并文件夹内所有txt文件python代码:

import os filedir = "D:/DET/" filenames=os.listdir(filedir) f=open('train.txt','w') for filename in filenames:     filepath = filedir+'/'+filename     for line in open(filepath):         f.writelines(line) f.close()

  • 将该train.txt转换成voc数据所需要的xml,matlab代码如下:

生成的xml如下所示
<annotation> 	<folder>JPEGImages</folder> 	<filename>00000000.jpg</filename> 	<path>/home/zhangzhi/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/00000000.jpg</path> 	<source> 		<database>My Database</database> 	</source> 	<size> 		<width>512</width> 		<height>512</height> 		<depth>3</depth> 	</size> 	<segmented>0</segmented> 	<object> 		<name>car</name> 		<pose>Unspecified</pose> 		<truncated>0</truncated> 		<difficult>0</difficult> 		<bndbox> 			<xmin>277</xmin> 			<ymin>498</ymin> 			<xmax>304</xmax> 			<ymax>511</ymax> 		</bndbox> 	</object> </annotation>
  • 生成Main中的四个txt(train.txt,val.txt,test.txt,trainval.txt)

txt的内容为没有后缀名的图片名称:

000005   000027   000028   000033   000042   000045   000048   000058  

即图片名字(无后缀),test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。可参考以下代码:

%%   %该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt   %trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;   %上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些   %注意修改下面四个值   xmlfilepath='F:/VOCdevkit/VOC2007/Annotations/';   txtsavepath='F:/VOCdevkit/VOC2007/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);  

  • 整合文件
   新建立一个VOC2007文件夹,在该文件夹下面新建JPEGImages,Annotations,labels,ImageSets文件夹,将所有训练的图片均放置在JPEGImages文件夹下,将第二步生成的xml文件放置在Annotations文件夹中,在ImageSets下新建Main文件夹,将第三步生成的四个txt放入其中,将下面步骤生成的文件放置于labels文件夹中

  • 上面步骤的代码均是在Windows下使用,下面代码在Ubuntu下使用。生成labels文件:


2)修改yolov3的相关文件

  • 修改cfg/voc.data文件,进行如下修改:
classes= 4  # 自己数据集的类别数   train  = /home/zhangzhi/darknet/VOCdevkit/2007_train.txt  # train文件的路径   valid  = /home/zhangzhi/darknet/VOCdevkit/2007_test.txt   # test文件的路径   names = data/voc.names   backup = backup  
  • 修改data/voc.names文件,对应自己的数据集修改类别。
car van truck bus
  • 下载Imagenet上预先训练的权重
wget https://pjreddie.com/media/files/darknet53.conv.74 
  • 修改cfg/yolov3-voc.cfg
找到文件中类似的部分进行修改,共有3处:
[convolutional] size=1 stride=1 pad=1 filters=27 activation=linear  [yolo] mask = 0,1,2 anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326 classes=4 num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=1

需要改变filters为num/3*(classes+1+4),即3*(classes+1+4),参考https://github.com/pjreddie/darknet/issues/582,同时需要修改下面的classes的种类。

3)训练,测试

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74  
./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3.weights data/dog.jpg

参考:

https://blog.csdn.net/sinat_30071459/article/details/50723212

https://blog.csdn.net/helloworld1213800/article/details/79749359

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!