YOLOv3训练自己的数据集

一、数据集标记并导出

本人使用微软发布的用于图像目标检测的标注工具VoTT,该工具能够标记和注释图像目录或独立视频,用于神经网络训练、计算机视觉、目标识别等。将自己的数据集标记完成后,导出成Pascal VOC格式的(根据自己需求导出),VoTT支持导出多种格式。

导出之后的文件如下

二、配置训练环境

推荐大家去阅读darknet53的README,基本教程都有,满满的干货。链接:https://github.com/AlexeyAB/darknet

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

本人使用的是Ubuntu Sever 16.04版本,没有可视化界面;本人电脑Windows10,使用 MobaXterm 客户端连接服务器,操作便捷,Windows系统下的文件可以直接拖动复制到服务器中。界面如下

YOLOv3训练自己的数据集_第1张图片

以下步骤是基于本人实验环境下完成的

1.下载YOLOv3

git clone https://github.com/pjreddie/darknet  
cd darknet  

2.在make之前,可以在Makefile中设置这些选项

YOLOv3训练自己的数据集_第2张图片

以上是官网给出的教程,根据它的教程,本人的环境配置如下:

GPU=1 #如果使用GPU设置为1,CPU设置为0
CUDNN=1  #如果使用CUDNN设置为1,否则为0
OPENCV=1 #如果调用摄像头,还需要设置OPENCV为1,否则为0
OPENMP=0  #如果使用OPENMP设置为1,否则为0
DEBUG=0  #如果使用DEBUG设置为1,否则为0

参阅网上其他教程,博主会提示更改 NVCC 等路径改为自己的:

CC=gcc
NVCC=/home/user/cuda-9.0/bin/nvcc   #NVCC=nvcc 修改为自己的路径
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread 
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC
...
ifeq ($(GPU), 1) 
COMMON+= -DGPU -I/home/hebao/cuda-9.0/include/  #修改为自己的路径
CFLAGS+= -DGPU
LDFLAGS+= -L/home/hebao/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand  #修改为自己的路径

根据自己的需要更改,更改完成之后,在darknet-master目录下执行make

 如果没有报错,执行下一步

3.准备训练数据集

在darknet-master目录下新建文件夹VOCdevkit,并在该文件夹下继续新建下列文件夹结构

YOLOv3训练自己的数据集_第3张图片

Annotations中是所有的xml文件 ,JPEGImages中是所有的训练图片,然后分别将自己导出的数据集按内容复制到对应的文件夹。在VOC2007目录下新建.py文件(make_main_txt.py),运行python文件在Main文件夹下生成4个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集;make_main_txt.py代码如下:

import os
import random

def _main():
    trainval_percent = 0.1
    train_percent = 0.9
    xmlfilepath = 'Annotations'
    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()


if __name__ == '__main__':
    _main()

4.下载voc_label.py文件

voc_label.py

将voc_label.py文件放到darknet目录下(与VOCdevkit同级),然后修改文件内容,classes内容修改为自己数据集标签

sets=[('2007', 'train'), ('2007', 'val')]
...
classes=["airplane"]

保存,python运行voc_label.py,darknet目录下在生成 2007_train.txt 2007_val.txt 文件

5.下载Imagenet上预训练的权重darknet53.conv.74

下载darknet53.conv.74  然后将darknet53.conv.74放在darknet-master目录下

6.修改cfg/voc.data

classes= 1  #classes为训练样本集的类别总数
train  = /home/user/darknet/2007_train.txt  #train的路径为训练样本集所在的路径
valid  = /home/user/darknet/2007_val.txt  #valid的路径为验证样本集所在的路径
names = data/voc.names  #names的路径为data/voc.names文件所在的路径
backup = backup

7. 修改data/voc.name为样本集的标签名

默认标签名是如下20种,将其改为自己数据集的标签名

YOLOv3训练自己的数据集_第4张图片

8.在文件yolov3-voc.cfg中设置batch = 64和subdivisions = 16

官方教程

训练模式下,将Training下的参数取消注释,测试时相反,将Testing下的参数取消注释,并将Training参数注释掉

YOLOv3训练自己的数据集_第5张图片

继续修改classes和filter

[convolutional]
size=1
stride=1
pad=1
filters=18  #3*(1+4+1)
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1  #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  #1,如果显存很小,将random设置为0,关闭多尺度训练;
......

[convolutional]
size=1
stride=1
pad=1
filters=18  #3*(1+4+1)
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1  #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  #1,如果显存很小,将random设置为0,关闭多尺度训练;
......

[convolutional]
size=1
stride=1
pad=1
filters=18  #3*(1+4+1)
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=1  #类别
num=9
jitter=.3  # 数据扩充的抖动操作
ignore_thresh = .5  #文章中的阈值1
truth_thresh = 1  #文章中的阈值2
random=0  #1,如果显存很小,将random设置为0,关闭多尺度训练;

 9.开始训练

单GPU训练:

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

如果是多GPU训练的话:

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

 10.测试

修改cfg/yolov3-voc.cfg,将Testing下的参数取消注释,并将Training参数注释掉

测试图片:

./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_900.weights data/1.jpg

测试视频:

./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_900.weights data/1.mp4

总结:现阶段只是会简单使用YOLOv3进行目标检测,感谢互联网各位大牛,我要多向各位大牛学习!另外,此博客主要作为本人的学习笔记,其次作为参考,谢谢!

你可能感兴趣的:(计算机视觉,目标检测)