安装并配置yolov3
官网链接:https://pjreddie.com/darknet/yolo/
1、下载并安装yolo:
git clone https://github.com/pjreddie/darknet
cd darknet
修改darknet文件夹中的Makefile文件,使用GPU训练令GPU=1,CUDNN=1
GPU=1
CUDNN=1
...
编译源文件
sudo make -j
测试安装是否正确
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
darknet文件夹中会保存这张图片
2、给数据打标签制作voc格式数据集
使用labelimg给图片打标签
接着构建voc数据集样式的目录结构
----VOCdevkit
—VOC2007
—Annotations
—ImageSets
—Main
—JPEGImages
Annotations中存放打标签产生的xml文件
JPEGImages中存放用来打标签的训练图片
Main中是几个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集(需要自己创建TXT文件,并填写图片文件的文件名前缀,如1.jpg,则填写1,需要用空格隔开)
生成路径文件:
构建好层级目录,将文件放入相应目录中,然后分好训练集、验证集和测试集以后,将VOCdevkit文件夹放入darknet/scripts目录中
修改scripts文件夹中的voc_label.py文件,因为没用到2012的数据集,只保留带2007字样的
修改第7行
sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
将“(‘2012’, ‘train’), (‘2012’, ‘val’),”删除掉,改为
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
修改类别名字:
classes = ["aeroplane",...],将其修改为自己的标签:
classes = [“0”,”1”,”2”]
修改最后几行
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")
将 2012_train.txt 2012_val.txt删除掉,改为:
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")
在这里打开终端,运行scripts文件夹中的voc_label.py文件,scripts文件夹中会生成几个TXT文件。
python voc_label.py
3:修改yolov3的训练配置文件
打开cfg/voc.data文件,进行如下修改:
classes= 3 # 自己数据集的类别数
train = /home/xxx/darknet/train.txt # train文件的路径
valid = /home/xxx/darknet/2007_val.txt # test文件的路径
names = data/voc.names
backup = backup
在darknet文件夹下面新建文件夹backup,用于存放训练中生成的模型,1000次以前,是每训练100次保存一次,1000次以后,每训练1000次保存一次,10000次以后,每训练10000次保存一次
分别修改data/voc.name,data/coco.name为样本集的标签名
0
1
2
修改cfg/yolov3-voc.cfg
最开始需要将Testing的配置注释掉,并解除Training配置的注释
batch/subdivisions配置足够可以设置的大一些,可以是64/4
如果不收敛,可以将batch设置的大些,学习率可以设置的小点
其中width、height设置为32的倍数,需要相同越大准确率越高
每个yolo层及其前一层都需要设置,共3个需要修改的地方
filters设置为3*(类别数+1+3),这里类别数是3,所以设置为3*(3+1+3)=24
class设置为类别数,这里是3
以3类目标检测为例主要有以下几处调整:
[net]
# Testing ### 测试模式
# batch=1
# subdivisions=1
# Training ### 训练模式,每次前向的图片数目 = batch/subdivisions
batch=100
subdivisions=64
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.0001 ### 学习率
burn_in=1000 ### 学习率控制的参数
max_batches = 50200 ### 迭代次数
policy=steps ### 学习率策略
steps=40000,45000 ### 学习率变动步长
scales=.1,.1 ### 学习率变动因子
[convolutional]
batch_normalize=1 ### BN
filters=32 ### 卷积核数目
size=3 ### 卷积核尺寸
stride=1 ### 卷积核步长
pad=1 ### pad
activation=leaky ### 激活函数
......
[convolutional]
size=1
stride=1
pad=1
filters=24 #3*(3+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=3 #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #如果显存很小,将random设置为0,关闭多尺度训练;
......
[convolutional]
size=1
stride=1
pad=1
filters=24 #3*(3+4+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=3 #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #如果显存很小,将random设置为0,关闭多尺度训练;
......
[convolutional]
size=1
stride=1
pad=1
filters=24 #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=3 #类别
num=9
jitter=.3 # 数据扩充的抖动操作
ignore_thresh = .5
truth_thresh = 1
random=1 #如果显存很小,将random设置为0,关闭多尺度训练;
4:下载预训练权重文件开始训练检测模型
#下载预训练权重文件
wget https://pjreddie.com/media/files/darknet53.conv.74
#开始训练检测模型
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
训练好以后的模型在darknet/backup文件夹当中
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.