本文是看了博客YOLOv8制作自己的目标检测数据集保姆级教程(包含json转xml转txt)_yolov8数据集制作-CSDN博客,没有抄袭的意思,这里主要作为笔记用。
1.数据集准备
在E盘新建一个Mydataset文件夹(可自定义),如图所示放置四个.py文件,两个数据集文件夹以及一个数据加载配置文件,名称如图所示,.py中的代码下文将逐一给出,.yaml中的内容下文也会给出。

1.1原始数据
原始数据集如图所示,存放在original_dataset文件夹(可自定义)下,包含了原始图片和利用labelme标注得到的json文件(注意:如果用label.exe文件标定数据,数据集可以直接标定为json文件或者xml文件,下面不需要再做json到xml文件的转换处理)。

1.2待制作数据集(yolov8加载的数据集)
Mydataset文件夹下新建data文件夹(可自定义),再在data目录下新建Annotations, images, ImageSets, labels 四个文件夹。
📌Annotations:存放转换之后图片的xml文件
📌images:存放数据集的图片文件
📌ImageSets :存放数据集按比例分割之后自动生成的train.txt,val.txt,test.txt和trainval.txt四个文件
📌labels:存放xml文件转换后的txt标准格式标签

下文将详细介绍每一个文件夹中存放的文件及其制作流程。
2.标签格式转化(json转xml)
注意:如果用label.exe文件标定数据,数据集可以直接标定为json文件或者xml文件,下面不需要再做json到xml文件的转换处理。
由于使用labelme进行标注得到的label是json格式的文件,故需将原始数据集json格式的标签转换为xml格式。
在Mydataset目录下新建一个文件json2xml.py,运行。
📌注意代码第12行中地址labelme_path为原始json、bmp标注数据路径,需要更换成自己的数据集名称。
❗❗❗代码中默认的是读取bmp格式的图像,如果你的原始数据集中是jpg或png格式的图像,需要把json2xml.py代码中所有的“bmp”修改为你自己图像对应的格式,如“jpg”,“png”,该部分代码中有两处需要修改。
📌注意代码第13行中地址saved_path为转换后xml文件的保存路径。
代码如下:
import os
import xml.dom
import numpy as np
import codecs
import json
import glob
import cv2
import shutil
# 1.标签路径
labelme_path = r"E:\Mydataset\original_dataset" # 原始json、bmp标注数据路径,需要更换成自己的数据集名称
saved_path = r"E:\Mydataset\data\Annotations" # 保存路径
# 2.获取待处理文件
files = glob.glob("%s/*.json" % (labelme_path))
# 3.读取标注信息并写入 xml
for json_filename in files:
json_file = json.load(open(json_filename, "r", encoding="utf-8"))
i = 0
# 图像名字,若图像格式不是bmp,需要修改此处
img_name = json_filename.replace(".json", ".bmp")
height, width, channels = cv2.imread(img_name).shape
# xml名字
xmlName = os.path.join(saved_path, json_filename.split("\\")[-1].replace(".json", ".xml"))
with codecs.open(xmlName, "w", "utf-8") as xml:
print(2)
xml.write('<annotation>\n')
xml.write('\t<folder>' + 'bmp' + '</folder>\n')
xml.write('\t<filename>' + img_name + '</filename>\n')
# -------------------------------------------------
xml.write('\t<source>\n')
xml.write('\t\t<database>hulan</database>\n')
# --------------------------------------------------
xml.write('\t</source>\n')
# -----------------------------------------------------------
xml.write('\t<size>\n')
xml.write('\t\t<width>' + str(width) + '</width>\n')
xml.write('\t\t<height>' + str(height) + '</height>\n')
xml.write('\t\t<depth>' + str(channels) + '</depth>\n')
# ------------------------------------------------
xml.write('\t</size>\n')
xml.write('\t\t<segmented>0</segmented>\n')
# 节点判断
for multi in json_file["shapes"]:
points = np.array(multi["points"])
xmin = min(points[:, 0])
xmax = max(points[:, 0])
ymin = min(points[:, 1])
ymax = max(points[:, 1])
label = multi["label"]
if xmax &


3770

被折叠的 条评论
为什么被折叠?



