##################################
同学们,这个系列的文件不要直接就跟着我操作了,因为这个是踩坑的记录,不是教程,我只是将整个流程记录下来,让后面的同学操作的时候能够避开这些坑,希望你能将整个系列的操作流程看了一遍斟酌后进行操作
##################################
在上一节的虚拟机内
当数据集重新修改完成后
训练时要有测试集和训练集,那么在这里就需要使用代码将数据进行划分,放在ImageSets/Main文件夹下。代码如下,至于训练验证集和测试集的划分比例,以及训练集和验证集的划分比例,根据自己的数据情况决定。使用下面的代码进行划分:
移动到【/home/heying/darknet/scripts/VOCdevkit】
命名为VOC2021
将xml的路径再次修改,因为进行标注的主机合训练的主机是两个,所以标注过程生成的路径是不对的
编辑rename_xml.py文件
########此文件可将.xml中的路径进行修改##############
import os
import os.path
from xml.etree.ElementTree import parse, Element
# .xml文件地址
path = "/home/xiong/VOC/VOC_MAX/Annotations/"
# 得到文件夹下所有文件名称
files = os.listdir(path)
s = []
# 遍历文件夹
for xmlFile in files:
# 判断是否是文件夹,不是文件夹才打开
if not os.path.isdir(xmlFile):
print(xmlFile)
pass
path = "/home/xiong/VOC/VOC_MAX/Annotations/"
newStr = os.path.join(path, xmlFile)
#最核心的部分,路径拼接,输入的是具体路径
#得到.xml文件的根(也就是annotation)
dom = parse(newStr)
root = dom.getroot()
#获得后缀.前的文件名(分离文件名和扩展名)
part = os.path.splitext(xmlFile)[0]
# 文件名+后缀
part1 = part + '.jpg'
# path里的新属性值:
newStr1 = '/home/xiong/VOC/VOC_MAX/JPEGImages/' + part1
#通过句柄找到path的子节点,然后给子节点设置内容
root.find('path').text = newStr1
# #打印输出
print('已经修改')
dom.write(newStr, xml_declaration=True)
pass
#原文链接:https://blog.csdn.net/weixin_45392405/article/details/106679679
运行
然后找到并打开set_txt.py文件
把VOC数据集转化成txt文件python
要注意代码高亮区域的路径要和你的文件路径对应好
#####################可以生成数据集需要的.txt文件#######################
import os
import random
trainval_percent = 1
train_percent = 0.5
xmlfilepath = '/home/xiong/VOC/VOC_MAX/Annotations' #标注生成的文件夹
txtsavepath = '/home/xiong/VOC/VOC_MAX/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('/home/xiong/VOC/VOC_MAX/ImageSets/Main/trainval.txt', 'w')
#生成一个训练验证集
ftest = open('/home/xiong/VOC/VOC_MAX/ImageSets/Main/test.txt', 'w')
#生成一个随机进行图片抽取来测试的文件
ftrain = open('/home/xiong/VOC/VOC_MAX/ImageSets/Main/train.txt', 'w')
#生成一个训练集,进行深度训练学习
fval = open('/home/xiong/VOC/VOC_MAX/ImageSets/Main/val.txt', 'w')
#生成一个验证集,当训练完后,进行准确率验证
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
ftrain.write(name)
if i in train:
g=0
else:
fval.write(name)
ftest.write(name)
#else:
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
使用python3运行set_txt.py文件生成test.txt、train.txt、trainval.txt、val.txt。
python3 set_txt.py
打开在和VOCdevkit 同级的目录下的voc_label.py文件,修改相关配置
在文件中根据自身情况修改
#这里的参数使用命名文件夹的参数
sets=[('2021', 'train'),('2021', 'test'),('2021', ‘val’),('2021', ‘trainval’)]
#使用的所有标签
classes = ["red", "green", "null"]
在修改所使用的标签文件,要注意标签的顺序
完成后使用python3运行voc_label.py
python3 voc_label.py
可以看到程序在路径中生成的文件与内容
trainval.txt、val.txt。文件,里面存有对应图片文件的绝对路径,训练时作为引用。
在 darknet/data 目录下建立 voc2021.names 的文件(文件名无所谓,后缀得是.names),内容是类名
touch voc2021.names
然后找到并修改 cfg/voc.data 文件,修改后如下所示:
classes= 3
train = /home/heying/darknet/scripts/2021_train.txt
valid = /home/heying/darknet/scripts/2021_test.txt
names = data/voc2021.names
backup = /home/heying/darknet/backup/
其中
【classes= 3】指标签的数量,本次流程为3个
【train = /home/heying/darknet/scripts/2021_train.txt】 刚生成的2021_train.txt的绝对路径
【valid = /home/heying/darknet/scripts/2021_test.txt】刚生成的2021_test.txt的绝对路径
【names = data/voc2021.names】刚设置的标签名称的文件
【backup = /home/heying/darknet/backup/】训练过程中权重的保存路径
完成后保存并退出
然后修改 cfg/yolov3-voc.cfg 文件
yolov3-voc.cfg解释说明
主要是 filters 和 classes 的调整
搜索yolo,有三个地方需要以下修改
classes就是本次训练的标签数量,这里便是3个
其中filters = 3*(classes数量+5)
以下注释的参数根据自身的需求进行修改,不过要注意【max_batches】参数是需要训练的总次数,这里我取5000次训练总数。
完成后保存并退出