Yolov3训练自己的数据集(linux版)
训练数据集
1.下载yolov3工程项目
git clone https://github.com/pjreddie/darknet
2.修改Makeflie配置文件
GPU=1 #如果使用GPU训练就设置为1,CPU设置为0
CUDNN=1 #使用GPU就需要调用到CUNDD,当使用GPU时就设置为1,否则设置为0
OPENCV=0 #需要调用摄像头则设置为1,否则设置为0
OPENMP=0
DEBUG=0
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52]
# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52
VPATH=./src/:./examples
SLIB=libdarknet.so
ALIB=libdarknet.a
EXEC=darknet
OBJDIR=./obj/
CC=gcc
CPP=g++
NVCC=/usr/local/cuda-10.0/bin/nvcc #需要修改成自己的路径
AR=ar
建议NVCC的路径去看看自己相对应的文件夹中是否存在nvcc,以免存在错误。
- Makeflie保存完成之后,在darknet目录下执行make
- 下载yolov3的模型文件进行测试一下
wget https://pjreddie.com/media/files/yolov3.weights
- 进行测试
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
看配置是否存在问题。
3.准备训练的VOC数据集
VOC数据集的结构:
VOCdevkit
- VOC2007
- Annotations
- ImageSets
- main
- JPEGImages
Annotations文件夹中一般是存放xml的文件,对应的是图片标识的坐标。
ImageSets/main文件夹中一般存放4个自动生成的txt文件。
JPEGImages文件夹中存放图片。
这里给出自动生成的4个txt的代码:
text.py
import os
import random
trainval_percent = 0.5
train_percent = 0.5
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:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
将其放在与Annotations,ImageSets,ImageSets文件夹同一目录下,运行text.py代码即可生成main中的四个文件。
最后将VOCdevkit文件夹放在darknet/data文件夹中。
最后是需要生成YOLO所需要的VOC标签,首先复制darknet/scripts中的voc_label.py到darknet/data文件夹中。
修改darknet/data/voc_label.py
#由于没有使用到voc2012的数据集,所以将2012的删除
sets=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
#种类按照自己的数据集来
classes = ["person"]
#最后一段也一样修改
os.system("cat 2007_train.txt 2007_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")
在data文件夹中运行voc_lable.py,在data文件夹中生成2007_test.txt,2007_train.txt,2007_val.txt,train.all.txt,train.txt文件即完成VOC数据集的制作。
4.yolov3训练数据集
修改cfg/voc.data文件
classes= 1 #数据集的类别数
train = data/train.txt #train文件路径
valid = data/2007_test.txt #test文件路径
names = data/voc.names
backup = backup #模型保存的文件夹
在darknet文件夹中创建backup文件夹,以免保存模型的时候,找不到路径而出现错误。
修改data/voc.names文件,将类别修改为自己数据集的类别。
person #修改为自己的类别
修改cfg/yolo-voc.cfg
[net]
# Testing
#batch=1 #将这里注释掉
#subdivisions=1 #将这里注释掉
#Training
batch=64 #这里取消注释
subdivisions=16 #这里取消注释
width=416
height=416
channels=3
momentum=0.99
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
搜索文件内含有yolo的地方,3个yolo。注意是要修改三个地方的yolo!
[convolutional]
size=1
stride=1
pad=1
filters=18 #修改这里 按照3*(5+len(class))来计算
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=1 #显存小就修改为0
在darknet文件夹下载预先训练的权重文件
wget https://pjreddie.com/media/files/darknet53.conv.74
下载完成之后就可以训练数据集了,在darknet文件夹下使用下面命令即可训练
sudo ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
易出现的错误
1.在make时出现
当出现/build/tools/caffe: error while loading shared libraries: libcudart.so.10.0错误
解决:
将cuda的lib中的链接库复制到path目录下:
sudo cp /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/local/lib/libcudart.so.10.0 && sudo ldconfig
sudo cp /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/libcublas.so.10.0 && sudo ldconfig
sudo cp /usr/local/cuda-10.0/lib64/libcurand.so.10.0 /usr/local/lib/libcurand.so.10.0 && sudo ldconfig
2.配置文件编码问题
当出现First section must be [net] or [network]: No such file or directory错误
解决:
将该文件修改格式
在vim下 :set ff=unix
保存文件退出
3.使用GPU训练报错
当出现CUDA Error: invalid device ordinal错误
解决:
使用自己所需要的GPU训练
sudo ./darknet -i 0 detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74