1.yolo实例分割数据集格式与标注 标注工具labelImg使用方法-CSDN博客(没有多边形的绘制方式)下载: github.com windows直接下载exe.
下载好后与之前的操作都一样,由于labelmg生成的是json文件需要重新写一个脚本生成txt文件,之后和之前一样
之前文章
注意的是实例分割模型训练要用
yolo task=segment mode=train model=yolov8s-seg.pt epochs=5 batch=1
data=co2_dataset.yaml
转化脚本
import json
import os
def json2txt():
json_dir = "C:/yolov8study/cs"
train_label_dir = "C:/yolov8study/cs/1"
valid_label_dir = "C:/yolov8study/cs/2"
确保标签目录存在
if not os.path.exists(train_label_dir):
os.makedirs(train_label_dir)
if not os.path.exists(valid_label_dir):
os.makedirs(valid_label_dir)
files = os.listdir(json_dir)
for json_file in files:
if not json_file.endswith(".json"):
print(f"跳过非 JSON 文件: {json_file}")
continue
json_path = os.path.join(json_dir, json_file)
print(f"正在处理 JSON 文件: {json_file}")
with open(json_path, 'r') as f:
data = json.load(f)
直接从 JSON 数据中获取图像宽高信息
img_width = data.get("imageWidth")
img_height = data.get("imageHeight")
img_name = data.get("imagePath")
if img_name and img_width and img_height:
生成对应的 TXT 文件路径
if img_name.endswith("bmp"):
img_name = img_name.replace("bmp", "jpg")
if img_name.endswith("png"):
img_name = img_name.replace("png", "jpg")
判断 json_dir 路径中是否包含 "valid" 或 "train"
if "valid" in json_dir.lower():
current_label_dir = valid_label_dir
elif "train" in json_dir.lower():
current_label_dir = train_label_dir
else:
print(f"无法确定标签目录,默认使用训练集目录。JSON 文件: {json_file}")
current_label_dir = train_label_dir
data_label_text_f = os.path.join(current_label_dir, img_name.replace(".jpg", ".txt"))
shapes = data.get("shapes", [])
if not shapes:
print(f"JSON 文件 {json_file} 中的 shapes 列表为空,生成的 TXT 文件将为空。")
with open(data_label_text_f, 'w') as file_write_obj:
类别索引固定为 0(只有 cs 标签),仅输出一次
clazz_index = 0
file_write_obj.write(f"{clazz_index}")
遍历所有目标对象
for shape in shapes:
points = shape.get("points", [])
遍历 points 数组中的每个点
for point in points:
x = float(point[0])
y = float(point[1])
转换为 YOLO 格式(仅保留中心点坐标)
cx = x / img_width
cy = y / img_height
写入 TXT 文件,不换行
file_write_obj.write(f" {cx:.6f} {cy:.6f}")
最后添加换行符
file_write_obj.write("\n")
print(f"已处理图像: {img_name},生成标签文件: {data_label_text_f}")
else:
print(f"JSON 文件 {json_file} 缺少必要的图像信息,跳过处理。")
if name == "main":
json2txt()