【YOLOv5、YOLOv7、YOLOv8训练】——VOC数据集划分和YOLO格式转换_pascal voc数据集转yolov8格式

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument(‘–xml_path’, default=‘VOCdevkit/VOC2007/Annotations’, type=str, help=‘input xml label path’)
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument(‘–txt_path’, default=‘VOCdevkit/VOC2007/ImageSets/Main’, type=str, help=‘output txt label path’)
opt = parser.parse_args()

trainval_percent = 0.8 # 训练+验证集一共所占的比例为0.8(注意看清楚),剩下的0.2就是测试集
train_percent = 0.8 # 训练集在训练集和验证集总集合中占的比例(注意看清楚是谁占谁的比例),可自己进行调整
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + ‘/trainval.txt’, ‘w’)
file_test = open(txtsavepath + ‘/test.txt’, ‘w’)
file_train = open(txtsavepath + ‘/train.txt’, ‘w’)
file_val = open(txtsavepath + ‘/val.txt’, ‘w’)

for i in list_index:
name = total_xml[i][:-4] + ‘\n’
if i in trainval:
file_trainval.write(name)
if i in train:
file_train.write(name)
else:
file_val.write(name)
else:
file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()


2022/09/11添加新版本代码如下:



-*- coding: utf-8 -*-

“”"
Author:smile
Date:2022/09/11 10:00
顺序:脚本A1
简介:分训练集、验证集和测试集,按照 8:1:1 的比例来分,训练集8,验证集1,测试集1

“”"
import os
import random
import argparse

parser = argparse.ArgumentParser()

xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下

parser.add_argument(‘–xml_path’, default=‘Annotations/’, type=str, help=‘input xml label path’)

数据集的划分,地址选择自己数据下的ImageSets/Main

parser.add_argument(‘–txt_path’, default=‘Main/’, type=str, help=‘output txt label path’)
opt = parser.parse_args()

train_percent = 0.8 # 训练集所占比例
val_percent = 0.1 # 验证集所占比例
test_persent = 0.1 # 测试集所占比例

xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)

if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)

num = len(total_xml)
list = list(range(num))

t_train = int(num * train_percent)
t_val = int(num * val_percent)

train = random.sample(list, t_train)
num1 = len(train)
for i in range(num1):
list.remove(train[i])

val_test = [i for i in list if not i in train]
val = random.sample(val_test, t_val)
num2 = len(val)
for i in range(num2):
list.remove(val[i])

file_train = open(txtsavepath + ‘/train.txt’, ‘w’)
file_val = open(txtsavepath + ‘/val.txt’, ‘w’)
file_test = open(txtsavepath + ‘/test.txt’, ‘w’)

for i in train:
name = total_xml[i][:-4] + ‘\n’
file_train.write(name)

for i in val:
name = total_xml[i][:-4] + ‘\n’
file_val.write(name)

for i in list:
name = total_xml[i][:-4] + ‘\n’
file_test.write(name)

file_train.close()
file_val.close()
file_test.close()


3、VOC转YOLO格式:第2步只是把数据集划分了比例,想训练,还要进行这一步。在VOCdevkit目录下创建`voc_label.py`,点击运行,会在目录下生成新的`labels`文件夹,把数据集路径导入txt文件,将每个xml标注信息提取转换为了txt格式,每个图像对应一个txt文件。(代码都是测试过很多遍,可以保证没有问题!注意一点的是,VOC存放图片的文件夹是JPEGImages,但是YOLO中读取图片是到 images 中读取的,所以,这里要把JPEGImages改为images(或者你在YOLO代码里面改,下面有示范,这样比较麻烦,不太友好)再运行代码。`我演示的时候,并没有修改,我是在YOLO里面改的,不建议,看到这的小伙伴记得修改!!!`)



-*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
import os

sets = [‘train’, ‘val’, ‘test’] # 如果你的Main文件夹没有test.txt,就删掉’test’

classes = [“a”, “b”] # 改成自己的类别,VOC数据集有以下20类别

classes = [“aeroplane”, ‘bicycle’, ‘bird’, ‘boat’, ‘bottle’, ‘bus’, ‘car’, ‘cat’, ‘chair’, ‘cow’, ‘diningtable’, ‘dog’,
‘horse’, ‘motorbike’, ‘person’, ‘pottedplant’, ‘sheep’, ‘sofa’, ‘train’, ‘tvmonitor’] # class names
abs_path = os.getcwd()

def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
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_annotation(image_id):
in_file = open(abs_path + ‘/VOCdevkit/VOC2007/Annotations/%s.xml’ % (image_id), encoding=‘UTF-8’)
out_file = open(abs_path + ‘/VOCdevkit/VOC2007/labels/%s.txt’ % (image_id), ‘w’)
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find(‘size’)
w = int(size.find(‘width’).text)
h = int(size.find(‘height’).text)
for obj in root.iter(‘object’):
difficult = obj.find(‘difficult’).text
# difficult = obj.find(‘Difficult’).text
cls = obj.find(‘name’).text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find(‘bndbox’)
b = (float(xmlbox.find(‘xmin’).text), float(xmlbox.find(‘xmax’).text), float(xmlbox.find(‘ymin’).text),
float(xmlbox.find(‘ymax’).text))
b1, b2, b3, b4 = b
# 标注越界修正
if b2 > w:
b2 = w
if b4 > h:
b4 = h
b = (b1, b2, b3, b4)
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + ‘\n’)

for image_set in sets:
if not os.path.exists(abs_path + ‘/VOCdevkit/VOC2007/labels/’):
os.makedirs(abs_path + ‘/VOCdevkit/VOC2007/labels/’)

image_ids = open(abs_path + '/VOCdevkit/VOC2007/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
list_file = open(abs_path + '/VOCdevkit/VOC2007/%s.txt' % (image_set), 'w')
for image_id in image_ids:
    list_file.write(abs_path + '/VOCdevkit/VOC2007/JPEGImages/%s.jpg\n' % (image_id))  # 要么自己补全路径,只写一半可能会报错
    convert_annotation(image_id)
list_file.close()

运行之后,会在VOC2007目录下生成`labels`文件夹和3个新的.txt文件:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6858ea70b38347c0a04d94ba3d9ff137.png)


其中,新生成的3个的`train.txt、val.txt、test.txt`,这正是后面训练需要用的文件。每个txt文件里面存放的图片的文件名全路径:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e9c253a6ec7e459db4694f71380fc443.png)


## 训练前准备


以上操作成功将VOC数据集格式转换成yolo格式后,在正式开始训练之前,还需要修改一些地方。


1、修改voc.yaml文件:yolov5下 `train.py` 默认使用的是`coco.yaml`训练的,自己新建一个适用VOC数据集训练的`voc.yaml`。  
 首先,修改`nc`和`names`的内容,nc:代表自己数据集有多少类,names:代表自己数据集的类的名字;  
 然后,修改在新建`voc.yaml`下修改 `train` 和 `val` 后面的路径(我这里没用test测试集),改成新生成的 train.txt 和 val.txt **路径地址**(注意:**不是Main文件夹下的,是上面第3步新生成的!别搞错了!!!** 还有一点,下图红色框部分,改路径地址的时候,两个冒号后面跟路径地址之间要有一个空格!)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6d7150413c284aa0b9bd57d8243f3c91.png#pic_center)


2、修改yolov5s.yaml文件:修改models目录下的`yolov5s.yaml`文件内容,就一处,把`nc = 80`修改为`nc = 20`即可。这里我用的是yolov5s.yaml。


3、修改datasets.py文件:做完以上步骤,若直接开始训练,会报错:  
 AssertionError: train: No labels in 2007\_train.cache. Can not train without labels  
 解决方法:  
 找到`utils/dataset.py`文件,ctrl+f 搜索框搜索Define label,将下图红色框中内容修改为’JPEGImages’。原本yolov5代码这里是’images’,但VOC是把图片保存在JPEGImages下的,所以需要修改方能正确读取图片。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a0f5976f86174b02a128b2ea35bf43bb.png)


## 开始训练


对`train.py`进行修改,选择预训练权重,epochs根据自己情况设置;batch-size需要显存,显存小就设置低点。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/701c8fb6c58c4267a0a2a5399484fa9c.png)


## 参考


2022.5.25之前参考链接:  
 [YOLOv5训练自数据集(VOC格式)]( )  
 [VOC格式数据集转yolo(darknet)格式]( )  
 [YOLOv5训练自己的数据集(超详细完整版)]( )  
 [YOLOv5(ultralytics) 训练自己的数据集,VOC2007为例]( )


2022.5.25之后参考链接  
 主要是不同的数据格式处理脚本,用得到,本人亲测有效


[yolov5的数据集准备 | 处理Pascal voc格式的数据集]( )


[YOLOV5—数据集格式转化及训练集和验证集划分]( ) 








### 一、网安学习成长路线图


网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/aa7be04dc8684d7ea43acc0151aebbf1.png)


### 二、网安视频合集


观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f0aeee2eec7a48f4ad7d083932cb095d.png)


### 三、精品网安学习书籍


当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/078ea1d4cda342f496f9276a4cda5fcf.png)


### 四、网络安全源码合集+工具包


光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e54c0bac8f3049928b488dc1e5080fc5.png)


### 五、网络安全面试题


最后就是大家最关心的网络安全面试题板块  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/15c1192cad414044b4dd41f3df44433d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)  

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLOv5官方使用的数据集是COCO数据集格式,但是个人也可以选择使用PASCAL VOC数据集进行训练和测试。对于数据集格式转换,可以参考以下步骤: 1. 首先,将VOC格式数据集换为YOLOv5所需的darknet格式。可以参考引用\[1\]中提供的链接,其中详细介绍了如何将VOC格式数据集换为YOLOv5格式。 2. 接下来,根据个人需求,对数据集进行划分。一般的划分比例是训练集:验证集:测试集=6:2:2。这个比例可以根据个人数据集的大小进行灵活调整。可以参考引用\[3\]中提到的比例设置。 3. 在划分数据集时,需要注意确保训练集、验证集和测试集的样本是相互独立的,以保证实验的科学性和准确性。 总结起来,要将数据集格式转换YOLOv5所需的格式,首先将VOC格式数据集换为darknet格式,然后根据个人需求划分训练集、验证集和测试集。这样可以为YOLOv5算法的训练和测试提供合适的数据集。 #### 引用[.reference_title] - *1* *2* [【YOLOv5YOLOv7YOLOv8训练】——VOC数据集划分YOLO格式转换](https://blog.csdn.net/retainenergy/article/details/124613553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [学习经验分享之五:YOLOv5数据集划分以及YOLO格式转换](https://blog.csdn.net/m0_70388905/article/details/125733445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值