系列文章
深度学习-卷积神经网络(目标检测环境搭建)-TensorFlow及Keras环境搭建&详细安装教程
深度学习-卷积神经网络-目标检测之YOLOV3模型-代码运行图片检测实践1
深度学习-卷积神经网络-目标检测之YOLOV3模型-代码运行图片检测实践2
相关文章
深度学习-卷积神经网络-实例及代码0.8—基于最小均方误差的线性判别函数参数拟合训练
深度学习-卷积神经网络-实例及代码0.9—MNIST数据集介绍、下载及基本操作
深度学习-卷积神经网络-实例及代码1(入门)—利用Tensorflow和mnist数据集训练单层前馈神经网络/感知机实现手写数字识别
深度学习-卷积神经网络-实例及代码2(初级)—利用Tensorflow和mnist数据集训练简单的深度网络模型实现手写数字识别
深度学习-卷积神经网络-实例及代码3(图像分类LeNet5模型)—利用Tensorflow和mnist数据集训练LeNet5-CNN模型实现手写数字识别
前一篇文章介绍了在Windows下用CPU实现利用YOLOV3-Keras版本代码执行图片检测,使用的是已经训练好的模型权重
本篇文章详细说明如何使用自己的数据集进行YOLOV3模型权重的训练
使用的代码版本是在前一篇文章中完成的项目KerasYolo3Test2
在Windows环境下使用CPU进行训练
(操作系统:Windows 10专业版 64位)
(CPU:Intel(R) Core(TM) i5-4590 [email protected],内存8G)
第一部分:建立数据集,完成模型权重训练
1、收集图片,形成自己的图片库
图片尽量高清,低分辨率影响训练效果
2、生成标准VOC2007数据集文件夹模板
下载VOC2007数据集:下载地址https://pjreddie.com/projects/,从中找到Pascal VOC Dataset Mirror,点击进入下载VOC 2007中的Train/Validation Data (439 MB)
将下载后的文件解压,解压后的文件夹名称为VOCdevkit,删除该文件夹下的所有文件,仅保留里面的所有文件夹(可右击文件夹-属性查看文件夹中文件数是否为0)
或者不用下载VOC2007数据集,直接按照VOCdevkit文件夹目录结构建好
3、拷贝图片
将VOCdevkit文件夹模板拷贝到前篇文章项目KerasYolo3Test2下
将自己的图片库拷贝到VOCdevkit/VOC2007/JPEGImages目录下
4、标注图片
使用LabelImg工具标注图片
OpenDir--打开VOCdevkit/VOC2007/JPEGImages目录
Change Save Dir--将标注后生成的xml文件设置保存目录为VOCdevkit/VOC2007/Annotations目录
Create Rectbox--对图片目录中打开的图片标注矩形框并标注类别,标注完成后点击Save自动生成xml文件保存到前面设置的保存目录中
LabelImg工具下载地址:https://download.csdn.net/download/firemonkeycs/13038056
5、生成数据集txt文件,从图片库中按比例随机选取生成测试集、验证集、训练集
将CreateTxt.py文件放置在VOCdevkit\VOC2007目录下,CreateTxt.py文件代码如下:
import os
import random
trainval_percent = 0.1 #表示测试集和验证集所占总图片的比例。
train_percent = 0.9 #测试集所占测试集与验证集总和的比例
xmlfilepath = 'Annotations' # xml文件的路径
txtsavepath = 'ImageSets\Main' # 新生成文件的保存路径
# os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。
# 它不包括 '.' 和'..' 即使它在文件夹中。
total_xml = os.listdir(xmlfilepath) #返回Annotations文件夹下的文件和文件夹的列表;得到一个xml文件名列表
num = len(total_xml) #xml文件的总数,也就是列表的长度
list = range(num) #相当于range(0,num,1),这里的0是首位(默认是0)、num是末位、1为跳跃间距(默认是1);但不包括num。
#得到一个[0,1,2,..,num-1]的列表。
tv = int(num * trainval_percent) #xml文件中的交叉验证集数
tr = int(tv * train_percent) #xml文件中的训练集数,注意,我们在前面定义的是训练集占验证集的比例。
#print(tv,tr) #打印出tv、tr进行验证
#random.sample()函数是从指定序列中随机获取指定长度的片段,原有序列不会改变。有两个参数,第一个参数代表指定序列,第二个参数是需获取的片段长度。
#这里相当于获得验证集和训练集数。
trainval = random.sample(list, tv) #随机在list列表中,获得长度为tv的验证集样本列表;
train = random.sample(trainval, tr) #随机在trainval列表,中获得长度为tr的验证集样本列表;
# print(trainval ,'\n',tr) #打印出trainval、train进行验证
#以可写的方式将数据写入文件中
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') #得到验证集
#三层循环
#第一层:在总的xml文件列表中
for i in list:
#name = total_xml[i]
name = total_xml[i][:-4]+'\n' #[:-4]用到了切片;因为文件名为 xx.xml ,[:-4]相当于从第一位截取到倒数第四位,即保留了 xx部分
# print(name)
#在交叉验证集列表中
if i in trainval:
#将符合条件的xml文件名的写入交叉验证集中
ftrainval.write(name)
#在训练集列表中
if i in train:
#将符合条件的xml文件名写入到测试集中
ftest.write(name)
else:
#不符合条件的xml文件名写入验证集中
fval.write(name)
#不在交叉验证集中,那么就在训练集中
else:
ftrain.write(name)
#关闭文件
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
run运行CreateTxt.py文件生成数据集txt文件到VOCdevkit\VOC2007\ImageSets\Main目录下
6,生成YOLOV3模型所需的txt文件
修改voc_annotation.py中的classes = ["", ""]为自己要训练的类别
run运行voc_annotation.py
中间遇到一个报错
>>> runfile('E:/PythonProject2020-PCnew/MyPythonTest/KerasYolo3Test2/voc_annotation.py', wdir='E:/PythonProject2020-PCnew/MyPythonTest/KerasYolo3Test2')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "D: