YOLOv3训练自己的数据(linux)

一、下载相关文件

1.下载预训练权重文件

YOLOv3使用在Imagenet上预训练好的模型参数的基础上继续训练。

下载链接为https://pjreddie.com/media/files/darknet53.conv.74

或使用wget命令下载:

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

2.下载YOLOv3工程项目

下载链接为https://github.com/pjreddie/darknet

或者

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

ps:可以修改Makefile文件达到是否使用GPU加速、opencv等。

在darknet目录下执行make。

3.下载预训练模型(简单测试yolov3)

下载链接为https://pjreddie.com/media/files/yolov3.weights

或者

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

用预训练模型进行简单的测试:

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

二、准备训练数据集

1.打标自己的数据

打标工具推荐使用 labelImg,下载链接为https://github.com/tzutalin/labelImg

或者

git clone https://github.com/tzutalin/labelImg

打标工具的具体使用自行查找。

2.数据集分类

训练集(train set) —— 用于模型拟合的数据样本。
验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。

在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;

在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。

测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。

3.打包训练数据集

按下列文件夹结构,将训练数据集放到各个文件夹下面,生成3个训练、测试和验证txt文件列表 :

VOCdevkit 
—VOC2007 
——Annotations 
——ImageSets 
———Layout 
———Main 
———Segmentation 
——JPEGImages 
Annotations中是所有的xml文件 
JPEGImages中是所有的训练图片 
Main中是3个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集。

三、训练Pascal VOC格式的数据

生成Labels,因为darknet不需要xml文件,需要.txt文件

用voc_label.py(位于./scripts,共修改四处(备注):

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')] #替换为自己的数据集

classes = ["aeroplane", "bicycle"]  #修改为自己的类别


def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id)) #将数据集放于当前目录下
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt") #修改为自己的数据集用作训练

然后在voc_label.py目录下执行

python voc_label.py

四、修改cfg文件中的voc.data

classes= 2   #修改为自己的类别数
train  = /home/learner/darknet/data/voc/train.txt   #修改为训练集路径(自己定,下同)
valid  = /home/learner/darknet/data/voc/2007_val.txt   #修改为验证集路径
names = /home/learner/darknet/data/voc.names  #修改见voc.names
backup = /home/learner/darknet/backup   #修改为自己的路径,输出的权重信息将存储其内

五、修改VOC.names(新建即可)

aeroplane #自己需要的类别,一行一个。
bicycle

六、修改cfg/yolov3-voc.cfg(也可新建.cfg文件,内容同yolov3-voc.cfg)

需要修改几处(见标注):

[net]
# Testing
 batch=64
 subdivisions=32   #每批训练的个数=batch/subvisions,根据自己GPU显存进行修改,显存不够改大一些
# Training
# batch=64
# subdivisions=16
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 50200  #训练步数
policy=steps
steps=40000,45000  #开始衰减的步数
scales=.1,.1



...
...



[convolutional]
size=1
stride=1
pad=1
filters=21   #filters = 3 * ( classes + 5 )   here,filters=3*(2+5)
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=2    #修改为自己的类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

[route]
layers = -4

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 61



[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=21    #filters = 3 * ( classes + 5 )   here,filters=3*(2+5)
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=2  #修改为自己的类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

[route]
layers = -4

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 36



[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=21    #filters = 3 * ( classes + 5 )   here,filters=3*(2+5)
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=2   #修改为自己的类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

七、训练自己的模型

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

如若第六步使用自己新建的.cfg文件,需要改cfg/yolov3-voc.cfg为自己新建.cfg路径。

也可多GPU训练

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

八、测试(待续)

九、question

使用gpu加速出现cuda错误。

https://blog.csdn.net/qq_33485434/article/details/80432054

你可能感兴趣的:(linux,ubuntu,yolov3)