标签:yolov3 voc cfg YOLO V3 label train txt 数据
前言:最近刚好做一个项目需要做detection,选择的算法是yolo v3,因为它既有速度又有精度,还非常灵活,简直是工业界良心。做项目免不了需要用到自己的数据集,所以得从头一个脚印的来,走通了之后决定写一个帖子,让需要用的人少走歪路,节约时间。
官网上已经教我们如何跑起来yolo v3,因此大部分时间其实花在制作数据集上。总体来说,分为四个步骤,分别是:标注数据,利用voc制作自己的数据集,下载并编译源码,局部修改和大功告成(前两步可以在方便操作的环境下(windows或linux)进行,后面几步在linux环境进行)
一、标注数据
-
工具:
使用的标注工具是labelimg,其他标注工具也行,但是生成的标注label文件要是xml。这里给一个labelimg软件的传送门https://pan.baidu.com/s/1tuIQmuyedRHP1WeGVVSx_Q 提取码: ejgx 。 -
数据集编号:
为了规划自己的数据,减少出错的可能性,最好自己先给自己的图片编一个合理的序号,比如0001~0999。 -
标注数据:
利用软件把自己的数据标注好。每一个图片名对应的有一个相应名字的label.xml。
xml中的数据如下所示。这时候的path不用管他,在训练的时候不会用到这里的数据,这里后面会说到。
二、利用voc制作自己的数据集
在目录下新建VOC2007,并在VOC2007下新建Annotations,ImageSets和JPEGImages三个文件夹。在ImageSets下新建Main文件夹。文件目录如下所示:
将自己的数据集图片拷贝到JPEGImages目录下。将数据集label文件拷贝到Annotations目录下。在VOC2007下新建test.py文件夹,将下面代码拷贝进去运行,将生成四个文件:train.txt,val.txt,test.txt和trainval.txt。
import os
import random
trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
生成后的目录结构如下所示:
做好这一步之后,自己的数据集基本做好了,接下来需要转移阵地到代码环境中去。
三、下载并编译源码
YOLOV3的主页:https://pjreddie.com/darknet/yolo/
1、下载代码:
git clone https://github.com/pjreddie/darknet
- 1
2、编译代码:
YOLOV3使用一个开源的神经网络框架Darknet53,使用C和CUDA,有CPU和GPU两种模式。默认使用的是CPU模式,需要切换GPU模型的话,vim修改Makefile文件。
cd darknet
vim Makefile #如果使用CPU模式。则不用修改Makefile文件
- 1
- 2
将前面三行置1,其他不用动。
make
- 1
编译成功后,可以先下载预训练模型测试一下效果。
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
- 1
- 2
可以看到YOLO的detection图。到这里,YOLOV3已经走通了,是时候加入自己的数据了。
3、加入自己的数据集
在代码的darknet目录下新建VOCdevkit文件夹,然后把刚才制作的VOC2007文件夹拷贝到该文件夹下。
有的读者可能了解过YOLOV3的label,YOLOV3的label标注的一行五个数分别代表类别(从 0 开始编号), BoundingBox 中心 X 坐标,中心 Y 坐标,宽,高。这些坐标都是 0~1 的相对坐标。和我们刚才标注的label不同,因此我们需要下面的py文件帮我们转换label。
wget https://pjreddie.com/media/files/voc_label.py
- 1
这里需要修改两个地方,sets和classes,classes根据自己需要修改。
接下来运行该文件,我们的目录下会生成三个txt文件2007_train.txt,2007_val.txt,2007_test.txt,VOCdevkit下的VOC2007也会多生成一个labels文件夹,下面是真正会使用到的label,点开看发现已经转化成YOLOV3需要的格式了。这时候自己的数据集正式完成。
python voc_label.py
cat 2007_train.txt 2007_val.txt > train.txt
- 1
- 2
四、局部修改
1、 修改cfg/voc.data
根据自己的路径修改。
2、修改data/voc.names和coco.names
打开对应的文件都是原本数据集里的类,改成自己的类就行。
3、修改参数文件cfg/yolov3-voc.cfg
ctrl+f搜 yolo, 总共会搜出3个含有yolo的地方。
每个地方都必须要改2处, filters:3*(5+len(classes));
其中:classes: len(classes) = 1,这里以单个类dog为例
filters = 18
classes = 1
可修改:random = 1:原来是1,显存小改为0。(是否要多尺度输出。)
参数文件开头的地方可以选训练的batchsize,要注意!
五、大功告成
如果读者按照步骤已经耐心的到这里了,可以舒一口气了,离成功只差一步了。
下载darknet53的预训练模型。
wget https://pjreddie.com/media/files/darknet53.conv.74
- 1
开始训练:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
- 1
六、关于神经网络训练的讨论:
过拟合该怎么继续训练?
看到书上写道:有了BN之后,就不要正则化去防止过拟合了,比如dropout,L2正则化。实际上也试过确实没什么效果,有时候还会降低结果。这时候train上和valid上表现有差异该怎么解决?是数据集本身就有的分布差异导致的,还是可以通过其他手段解决,如减小模型。欢迎大家讨论留言。
标签:yolov3,voc,cfg,YOLO,V3,label,train,txt,数据 来源: https://blog.csdn.net/CVAIDL/article/details/90480042
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。