把labelme得到的json文件转换成yolov8需要的格式,划分数据集

news2024/12/30 2:22:23
  1. 使用labelme打标,得到json文件
  2. 把所有json文件放到一个单独的文件夹,里面只有json文件
  3. 使用脚本,把json里面的label,标注框的中心坐标、宽、高提取出来,注意这里的4个值都按照图像大小压缩了。
    前面0和1是index,后面分别是中心坐标xy,标注框的宽和高

脚本如下:

import json
import os

def read_json(json_file):
    with open(json_file,'r') as f:
        load_dict = json.load(f)
    f.close()
    return load_dict

def json2txt(json_path,txt_path):

    for json_file in os.listdir(json_path):
        txt_name = txt_path+json_file[0:-5]+'.txt'
        txt_file = open(txt_name, 'w')
        json_file_path = os.path.join(json_path,json_file)
        json_data = read_json(json_file_path)
        imageWidth = json_data['imageWidth']
        imageHeight = json_data['imageHeight']
        
        for i in range(len(json_data['shapes'])):
            label = json_data['shapes'][i]['label']

            if label=='Lesions':
                index=0
            else:
                index=1    

            x1 = json_data['shapes'][i]['points'][0][0]
            x2 = json_data['shapes'][i]['points'][1][0]
            y1 = json_data['shapes'][i]['points'][0][1]
            y2 = json_data['shapes'][i]['points'][1][1]
            #将标注框按照图像大小压缩
            x_center = (x1+x2)/2/imageWidth
            y_center = (y1+y2)/2/imageHeight
            bbox_w = (x2-x1)/imageWidth
            bbox_h = (y2-y1)/imageHeight
            bbox = (x_center,y_center,bbox_w,bbox_h)
            txt_file.write( str(index) + " " + " ".join([str(a) for a in bbox]) + '\n')
            
            print(label)
if __name__ == "__main__":
    json_path = 'H:\images_json'
    txt_path = 'data/'
    json2txt(json_path,txt_path)
   

json_path是你放置json文件的文件夹路径
txt_path是你放置转化成txt的存储位置
这里的label改成你自己打标的类别,我这里这么写是因为我一张图里有两个类别

划分数据集代码如下,只有image和label要改,改成你自己放图片和txt的路径就行

# -*- coding: utf-8 -*-
"""
将数据集划分为训练集,验证集,测试集
"""
import os
import random
import shutil

# 创建保存数据的文件夹
def makedir(new_dir):
    if not os.path.exists(new_dir):
        os.makedirs(new_dir)

def split_data(img_dir,label_dir):
    
    random.seed(1) # 随机种子
    # 1.确定原图片数据集路径
    datasetimg_dir = img_dir
    #确定原label数据集路径
    datasetlabel_dir = label_dir

    # 2.确定数据集划分后保存的路径
    split_dir = os.path.join(".", "dataset")
    train_dir = os.path.join(split_dir, "train")
    valid_dir = os.path.join(split_dir, "valid")
    test_dir = os.path.join(split_dir, "test")
    dir_list = [train_dir,valid_dir,test_dir]
    image_label = ['images','labels']

    for i in range(len(dir_list)):
        for j in range(len(image_label)):
            makedir(os.path.join(dir_list[i],image_label[j]))
            
    # 3.确定将数据集划分为训练集,验证集,测试集的比例
    train_pct = 0.8
    valid_pct = 0.1
    test_pct = 0.1
    # 4.划分
    imgs = os.listdir(datasetimg_dir) # 展示目标文件夹下所有的文件名
    imgs = list(filter(lambda x: x.endswith('.tif'), imgs)) # 取到所有以.png结尾的文件,如果改了图片格式,这里需要修改
    random.shuffle(imgs)  # 乱序路径
    img_count = len(imgs)  # 计算图片数量
    train_point = int(img_count * train_pct)  # 0:train_pct
    valid_point = int(img_count * (train_pct + valid_pct))  # train_pct:valid_pct
    for i in range(img_count):
        if i < train_point:  # 保存0-train_point的图片到训练集
            out_dir = os.path.join(train_dir, 'images')
            label_out_dir = os.path.join(train_dir, 'labels')

        elif i < valid_point:  # 保存train_point-valid_point的图片到验证集
            out_dir = os.path.join(valid_dir, 'images')
            label_out_dir = os.path.join(valid_dir, 'labels')
        else:  #  保存test_point-结束的图片到测试集
            out_dir = os.path.join(test_dir, 'images')
            label_out_dir = os.path.join(test_dir, 'labels')
        
        target_path = os.path.join(out_dir, imgs[i]) # 指定目标保存路径
        src_path = os.path.join(datasetimg_dir, imgs[i])  #指定目标原图像路径
        label_target_path = os.path.join(label_out_dir, imgs[i][0:-4]+'.txt')
        label_src_path = os.path.join(datasetlabel_dir,imgs[i][0:-4]+'.txt')
        shutil.copy(src_path, target_path)  # 复制图片
        shutil.copy(label_src_path, label_target_path) #复制txt

    print('train:{}, valid:{}, test:{}'.format(train_point, valid_point-train_point,
                                                            img_count-valid_point))

if __name__ == "__main__":
    img_dir = './images'
    label_dir = './data'
    split_data(img_dir,label_dir)

img_dir是原始图片路径,label_dir是原始txt路径。只需要改这俩就能直接划分数据集了,嘎嘎好用。
划分后效果如图所示:
划分数据集

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

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

相关文章

【网页设计】基于HTML的湖南渔鼓文化宣传网页的设计

1.引言 随着文化交流的不断深入&#xff0c;湖南渔鼓文化作为湖南省的非物质文化遗产&#xff0c;逐渐引起了人们的关注和研究。为了更好地推广和宣传湖南渔鼓文化&#xff0c;我们设计了一款基于HTML的湖南渔鼓文化宣传网页。 该网页旨在向广大用户介绍湖南渔鼓文化的深厚底…

第四章:SSD网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:YOLO v1网络详解 第六章:YOLO v2网络详解 第七章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正…

FME之发布全局变量和接收全局变量

1.发布变量用VariableSetter转换器&#xff0c;其中DH是全局变量名称&#xff0c;它的值是从上一步产生的数据中某个字段提取。发布之前我们一般都会用Sampler抽样保留一条记录即可。 2.接收全局变量用VariableRetriever转换器&#xff0c;其中变量名称用之前发布的全局变量名称…

Redis下载和安装(Windows系统)

本套教程中采用 Windows 系统对 Redis 数据库进行讲解。 虽然 Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过 GitHub 来下载 Windows 版 Redis 安装包&#xff0c;下载地址&#xff1a;点击前往。 注意&#xff1a;Windows 安装包是某位民间“大神”根据 …

小白到运维工程师自学之路 第四十七集 (LNMP部署电影网站)

一、概述 Linux&#xff1a;作为操作系统&#xff0c;提供服务器的基本功能和稳定性。通常使用常见的Linux发行版&#xff0c;如Ubuntu、CentOS等。 Nginx&#xff1a;作为Web服务器和反向代理服务器&#xff0c;处理HTTP请求和传递数据。Nginx具有高性能、稳定性和并发处理能…

Java链式编程与Builder(建造者)设计模式

一、链式编程 1.1.释义 链式编程&#xff0c;也叫级联式编程&#xff0c;调用对象的函数时返回一个this对象指向对象本身&#xff0c;达到链式效果&#xff0c;可以级联调用。 1.2.特点 可以通过一个方法调用多个方法&#xff0c;将多个方法调用链接起来&#xff0c;形成一…

Mysql数据NULL避坑指南

NULL空值是mysql中一种特殊的数据值&#xff08;即"缺少的未知值"&#xff09;,NULL和字符串空值不是一回事&#xff0c;处理NULL与其他值不同&#xff0c;下面具体阐述相关差异&#xff1a; 一、NULL运算符 1、普通数据使用 > 、 < 、即可做常用的逻辑运算如…

Linux随机生成数

简介 在某些情况下&#xff0c;我们需要随机产生一个数来在一些场景中使用&#xff0c;例如验证码、ssh反向代理随机数的产生&#xff0c;又或者在一些shell脚本设计中需要用到随机数&#xff0c;下面以随机产生一个30000-40000之间的随机数为例。 使用shuf shuf 命令在一些 Li…

【FFMPEG】AVFilter使用流程

流程图 核心类 AVFilterGraph ⽤于统合这整个滤波过程的结构体 AVFilter 滤波器&#xff0c;滤波器的实现是通过AVFilter以及位于其下的结构体/函数来维护的 AVFilterContext ⼀个滤波器实例&#xff0c;即使是同⼀个滤波器&#xff0c;但是在进⾏实际的滤波时&#xff0c;也…

基于单片机水质检测系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;液晶显示当前参数&#xff1b;PH模块采集当前水质PH酸碱度&#xff1b;DS18B20温度传感器采集当前水体温度&#xff1b;TDS传感器采集当前水体TDS值&#xff1b;浊度传感器采集当前水体浑浊度&#xff1b;按键设置PH、温度、TDS…

基于vscode连接到远程服务中debug

本文章主要讲解以下两点的任务 1.在windows的vscode中去debug 本机子系统wsl2中运行的docker容器 该篇文件参考知乎上这篇文章 vscode远程连接到本机 wsl2子系统 中正在运行的 docker容器&#xff0c;该docker中有一个flask实例&#xff0c;通过vscode远程debug它 1.1安装v…

基于matlab配置单目鱼眼摄像头(附源码)

一、前言 此示例演示如何将鱼眼相机模型转换为针孔模型&#xff0c;并构建相应的单目相机传感器仿真。 要模拟安装在车辆中的单目摄像头传感器&#xff0c;请执行以下步骤&#xff1a; 通过使用棋盘格校准相机来估计固有的相机参数。内在参数描述了鱼眼镜头相机本身的特性。 …

抖音seo矩阵系统源码部署开发-可二开(二)

抖音seo短视频剧组嗯系统是以人工智能技术&#xff0c;通过多个短视频平台&#xff0c;多个短视频账号为核心&#xff0c;视频自动生成、自动发布智能优化&#xff0c;以达到矩阵营销的目的&#xff0c;从根本上解决短视频曝光难和获客少等难题&#xff0c;从而快速增加商家的运…

基于matlab使用卷积神经网络对晶圆图上的八种制造缺陷进行分类(附源码)

一、前言 此示例展示了如何使用简单的卷积神经网络 &#xff08;CNN&#xff09; 对晶圆图上的八种制造缺陷进行分类。 晶圆是半导体材料&#xff08;通常是硅&#xff09;的薄盘&#xff0c;用作集成电路的基础。每个晶圆产生几个单独的电路&#xff08;IC&#xff09;&…

XXX汽车ERP系统供应商索赔业务上线,助力业财数据快速闭环(投稿数据化月报四)

供应商三包索赔款项源起QMS质量系统&#xff0c;联动金税系统完成发票开具&#xff0c;最终在SAP系统中创建完成财务凭证。该流程上线前为手工操作&#xff0c;费时费力且效率低下容易出错。针对该业务现状&#xff0c;SAP与QMS业务顾问及开发团队组成开发小组&#xff0c;导入…

Java性能权威指南-总结26

Java性能权威指南-总结26 数据库性能的最佳实践异常日志 数据库性能的最佳实践 异常 Java的异常处理一直有代价高昂的坏名声。其代价确实比处理正常的控制流高一些&#xff0c;不过在大多数情况下&#xff0c;这种代价并不值得浪费精力去绕过。另一方面&#xff0c;因为异常处…

添加 zabbix 客户端主机 自定义监控内容 自动发现与注册(得不到假装不想要)

文章目录 一、添加zabbix客户端主机2.关闭防火墙和修改主机名 二、自定义监控内容1.需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息在客户端创建自定义 key在 Web 页面创建自定义监控项模板 三、zabbix 自动发现与自动注册zabbix 自动发现&#…

HCIE-datacom | 网络准入控制

一、前言 之前提供网络技术咨询服务时&#xff0c;有一位实习生同学向我咨询了有关网络准入的相关情景&#xff0c;在这里我结合华为HCIE-datacom中“网络准入控制”这一节等相关资料&#xff0c;对网络准入技术进行一下简单的理论性说明&#xff0c;与资料的讲解思路相同&…

基于matlab使用AprilTag标记进行相机校准(附源码)

一、前言 AprilTags被广泛用作物体检测、定位应用的视觉标记&#xff0c;并作为相机校准的目标。AprilTags类似于QR码&#xff0c;但旨在编码更少的数据&#xff0c;因此可以更快地解码&#xff0c;这对于实时机器人应用程序非常有用。使用 AprilTags 作为校准模式的优点包括更…

Docker学习笔记21

案例三&#xff1a;使用容器运行一个wordpress应用&#xff1a; 语言开发环境&#xff08;PHP&#xff09; 数据库 第一步&#xff1a;创建一个工程目录&#xff1a; mkdir wordpress cd wordpress 第二步&#xff1a;创建一个docker-compose.yaml文件&#xff1a; [rootnode…