用 YOLO 训练一个小型数据集

文章目录

  • 用 YOLO 训练数据
    • 1. 制作VOC格式的数据集
        • 1.1 建立存放训练数据的文件夹
        • 1.2 图片重命名
        • 1.2 制作 voc 格式的 xml 标签文件
        • 1.3 生成训练和测试文件
        • 1.4 转换 xml 标签文件的格式
    • 2. 配置文件修改
      • voc.data
      • voc.names
      • yolov3-cov.cfg
    • 3. 训练数据
  • 其他问题

用 YOLO 训练数据

1. 制作VOC格式的数据集

1.1 建立存放训练数据的文件夹

在 darknet 目录下新建 voc 文件夹,在里面创建子文件夹 VOCdevkit
继续在 VOCdevkit 中创建 VOC 2007,创建三个子文件夹:

  • Annotations 用于存放 xml 标签文件
  • ImageSets 用于存放训练数据等的名称
  • JPEGImages 用于存放训练数据
    用 YOLO 训练一个小型数据集_第1张图片

1.2 图片重命名

VOC 的命名格式为:000001.jpg,路径名称 path 根据自己的实际位置进行修改。

# -*- coding: utf-8 -*-
import os
path = "H:\DataSet\data\myYOLO\YOLOv3训练集\data\images"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
    print(file)
#遍历所有文件
for file in filelist:
    #原来的文件路径
    Olddir=os.path.join(path, file)
    #如果是文件夹则跳过
    if os.path.isdir(Olddir):
        continue
    #文件名
    filename=os.path.splitext(file)[0]
    #文件扩展名
    filetype=os.path.splitext(file)[1]
    #用字符串函数zfill 以0补全所需位数
    Newdir=os.path.join(path,str(count).zfill(6)+filetype)
    #重命名
    os.rename(Olddir,Newdir)
    count+=1

修改后的训练数据名:
用 YOLO 训练一个小型数据集_第2张图片

1.2 制作 voc 格式的 xml 标签文件

打标签工具: labelImg: labelImg 下载

使用方法: 在图片中给物体画框然后输入标签就可以了,打标结果保存到 imgData/annotations 文件夹中,格式是 xml 文件。例如对于图片 001.jpg,打标结果保存为 001.xml。

python3 labelImg.py  # 打开labelImg

标注流程:

  • 打开需要标记的图片文件夹 open dir
  • 修改保存路径(即保存 xml 标签的文件夹)change save dir
  • 标注 ROI 区域,填写标签 create rectbox,快捷键是 W
  • 保存 xml 文件 save,快捷键是 Ctrl + S
  • 点击下一张图片进行标记 next image,快捷键是 D,上一张是 A

1.3 生成训练和测试文件

生成了 Annotation 文件夹下的 xml 标签文件之后,就可以生成 4 个 txt 文件,分别为:

  • train.txt
  • val.txt
  • test.txt
  • trainval.txt

这 4 个文件中存储的是上一步中 xml 文件的文件名。 trainval 和 test 内容相加为所有 xml 文件,train 和 val 内容相加为trainval。生成代码如下:(路径 path 根据自己的实际情况进行修改)

import os
import random

trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = 'xml文件存储的路径'
txtsavepath = '生成txt文件的存储路径'
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(txtsavepath+'/trainval.txt', 'w')
ftest = open(txtsavepath+'/test.txt', 'w')
ftrain = open(txtsavepath+'/train.txt', 'w')
fval = open(txtsavepath+'/val.txt', 'w')

for i  in list:
    name=total_xml[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest .close()

1.4 转换 xml 标签文件的格式

yolo 训练要求标签文件格式为 txt,所以将要 voc 格式的 xml 标签文件转换成 txt 标签文件。

转换脚本: voc_label.py

首先下载格式转化脚本到 VOCdevkit 的同级目录下:wget https://pjreddie.com/media/files/voc_label.py

打开 voc_label.py 进行修改

# 因为没有用到VOC2012的数据,要修改年份
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
# 修改检测的物体种
classes = ["dogcatperson"]

运行 voc_label.py 即可完成文件转化,

如果要用多个 txt 中的数据一起用来训练,就需要先合并文件。比如合并 train_2007.txt 和 train_2012.txt
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

这里由于已经生成了 trainval.txt 文件,所以无需合并,直接用 train.txt 和 val.txt 的合并文件 trainval.txt 来训练。

如果还没有生成 txt 文件,也可以用 txt 标签文件进行生成:

import os
import random

trainval_percent = 0.5
train_percent = 0.5
txtfilepath = 'H:\DataSet\data\myYOLO\YOLOV3训练\data\labels'
txtsavepath = 'H:\DataSet\data\myYOLO\YOLOV3训练\data\ImageSets'
total_txt = os.listdir(txtfilepath)

num=len(total_txt)
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(txtsavepath+'/trainval.txt', 'w')
ftest = open(txtsavepath+'/test.txt', 'w')
ftrain = open(txtsavepath+'/train.txt', 'w')
fval = open(txtsavepath+'/val.txt', 'w')

for i  in list:
    name=total_txt[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest .close()

2. 配置文件修改

voc.data

打开 cfg/voc.data 文件,进行如下修改:

classes= 4  # 自己数据集的类别数
train  = /data/monn/darknet/project_yolov3/voc/VOCdevkit/VOC 2007/ImageSets/traindata.txt  # train文件的路径
valid  = /data/monn/darknet/project_yolov3/voc/VOCdevkit/VOC 2007/ImageSets/test.txt   # test文件的路径
names = /data/monn/darknet/project_yolov3/data/voc.names #用绝对路径
backup = /data/monn/darknet/project_yolov3/backup #模型保存的文件夹

注意需要在 darknet 文件夹下,新建名为 backup 的文件夹,否则训练过程报错:Couldn’t open file: backup/yolov3-voc.backup

voc.names

打开 data/voc.names 文件,对应自己的数据集修改类别。

people
front
side
back

yolov3-cov.cfg

修改 == yolov3-voc.cfg== 配置文件,或者直接上传一个新的配置文件,起名为 yolov3-my.cfg 也行。

  • 这里的 batch 和 subdivisons 原本是被注释掉的,要自己训练时先把注释去掉,在测试的时候要改回来(把训练注释掉,测试取消注释)。
  • 修改 filters,计算方法为: 3 ∗ ( c l a s s e s + 5 ) 3*(classes+5) 3(classes+5)
  • 修改 classes 为自己的类别数量
  • random = 0 即关闭多尺度训练,设置为 1 可以增加检测精度
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

3. 训练数据

首先下载 Imagenet 上预先训练的权重:
wget https://pjreddie.com/media/files/darknet53.conv.74

训练我们的数据,并保存 log 日志文件:
./darknet detector train cfg/voc.data cfg/yolov3-my.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3.log

训练结束,修改 cfg 文件后进行测试:
./darknet detect cfg/yolov3-my.cfg yolov3-voc_900.weights test3.jpg

其他问题

YOLOV3训练出现nan的问题?
在显存允许的情况下,可适当增加batch大小,可以一定程度上减少NAN的出现,动量参数可以调为0.99。

你可能感兴趣的:(#,Others,论文笔记)