Yolov3 训练自己的数据集

1. 标注工具

1) 标注工具:Lableimg

Lableimg软件(windows版本)下载链接:

https://pan.baidu.com/s/1tuIQmuyedRHP1WeGVVSx_Q 提取:ejgx

2) 给数据集图像按编号顺序命名:如000001.jpg – 000999.jpg;

3) 标注数据:如:图像0000001.jpg, 生成对应的label为000001.xml文件;

 2. 利用VOC制作自己的数据集

  在目录下新建VOC2007,并在VOC2007下新建Annotations,ImageSets和JPEGImages三个文件夹。在ImageSets下新建Main文件夹

                        

      将自己的数据集图片拷贝到JPEGImages目录下。将数据集label文件拷贝到Annotations目录下。在VOC2007下新建test.py文件夹,将下面代码拷贝进去运行,将生成四个文件:train.txt,val.txt,test.txt和trainval.txt。

test.py

 1 import os
 2 import random
 3 
 4 trainval_percent = 0.1
 5 train_percent = 0.9
 6 xmlfilepath = 'Annotations'
 7 txtsavepath = 'ImageSetsMain'
 8 total_xml = os.listdir(xmlfilepath)
 9 
10 num = len(total_xml)
11 list = range(num)
12 tv = int(num * trainval_percent)
13 tr = int(tv * train_percent)
14 trainval = random.sample(list, tv)
15 train = random.sample(trainval, tr)
16 
17 ftrainval = open('ImageSets/Main/trainval.txt', 'w')
18 ftest = open('ImageSets/Main/test.txt', 'w')
19 ftrain = open('ImageSets/Main/train.txt', 'w')
20 fval = open('ImageSets/Main/val.txt', 'w')
21 
22 for i in list:
23     name = total_xml[i][:-4] + '
'
24     if i in trainval:
25         ftrainval.write(name)
26         if i in train:
27             ftest.write(name)
28         else:
29             fval.write(name)
30     else:
31         ftrain.write(name)
32 
33 ftrainval.close()
34 ftrain.close()
35 fval.close()
36 ftest.close()
View Code

生成后的目录结构如下所示:

                            

3. 下载并编译darknet源码

1) 下载源码 git clone https://github.com/pjreddie/darknet

2) 编译代码:

   YOLOV3使用一个开源的神经网络框架Darknet53,使用C和CUDA,有CPU和GPU两种模式。默认使用的是CPU模式,需要切换GPU模型的话,vim修改Makefile文件。

        cd darknet

        vim Makefile  #如果使用CPU模式。则不用修改Makefile文件

   

注:将前面三行置1,其他不用动

 编译: make

编译成功后,可以先下载预训练模型测试一下效果:

    wget https://pjreddie.com/media/files/yolov3.weights

   ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

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

   这里需要修改两个地方,sets和classes,classes根据自己需要修改(注:自己的数据集仍然是20类,防止darknet转ncnn测试时识别精度损失过大)。

       

      接下来运行该文件,我们的目录下会生成三个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

4. 局部修改

1)  修改cfg/voc.data

 

根据自己的路径修改。

2)修改data/voc.names 和 coco.names

3)  修改参数文件cfg/yolo3-voc.cfg

ctrl+f 搜 yolo, 总共会搜出3个含有yolo的地方。

每个地方都必须要改2处, filters:3*(5+len(classes));

其中:classes: len(classes) = 20,这里以上述的20个类为例

  filters = 75

  classes = 20

可修改:random = 1:原来是1,显存小改为0。(是否要多尺度输出。)

参数文件开头的地方可以选训练的batchsize,要注意!

 5.训练数据

1)     下载darknet53的预训练模型:

      wget https://pjreddie.com/media/files/darknet53.conv.74

2)  开始训练:

多GPU同时训练:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3

单gpu训练:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

注:生成的模型文件会保存在backup下

3)  测试模型文件

./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_20000.weights test_img/pen_8.jpg

参考:https://blog.csdn.net/john_bh/article/details/80625220

      https://blog.csdn.net/qq_21578849/article/details/84980298

原文地址:https://www.cnblogs.com/zhaopengpeng/p/14682606.html