本人使用微软发布的用于图像目标检测的标注工具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系统下的文件可以直接拖动复制到服务器中。界面如下
以下步骤是基于本人实验环境下完成的。
git clone https://github.com/pjreddie/darknet
cd darknet
以上是官网给出的教程,根据它的教程,本人的环境配置如下:
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
如果没有报错,执行下一步
在darknet-master目录下新建文件夹VOCdevkit,并在该文件夹下继续新建下列文件夹结构
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()
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 文件
下载darknet53.conv.74 然后将darknet53.conv.74放在darknet-master目录下
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
默认标签名是如下20种,将其改为自己数据集的标签名
官方教程
训练模式下,将Training下的参数取消注释,测试时相反,将Testing下的参数取消注释,并将Training参数注释掉
继续修改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,关闭多尺度训练;
单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
修改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