keras-yolov3框架:https://github.com/qqwweee/keras-yolo3
labelImg(标注工具):https://github.com/tzutalin/labelImg
darknet:https://github.com/pjreddie/darknet
下载训练好的权重文件或者预训练的权重文件
Python3.5
Keras
tensorflow-gpu-1.9.0(也可以使用CPU版本)
使用GPU版本的话可安装驱动(吐槽一下,真是大坑)
CUDA9.0
cuDNN7.0
首先,在下载好的keras-yolov3的工程文件夹下建一个下图的文件结构,然后将标注好的数据集以及图片放在下面对应的文件夹下
├── VOCdevkit
│ └── VOC2007
│ ├── Annotations #将标注好的数据集放在此文件夹下,注意是VOC格式的数据集
│ ├── ImageSets
│ │ ├── Layout
│ │ ├── Main
│ │ │ ├── test.txt #这三个txt文件可先不用建,后面会自动生成
│ │ │ ├── train.txt
│ │ │ └── val.txt
│ │ └── Segmentation
│ ├── JPEGImages #将训练的图片都放在此文件夹下
│ └── labels
└──
在Annotation文件夹下新建一个test.py文件,目的从数据集中随机选取出训练集,测试集和验证集,会在Main文件夹下生成test.txt,train.txt,val.txt三个文件记录划分的文件名,代码如下:
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()
在keras-yolov3工程文件夹下有一个voc_annotation.py根据test.txt,train.txt,val.txt三个文件,从VOC数据集中xml得到数据然后转换为yolo的txt格式
注意VOC支持的是jpg格式,如果你的图片不是jpg格式那你需要改voc_annotation.py大约第28行的写入文件的后缀
#首先加入一个全局变量
IMG_FORMAT = '.你的图片格式后缀'
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')] #生成的三个文件名
classes = ['car'] #修改为你要训练的类的列表
...
list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s'%(wd, year, image_id) + IMG_FORMAT) #源文件大约第28行的位置
打开原始的yolov3.cfg文件,会查找到文件中有3个[yolo]
注意要将3个[yolo]及其上面的一个卷积层改为如下:
[convolutional]
size=1
stride=1
pad=1
filters=75 #修改此处,公式为 filters = 3*(5+len(classes))
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=20 #修改此处,你训练的类别总数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #如果你的显存不够,可以将此处改为0
首先,Keras输入模型只支持h5文件,故需要将yolov3的weights(权重文件)与cfg(模型结构配置文件)使用keras-yolov3的工程下一个脚本convert.py生成一个h5文件
当前将从darknet官网训练好的yolov3的权重作为预加载模型
转换命令为 python3 -m convert yolov3.cfg yolov3.weights yolo.h5
同理,如果是需要其他预训练权重可以下载darknet的darknet53.conv.74按上面命令生成yolo.h5训练
.cfg --------convert.py------> .h5
.weights
然后将yolo.h5文件名改为yolo_weights.h5放入model_data文件夹中
在voc_classes.txt 文件中写入你所有训练的类别
aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor
找到文件中的_main函数,修改为:
def _main():
annotation_path = '2007_train.txt' #修改为上面voc_annotation得到的训练数据集
log_dir = 'logs/000/'
classes_path = 'model_data/voc_classes.txt' #修改为你的voc_classes的文件路径
anchors_path = 'model_data/yolo_anchors.txt'
class_names = get_classes(classes_path)
num_classes = len(class_names)
anchors = get_anchors(anchors_path)
ok,修改完毕之后可以开始运行训练,enjoy yourself