YOLOv8制作自己的实例分割数据集保姆级教程(包含json转txt)

本文章已经生成可运行项目,

1.数据准备

首先对原始数据集进行整理,将标注好的图像和标签分别放在两个文件夹中,同时额外新建两个文件夹,用于存放转换完的标签与划分后的数据集。

1.1将json格式文件转换为txt格式

新建json2txt.py文件,将代码中的文件路径修改为自己的路径。

❗❗❗代码中第43行的classes中存放的是自己数据集的分类标签,记得修改成自己的。

import json
import os
from tqdm import tqdm


def convert_label(json_dir, save_dir, classes):
    json_paths = os.listdir(json_dir)
    classes = classes.split(',')

    for json_path in tqdm(json_paths):

        path = os.path.join(json_dir, json_path)
        with open(path, 'r') as load_f:
            json_dict = json.load(load_f)
        h, w = json_dict['imageHeight'], json_dict['imageWidth']

        # save txt path
        txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
        txt_file = open(txt_path, 'w')

        for shape_dict in json_dict['shapes']:
            label = shape_dict['label']
            label_index = classes.index(label)
            points = shape_dict['points']

            points_nor_list = []

            for point in points:
                points_nor_list.append(point[0] / w)
                points_nor_list.append(point[1] / h)

            points_nor_list = list(map(lambda x: str(x), points_nor_list))
            points_nor_str = ' '.join(points_nor_list)

            label_str = str(label_index) + ' ' + points_nor_str + '\n'
            txt_file.writelines(label_str)


if __name__ == "__main__":

    json_dir = 'E:/segmentation_dataset/json'
    save_dir = 'E:/segmentation_dataset/txt'
    classes = 'material,inner_material,hole'

    convert_label(json_dir, save_dir, classes)

1.2划分数据集

新建splitDataset.py,将代码中的文件路径修改为自己的路径。

数据集的划分比例可以按自己的需求修改。

import shutil
import random
import os


# 检查文件夹是否存在
def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)


def split(image_dir, txt_dir, save_dir):
    # 创建文件夹
    mkdir(save_dir)
    images_dir = os.path.join(save_dir, 'images')
    labels_dir = os.path.join(save_dir, 'labels')

    img_train_path = os.path.join(images_dir, 'train')
    img_test_path = os.path.join(images_dir, 'test')
    img_val_path = os.path.join(images_dir, 'val')

    label_train_path = os.path.join(labels_dir, 'train')
    label_test_path = os.path.join(labels_dir, 'test')
    label_val_path = os.path.join(labels_dir, 'val')

    mkdir(images_dir)
    mkdir(labels_dir)
    mkdir(img_train_path)
    mkdir(img_test_path)
    mkdir(img_val_path)
    mkdir(label_train_path)
    mkdir(label_test_path)
    mkdir(label_val_path)

    # 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改
    train_percent = 0.8
    val_percent = 0.1
    test_percent = 0.1

    total_txt = os.listdir(txt_dir)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)

    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val

    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)

    print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]

        srcImage = os.path.join(image_dir, name + '.jpg')
        srcLabel = os.path.join(txt_dir, name + '.txt')

        if i in train:
            dst_train_Image = os.path.join(img_train_path, name + '.jpg')
            dst_train_Label = os.path.join(label_train_path, name + '.txt')
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = os.path.join(img_val_path, name + '.jpg')
            dst_val_Label = os.path.join(label_val_path, name + '.txt')
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = os.path.join(img_test_path, name + '.jpg')
            dst_test_Label = os.path.join(label_test_path, name + '.txt')
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)


if __name__ == '__main__':

    image_dir = 'E:/segmentation_dataset/images'
    txt_dir = 'E:/segmentation_dataset/txt'
    save_dir = 'E:/segmentation_dataset/dataset'

    split(image_dir, txt_dir, save_dir)

运行完后得到如下文件:

dataset中分别存放有划分好的图片数据和标注数据。

到此,数据集制作完毕! 

2.训练设置

2.1新建segmentation.yaml文件

 按照如下格式在yolov8工程的datasets文件夹下进行新建,路径修改为自己的路径,对应的分类标签也修改为自己的。

train: E:\segmentation_dataset\dataset\images\train  # train images (relative to 'path') 128 images
val: E:\segmentation_dataset\dataset\images\val  # val images (relative to 'path') 128 images
test: E:\segmentation_dataset\dataset\images\test  # test images (optional)

# Classes
names:
  0: material
  1: inner_material
  2: hole

2.2训练参数设置 

配置参数如下图所示:

 以上常用参数解释如下:

📌task:选择任务类型,可选['detect', 'segment', 'classify', 'pose']。

📌mode: 选择是训练、验证、预测和导出模型等,可选['train', 'val', 'predict', 'export', 'track', 'benchmark']。

📌model: 选择yolov8不同的模型配置文件,可选yolov8s-seg.pt、yolov8m-seg.pt、yolov8x-seg.pt等(提供了n、s、m、l、x版本,随着架构的增大,训练时间也是逐渐增大,需要根据自身设备硬件配置合理选择)。

❗❗❗注意model最好去github上提前下载好,放在如图所示的指定位置,如果没提前下载运行时会自动下载,但是下载速度可能非常非常慢。

yolov8官方权重下载地址:

https://github.com/ultralytics/ultralytics?tab=readme-ov-fileicon-default.png?t=O83Ahttps://github.com/ultralytics/ultralytics?tab=readme-ov-file

📌data: 选择生成的数据集配置文件。

📌epochs:训练过程中整个数据集的迭代次数。

📌batch:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,提示爆显存就需要调小一点。

📌imgsz:输入图片的尺寸大小。

📌workers:用于数据加载的工作线程数。

📌project:训练工程名称。

📌name:保存训练结果的文件夹名称。

📌resume:从最后一个检查点恢复训练,即模型训练的断点接续,可选False或True。

完成配置后,开始进行训练即可!

另外,如果有想了解yolov8目标检测数据集制作以及YOLOv8目标检测 opencv模型部署的小伙伴可以移步我的其他文章

YOLOv8制作自己的目标检测数据集保姆级教程(包含json转xml转txt)icon-default.png?t=O83Ahttps://blog.youkuaiyun.com/m0_57010556/article/details/135460191?spm=1001.2014.3001.5502

YOLOv8目标检测 opencv模型部署保姆级教程(包含opencv环境配置)icon-default.png?t=O83Ahttps://blog.youkuaiyun.com/m0_57010556/article/details/139109317?spm=1001.2014.3001.5502

本文章已经生成可运行项目
<think>首先,用户的问题是:"我想将JSON数据换为文本格式请问如何将JSON格式的数据换为纯文本文件或字符串"。用户引用了几个站内引用,这些引用是关于JSON换的,包括JSON到CSV、JSON字符串换、JSON解析等。根据系统指令,我需要使用中文回答,结构清晰,帮助用户逐步解决问题。关键点是用户想将JSON数据换为纯文本(textformat)。纯文本可以是简单的文本表示,比如键值对,或者类似于人类可读的字符串,而不一定是结构化的CSV或其他格式。参考站内引用:-引用[1]:介绍了将JSON换为CSV的在线工具。[^1]-引用[2]:提到在C语言中将JSON数据换为字符串。[^2]-引用[3]:展示了Java中将JSON字符串换为JSON对象。[^3]-引用[4]:展示了Java中JSON解析和生成,包括JSON字符串JSON对象和生成JSON字符串。[^4]-引用[5]:介绍了在易语言中将纯文本拼接为JSON字符串。[^5]用户的问题是反过来的:将JSON换为纯文本文件或字符串。所以,我需要在回答中基于这些引用和建议提供解决方案。用户说:"上述引用仅供参考,并不是用户真正的需求",所以我应该专注于用户的实际需求:"如何将JSON格式的数据换为纯文本文件或字符串"。系统指令要求:-所有行内数学表达式必须使用$...$格式(但这个问题不涉及数学,所以可能不需要)。-独立公式使用$$...$$格式(同样,不相关)。-LaTeX语法正确(中文回答,不太可能用LaTeX)。-使用中文回答。-生成相关问题(在末尾)。-回答中引用的段落末尾自然地添加引用标识。回答结构应该清晰:1.**理解需求**:确认用户想将JSON数据换为纯文本格式。2.**解释方法**:提供逐步指南或工具。-JSON本身是一种文本格式,所以"纯文本"可能意味着人类可读的字符串、自定义格式,或者是序列化为字符串。-可能的输出:文本文件、简单的字符串表示(如键值对)、序列化后的JSON字符串等。3.**提供实现**:-编程方法:如使用Python、Java等。-在线工具:如引用[1]提到的工具。-命令工具:如jq命令。4.**参考引用**:自然地整合引用。-引用[2]和[4]涉及解析和换,可以关联。-引用[1]是JSON到CSV,但CSV不是纯文本文件?等等,纯文本文件可以是CSV、TXT等。5.**纯文本文件或字符串的定义**:澄清什么是纯文本输出。可能是:-序列化JSON字符串:直接输出JSON字符串。-格式化文本:如打印键值对。-或用户想要的特定格式,如CSV,但用户说"纯文本文件",所以可能包括各种格式。基于引用:-引用[4]:Java中将JSON字符串生成实体对象,反序列化,所以用户可能想序列化JSON对象为字符串。-引用[3]:Java中将字符串换为JSON对象,逆操作是将JSON对象字符串。-引用[2]:C语言中将JSON数据换字符串。-引用[5]:文本拼接为JSON,逆操作可能涉及解析JSON。所以,解决方案:-**序列化**:如果用户有JSON数据对象,序列化为字符串。-**写入文件**:如果需要文本文件。-**格式化为简单文本**:如使用jq或自定义代码输出易读文本。逐步解决:1.**确认输出格式**:纯文本可以是JSON字符串本身,或自定义文本。我会假设用户想要一个人类可读的文本表示。2.**方法**:-**使用编程语言**:例如Python,用json.dumps()JSON数据字符串。-**在线工具**:如引用[1]的工具可以将JSONCSV,但CSV是结构化文本,也可以作为纯文本。如果用户接受CSV,可以推荐。-**Commandline**:使用jq命令处理JSON文件。3.**步骤说明**。生成相关问题:在末尾,如示例中提供。确保回答可靠:基于JSON换的常识。大纲回答:-引言:理解需求。-方法1:使用序列化(例如,Pythonjson.dumps)。-方法2:使用在线工具(如引用[1])。-方法3:使用命令行工具(jq)。-总结。-相关问题。添加引用自然:如"参考引用[4],在Java中可以使用JSON库来序列化JSON对象为字符串。[^4]"。最终输出用中文。</think> ### 如何将JSON格式的数据换为纯文本文件或字符串 要将JSON格式的数据换为纯文本文件或字符串,关键在于理解JSON数据本身是结构化的文本格式,而“纯文本”可以指序列化后的JSON字符串(即JSON格式的文本表示)、自定义格式化文本(如键值对),或写入到纯文本文件(如.txt或.csv格式)。根据您的需求,我将提供逐步的解决方案,包括编程方法(使用Python、Java等)、在线工具参考、以及命令行工具(如jq),确保方法可靠且易于操作。我会参考您提供的站内引用,并结合JSON换的常见实践。注意,JSON换的核心是“序列化”(将JSON对象为字符串)和“写入文件”两个步骤。 --- ### 步骤1: 理解换需求 JSON数据通常以对象形式存储(如字典或数组),换为纯文本涉及: - **序列化**:将JSON对象换为字符串形式(例如,`{"name":"张三"}` -> `"{\"name\":\"张三\"}"`)。 - **输出为文件或字符串**:将序列化后的字符串保存到.txt文件或直接作为文本输出。 - 纯文本输出可以是: - JSON字符串本身:一个连续的、机器可读的文本。 - 自定义格式化文本:如用换行符分隔的键值对(例如,`name: 张三\nage: 30`)。 - 或换为更通用的纯文本格式,如CSV文件(逗号分隔值),这在数据处理中很常见[^1]。 如果您的JSON数据是复杂的嵌套结构(如多层对象或数组),我会建议使用序列化或工具来处理,以避免数据丢失。 --- ### 步骤2: 推荐换方法 以下是几种实用的方法,按难易度和场景分类。我会优先推荐简单的编程方式和工具,以便快速实现。 #### 方法1: 使用编程语言序列化JSON为文本 这是最灵活的方法,适合开发者或有编程基础的用户。以下以Python和Java为例(参考引用[3]和[4],这些展示了JSON解析和序列化的逆向操作)。例如,引用[4]中描述了如何在Java中将JSON字符串为对象,反操作就是将JSON对象序列化为字符串[^4]。 **Python示例(推荐)** Python简单易用,内置`json`库支持序列化。 - **序列化为字符串**: 使用`json.dumps()`将JSON对象为一个字符串。 ```python import json # 假设JSON数据是一个字典对象 json_data = {"name": "张三", "age": 30, "city": "北京"} # 将JSON对象序列化为字符串 json_string = json.dumps(json_data, ensure_ascii=False) # ensure_ascii=False确保中文正常显示 print(json_string) # 输出: {"name": "张三", "age": 30, "city": "北京"} ``` 输出是一个纯文本字符串,您可以直接在代码中使用。 - **写入纯文本文件**: 将序列化字符串保存到.txt文件。 ```python # 继续上面的代码 with open("output.txt", "w", encoding="utf-8") as file: file.write(json_string) # 文件output.txt包含纯文本:{"name": "张三", "age": 30, "city": "北京"} ``` 如果希望更易读,可以添加缩进: ```python json_string = json.dumps(json_data, ensure_ascii=False, indent=2) # indent=2增加缩进,方便阅读 # 输出: { # "name": "张三", # "age": 30, # "city": "北京" # } ``` **Java示例** 如引用[3]所示,在Java中使用如`org.json`库可以轻松实现序列化[^3]。 - 首先,添加JSON库依赖(如通过Maven)。 - 代码示例: ```java import org.json.JSONObject; // 假设JSON数据是一个JSONObject JSONObject jsonData = new JSONObject("{\"name\":\"张三\",\"age\":30}"); // 序列化为字符串 String jsonString = jsonData.toString(); System.out.println(jsonString); // 输出: {"name":"张三","age":30} // 写入文件 import java.nio.file.Files; import java.nio.file.Paths; Files.write(Paths.get("output.txt"), jsonString.getBytes()); ``` 输出文件`output.txt`将包含纯文本字符串。如果您需要自定义格式(如键值对文本),可以使用库如`Gson`或`Jackson`。 **注意事项**: - 这些方法确保数据完整性:序列化过程不会改变JSON内容。 - 如果JSON数据复杂(如数组或嵌套对象),代码会处理所有细节[^4]。 - 类似方法也适用于其他语言,如JavaScript、C#或Go(引用[2]提到C语言的字符串换,但Python/Java更简单)[^2]。 #### 方法2: 使用在线工具快速换 如果不想编程,可用在线工具将JSON直接输出为纯文本文件。参考引用[1],介绍了一个JSONCSV的工具,但您也可以用它生成纯文本字符串或文本文件[^1]。 - **推荐工具**: - [JSON to Text Online](https://jsonformatter.org/json-to-text):直接输入JSON数据,点击“换”,生成纯文本格式(如JSON字符串或简单键值对)。 - 步骤: 1. 访问工具网站。 2. 粘贴JSON数据(例如,`{"name":"张三","age":30}`)。 3. 选择输出选项(如“Plain Text”或“JSON String”)。 4. 下载结果为.txt文件或复制文本字符串。 - 优点:免费、无需安装。 - CSV换参考:如引用[1]的工具可将JSON为CSV(一种纯文本格式)。例如,输入JSON数组 `[{"name":"张三"},{"name":"李四"}]`,输出为CSV文件,本质是纯文本[^1]。 #### 方法3: 使用命令行工具(如jq) 适合Linux/macOS用户或批量处理场景。jq是一个强大的JSON处理器,可输出纯文本。 - **安装jq**:在终端运行 `sudo apt-get install jq` (Linux) 或 `brew install jq` (macOS)。 - **换示例**: - **序列化为JSON字符串**: ```bash # 从文件读取JSON,输出纯文本字符串 jq -c . input.json > output.txt # -c选项使输出紧凑(一行字符串) # output.txt内容:{"name":"张三","age":30} ``` - **自定义格式化文本**: ```bash # 输出键值对文本 jq -r 'to_entries[] | "\(.key): \(.value)"' input.json > output.txt # 如果输入是{"name":"张三","age":30}, output.txt内容: # name: 张三 # age: 30 ``` - 优点:高效、适合大型JSON文件[^1]。 --- ### 步骤3: 总结和最佳实践 - **推荐方案**:如果您是开发者,用Python序列化最简单;否则,使用在线工具或jq。 - **输出结果**:换后,纯文本文件(例如.txt)将包含字符串化的JSON数据,可以直接在文本编辑器中查看或用于数据处理。 - **确保数据可靠**: - 输入JSON需有效:使用工具如[JSONLint](https://jsonlint.com/)校验。 - 编码问题:确保文本文件使用UTF-8编码以支持中文(如Python中的`encoding="utf-8"`)[^3]。 - 如果您的JSON数据是字符串形式(如引用[3]中代码),无需额外换;直接输出即可[^3]。 如果您提供JSON数据的样本,我可以帮您定制代码示例。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小小怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值