Darknet框架下训练自己的yolov3模型
1.配置环境(这里是在linux环境下进行训练)
Ubuntu18.04+opencv3.4.3+cuda10.0+cudnn7.5
显卡GTX1080(我选的驱动版本是nvidia-driver-450)
嫌麻烦自己下驱动安装的可以在软件和更新->附加驱动里面更新驱动。
cuda和cudnn参考下面博客
Ubuntu18.04安装opencv3.4.3
https://blog.csdn.net/qq_41080854/article/details/88609795.
ubuntu18.04安装nvidia驱动(435),cuda10.0和cudnn7.5
链接: https://blog.csdn.net/weixin_43802384/article/details/103703843.
2.下载darknet文件
git clone https://github.com/pjreddie/darknet
3.进入darknet文件夹把data->voc.names中的类名修改为自己的类名(一行一个)
4.创建数据集文件
(1)进入darknet->scripts
(2)创建文件名目录
- VOCdevkit
- voc_label.py(文件里面有的,下面需要修改部分代码)
- VOC2007
- Annotations #存放入所有的xml文件
- ImageSets
----Main - JPEGImages #放入所有的图片
- labes
- split.py
- VOC2007
split.py 代码
#!/usr/bin/env python
import os
import random
trainval_percent = 0.1
train_percent = 0.9
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:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
将自己的图片和.xml文件放置正确位置后,先运行split.py
$ ./split.py
后修改voc_label.py文件,在文件头加入
#!/usr/bin/env python
将最后两行代码注释掉
#os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
#os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
修改sets
sets=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
将classes修改成自己的类(与自己在voc.names中的类名和顺序相同)
保存并运行voc_label.py
./voc_label.py
5.修改cfg->yolov3-voc.cfg
# Testing ### 测试模式
# batch=1
# subdivisions=1
# Training ### 训练模式
batch=64
subdivisions=16
......
[convolutional]
size=1
stride=1
pad=1
filters=3*(classes+4+1) #例如类个数=3,则filters=24。
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=3 #类别
......
!!!以下还有两处classes和filters需要修改
6.修改darknet->Makefile
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
CC=gcc
NVCC=/home/user/cuda-9.0/bin/nvcc #NVCC=nvcc 修改为自己的路径
7.下载预训练权重文件
wget https://pjreddie.com/media/files/darknet53.conv.74
8.将darknet53.conv.74预训练权重文件放在darknet文件目录下,然后运行以下命令
$ make
$ ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
训练时的状态(模型.weights文件默认保存在backup文件夹里,模型保存规则默认是迭代1000次以内,每100次保存一个权重(.weight)文件,此后是每10000次保存一次权重(.weight)文件,如果想每1000次保存一次权重文件的话可以在darknet>examples->detector.c文件中)把
if(i%10000==0 || (i < 1000 && i%100 == 0)) //大概在138行
修改为
if(i%10000==0 || i%1000==0 || (i < 1000 && i%100 == 0))
训练时的状态
9.对模型的一些操作
(1)停止训练
ctrl+c
(2)继续训练
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_xxxx.weights(记得改yolov3-voc.data和权重文件名)
(3)检测
./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_xxxx.weights(摄像头)
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_xxxx.weights data/xxxx.jpg(图片)
./darknet detector demo cfg/voc.data cfg/yolov3.cfg yolov3.weights <video file> (视频文件)
萌新一枚,如有写的不当之处还请多多包涵