yolov3的训练(五)darknet的VOC测试集和训练集以及训练前准备

VOC测试集和训练集



##################################
同学们,这个系列的文件不要直接就跟着我操作了,因为这个是踩坑的记录,不是教程,我只是将整个流程记录下来,让后面的同学操作的时候能够避开这些坑,希望你能将整个系列的操作流程看了一遍斟酌后进行操作
##################################

在上一节的虚拟机内
当数据集重新修改完成后

训练时要有测试集和训练集,那么在这里就需要使用代码将数据进行划分,放在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次训练总数。
在这里插入图片描述
完成后保存并退出

猜你喜欢

转载自blog.csdn.net/Xiong2840/article/details/127936760