1. 模型训练环境:
1) 系统:Ubuntu16.042) 显卡:TITAN XP3)CUDA:9.14) CUDNN:7.55) 运行内存32G6)pycharm7)anaconda
2. 资源的下载:
基于darknet框架在Linux系统下训练YOLOV3数据集,下载darknet文件,链接: https://download.csdn.net/download/qq_41900772/11340101 。
YOLOV3算法模型训练主要用到文件夹中的:cfg、data,以及后文中所建立的数据集。
文件夹中的各个文件夹的作用:
1)cfg:cfg文件夹中主要存放了网络训练所需要的网络配置文件2)data:主要存放了,网络测试所需测试图片、网络训练所需训练类别名文件(如:voc.names、coco.names)3)example:主要存放了可能会用到的一些函数评价接口。4)python:存放了网络对应的python接口。5)Makefile文件为训练所需的最重要的配置文件。
3. VOC格式的数据集的制作
在主目录下建立文件夹VOC,在该文件夹下建立数据集。3.1 数据集目录:
1.VOCdevkit #根目录 1.1VOC2019 #不同年份的数据集,名称年份可以改 1.1.1Annotations #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等 1.1.2ImageSets #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本 1.1.2.1Action(训练过程中用不到) 1.1.2.2Layout(训练过程中用不到) 1.1.1.3Main 1.1.1.4Segmentation(训练过程中用不到) 1.1.3JPEGImages #存放源图片 1.1.4SegmentationClass #存放的是图片,语义分割相关(训练过程中用不到) 1.1.5SegmentationObject #存放的是图片,实例分割相关(训练过程中用不到)
3.2 制作数据集:1)根据上目录建立数据集2)加纳所有图片名称进行重排序3)将训练图片放入JPEGImages文件夹中4)采用Imagelabel工具对训练图片进行标注,生成xml文件5)将上一步所生成的xml文件放入(注意:图片与xml文件要一一对应)6)在Main文件夹下生成train.txt、test.txt两个文件,两个文件中为训练图片的名字7)将xml文件转换成txt格式文件
3.3 Main文件夹下的文件
根据xml文件生成与xml文件相对应的数据单序列,分为训练集与测试集,数据名要存放在Main文件夹下的.txt文件中以作备用
将以下代码放进python文档中,并把文档放在VOC2019文件下
//文件名: shengcheng_Mai_wenjian.py 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) ftrainval = open('ImageSets/Main/test.txt', 'w') ftrain = open('ImageSets/Main/train.txt', 'w') for i in list: name = total_xml[i][:-4] + '\n' if i in trainval: ftrainval.write(name) else: ftrain.write(name) ftrainval.close() ftrain.close()
3.4 将.xml文件转换到.txt文件
从.xml文件到VOC2019文件夹中“label”文件夹中的.txt文件(标注图像的坐标及中心点信息),同时,在VOCdevkit同级文件夹下生成train.txt、test.txt两个文件,两个文件的内容为训练图片的路径(该步骤提取训练所需要的信息)
将以下代码放在python文档中,并把文档放在与VOCdevkit同级目录下。
import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join from multiprocessing import Pool sets=[('2019', 'train'), ('2019', 'test')] classes = ['logo','number','face'] def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def convert_anno