YOLOv8-seg训练自己的分割数据集

news2024/10/23 12:55:48

1.标注数据集

 使用labelme进行数据集标注,首先进行labelme安装:

pip install labelme

然后用labelme进行数据标注。 

2.数据集格式转换

json to txt以及 划分为train、val、test,适配yolov8-seg。

数据集格式转换脚本:

# labelme2yolo-seg
# -*- coding:utf-8 -*-
import os
import json
import random
import shutil
import argparse
from tqdm import tqdm


def convert_label_json(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']
        txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))

        with open(txt_path, 'w') as txt_file:
            for shape_dict in json_dict['shapes']:
                label = shape_dict['label']

                if label not in classes:
                    print(f"Warning: Label '{label}' not found in classes.")
                    continue

                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(str, points_nor_list))
                points_nor_str = ' '.join(points_nor_list)
                label_str = f"{label_index} {points_nor_str}\n"
                txt_file.write(label_str)


def data_split(full_list, ratio):
    n_total = len(full_list)
    offset = int(n_total * ratio)
    if n_total == 0 or offset < 1:
        return [], full_list
    random.shuffle(full_list)
    sublist_1 = full_list[:offset]
    sublist_2 = full_list[offset:]
    return sublist_1, sublist_2


def create_directories(base_dir, sub_dirs):
    for sub_dir in sub_dirs:
        path = os.path.join(base_dir, sub_dir)
        if not os.path.exists(path):
            os.mkdir(path)


def split_dataset(images_dir, labels_dir, train_p, val_p, proportion_):
    total_file = os.listdir(images_dir)
    num = len(total_file)
    list_ = list(range(num))

    list1, list2 = data_split(list_, proportion_)

    for i in range(num):
        file = total_file[i]
        name = file.split('.')[0]

        if i in list1:
            jpg_2 = os.path.join(train_p, 'images', file)
            txt_2 = os.path.join(train_p, 'labels', name + '.txt')
        elif i in list2:
            jpg_2 = os.path.join(val_p, 'images', file)
            txt_2 = os.path.join(val_p, 'labels', name + '.txt')
        else:
            continue

        jpg_1 = os.path.join(images_dir, file)
        txt_1 = os.path.join(labels_dir, name + '.txt')

        if os.path.exists(txt_1) and os.path.exists(jpg_1):
            shutil.copyfile(jpg_1, jpg_2)
            shutil.copyfile(txt_1, txt_2)
        else:
            print(f"File not found: {jpg_1} or {txt_1}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Convert JSON to TXT and split datasets')
    parser.add_argument('--json-dir', type=str, default=r'C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\images\json', help='JSON path dir')
    parser.add_argument('--save-dir', type=str, default=r'C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\images\txt', help='TXT save dir')
    parser.add_argument('--classes', type=str, default='whistlewave', help='Comma-separated classes')
    parser.add_argument('--images-dir', type=str, default=r'C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\images', help='Images path dir')
    parser.add_argument('--train-dir', type=str, default=r'C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\Dataset\train', help='Train directory')
    parser.add_argument('--val-dir', type=str, default=r'C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\Dataset\val', help='Validation directory')
    parser.add_argument('--proportion', type=float, default=0.9, help='Train proportion')

    args = parser.parse_args()

    # Convert JSON to TXT
    convert_label_json(args.json_dir, args.save_dir, args.classes)

    # Create directories for train and val
    create_directories(args.train_dir, ['images', 'labels'])
    create_directories(args.val_dir, ['images', 'labels'])

    # Split dataset
    split_dataset(args.images_dir, args.save_dir, args.train_dir, args.val_dir, args.proportion)

    print("数据集划分完成")

3.下载yolov8模型

在官网下载yolov8模型和yolov8n-seg.pt权重文件:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀

4.配置文件

在ultralytics/cfg/datasets目录下复制一份coc128-seg.yaml复制ultralytics目录,重新命名成whistlewave-seg.yaml;

然后将文件内容改成自己的数据路径:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO128-seg dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/segment/coco/
# Example usage: yolo train data=coco128.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco128-seg  ← downloads here (7 MB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: C:/Users/WYX/Desktop/code/matlab-code/LW/mmsegmentation/ultralytics-main/dataset # dataset root dir
train: C:/Users/WYX/Desktop/code/matlab-code/LW/mmsegmentation/ultralytics-main/dataset/train # train images (relative to 'path') 128 images
val: C:/Users/WYX/Desktop/code/matlab-code/LW/mmsegmentation/ultralytics-main/dataset/val # val images (relative to 'path') 128 images
test: C:/Users/WYX/Desktop/code/matlab-code/LW/mmsegmentation/ultralytics-main/dataset/test # test images (optional)

# Classes
names:
  0: whistlewave

# Download script/URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/coco128-seg.zip

5.训练

yolo task=segment mode=train model=C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\ultralytics-main\yolov8n-seg.pt data=C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\ultralytics-main\whistlewave-seg.yaml batch=2 imgsz=640 epochs=300 pretrained=True mosaic=0.0

6.验证

yolo task=segment mode=val model=C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\ultralytics-main\runs\segment\train\weights\best.pt data=C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\ultralytics-main\whistlewave-seg.yaml

7.预测

yolo task=segment mode=predict model=C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\ultralytics-main\runs\segment\train\weights\best.pt source=C:\Users\WYX\Desktop\code\matlab-code\LW\mmsegmentation\ultralytics-main\ultralytics\assets

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity中使用UnityEvent遇到Bug

UnityEvent绑定过程中&#xff0c;放在Start&#xff08;&#xff09;中绑定会报错&#xff08;通过脚本添加UnityEvent事件脚本&#xff0c;绑定&#xff09; 绑定事件放在OnEnable&#xff08;&#xff09;中不会报错&#xff0c;但是依然不可以立刻添加UnityEvent事件脚本紧…

一些小概念和实战有用的知识

------------------------- IDEA是热保存&#xff0c;能一直crtlz撤销的&#xff0c;除非已经代码入库了&#xff0c;入库也能看到git上该文件历史记录/本地历史记录(看以前自己改了什么) -------------------------- 引用bean时候最好写明一下名字&#xff0c;防止以后有多…

双十一期间有哪些入手不亏的数码好物?这五款优质产品不容错过!

在这个令人期待的双十一购物狂欢节期间&#xff0c;我们总希望能以最实惠的方式&#xff0c;入手那些能够提升生活品质的数码好物。但是还有一些人还在犹豫考虑&#xff0c;不知道入手什么产品比较好&#xff0c;我也是特地挑选了五款实用又富有创意的数码产品&#xff0c;希望…

通过AI检测越权漏洞的指令

通过AI检测越权漏洞的指令 这段指令描述了一个AI的功能和工作流程&#xff0c;主要是用于比较两个HTTP响应数据包&#xff0c;以检测潜在的越权行为。以下是对其内容的详细介绍&#xff1a; 效果 先看一个简单的示例效果&#xff1a; 指令详情 指令详情&#xff1a; {&q…

快速上手C语言【下】(非常详细!!!)

目录 1. 指针 1.1 指针是什么 1.2 指针类型 1.2.1 指针-整数 1.2.2 指针解引用 1.3 const修饰 1.4 字符指针 1.5 指针-指针 1.6 二级指针 2. 数组 2.1 定义和初始化 2.2 下标引用操作符[ ] 2.3 二维数组 2.4 终极测试 3. 函数 3.1 声明和定义 3.2 传值调用…

Java最全面试题->Java基础面试题->JavaEE面试题->Web应用服务器面试题

文章目录 Web应用服务器面试题Tomcat是什么?Tomcat缺省端口是多少&#xff0c;如何修改&#xff1f;Tomcat 有那几种Connector 运行模式&#xff1f;什么是Servlet&#xff1f;Servlet请求过程&#xff1f;Tomcat执行流程&#xff1f;Tomcat部署方式?什么是JBoss ?在JBoss 7…

数据结构与算法:贪心算法与应用场景

目录 11.1 贪心算法的原理 11.2 经典贪心问题 11.3 贪心算法在图中的应用 11.4 贪心算法的优化与扩展 总结 数据结构与算法&#xff1a;贪心算法与应用场景 贪心算法是一种通过选择当前最佳解来构造整体最优解的算法策略。贪心算法在很多实际问题中都取得了良好的效果&am…

双十一母婴必买清单 推荐超实用母婴用品

随着双十一购物狂欢节的临近&#xff0c;无数准父母和年轻家长开始摩拳擦掌&#xff0c;准备为家中的小宝贝抢购一系列高品质、实用的母婴用品。在这个年度最大的电商促销活动中&#xff0c;选择对的产品不仅能够节省开支&#xff0c;更能确保宝宝的健康成长与舒适生活。以下是…

告别微信封号!学会这5招,让你的账号坚不可摧

在这个信息爆炸的时代&#xff0c;无论是工作沟通、社交互动还是获取信息&#xff0c;微信都扮演着极其重要的角色。但是&#xff0c;随着微信平台规则的日益严格&#xff0c;账号被封的风险也随之增加。今天&#xff0c;我们就来聊聊如何有效防止 微信被封&#xff0c;让你的账…

Java基于SSM微信小程序物流仓库管理系统设计与实现(源码+lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

搞错了,再来!谷歌利用AI重新推出全新的Google Shopping

近年来&#xff0c;随着电子商务的迅猛发展&#xff0c;消费者对个性化和便捷购物体验的需求愈发高涨。谷歌&#xff0c;作为互联网巨头之一&#xff0c;一直在不断探索和创新&#xff0c;它一直在应对这样一个事实&#xff1a;越来越多的消费者首先访问零售商的网站&#xff0…

jmeter正则表达式教程

正则表达式用于提取相应数据中的代码、文本等数据&#xff0c;利用正则表达式&#xff0c;提取响应数据&#xff0c;移植到下一线程组的参数中&#xff0c;从而进行测试。 一、解释&#xff1a;解释很多&#xff0c;但是最关键 &#xff08;1&#xff09;注释不多说&#xff0c…

实验干货|电流型霍尔传感调理电路设计01

在做逆变器实验时&#xff0c;需要测量逆变器输出电压以及电流。作为初学者&#xff0c;因为缺乏经验也踩过不少坑&#xff0c;写一篇博客记录下来希望能帮到跟我一样的初学者。 踩坑回顾 用什么采样&#xff1f;片内ADC还是片外ADC&#xff1f; 早前&#xff0c;在用RTLAB做…

51单片机快速入门之 LCD1602 液晶显示屏2024/10/19

51单片机快速入门之 LCD1602 液晶显示屏 Proteus 电路图 : 74HC595 拓展电路可以不用,给 p0-p17 添加上拉电阻也可以!,我这里是方便读取和节省电阻线路 (因为之前不知道 在没有明确循环的情况下&#xff0c;Keil编译器可能会在main()中自动添加类似以下的汇编代码&#xff1a…

手机淘宝自动下单退货自动化RPA脚本机器人

使用手机集线器连接多个手机并发运行。 脚本分3个部分&#xff08;读取本地连接下单&#xff0c;退货获取退货地址信息&#xff0c;填写快递单号&#xff09; 脚本部分图结构看下面的图片 部分数据统计展示

ORACLE SELECT INTO 赋值为空,抛出 NO DATA FOUND 异常

例子&#xff1a; DECLARE ORDER_NUM VARCHAR2(20); BEGIN SELECT S.ORDER_NUM INTO ORDER_NUM FROM SALES_ORDER S WHERE S.ID122344; DBMS_OUTPUT.PUT_LINE(单号: || ORDER_NUM); END; 在查询结果为空的情况下&#xff0c;以上代码会报错&#xff1a;未找到任何数据 解决方…

1024程序员节探讨<程序员的人生观和价值观>

程序员的人生观和价值观 程序员的人生观和价值观往往受到其职业特性和工作环境的影响&#xff0c;但也会因个体差异而有所不同。 人生观 持续学习与成长&#xff1a; 程序员通常认识到技术的快速发展&#xff0c;因此他们倾向于保持一种持续学习和自我提升的态度。他们可能将…

全网最详细图文测评!Stability.AI 发布 SD3.5 Large 模型,能否逆风翻盘超越FLUX?

原文链接&#xff1a;全网最详细图文测评&#xff01;Stability.AI 发布 SD3.5 Large 模型&#xff0c;能否逆风翻盘超越FLUX&#xff1f; (chinaz.com) SD3.5 的前世今生 6 月的时候&#xff0c;Stability AI发布了 Stable Diffusion 3 Medium&#xff0c;但是在在 FLUX 发布…

FPGA学习(7)-线性序列机原理与应用,不同类型的LED控制开关

目录 1.实现1 2.实现2 2.1方法1 2.2方法2 3.实现3 3.1实验现象 4.实现4 4.1分析 4.2实现过程 4.2.1 counter的计数 4.2.2 en_counter2的判断 4.2.3 en_counter0的判断 4.2.4 对case语句加判断条件 4.3仿真结果 ​编辑 4.4实验现象 1.实现1 1.实现以下图示功能…

qt QBuffer详解

QBuffer 是 Qt 提供的一个类&#xff0c;用于在内存中操作二进制数据。它是 QIODevice 的一个子类&#xff0c;允许你将数据读入和写出到一个内存缓冲区&#xff0c;而不需要与文件系统交互。 常用方法 构造函数: QBuffer(QObject *parent nullptr): 创建一个空的 QBuffer 对象…