图像标签格式转换

在做图像检测的时候,不同打标签软件得到的标签格式可能会不一样,此处提供lableimg(txt格式)和lableme(json格式)的互换。

json →txt

import os
import json
import cv2
import base64
import argparsedef parse_opt():parser = argparse.ArgumentParser()# 根据你的路径进行修改parser.add_argument('--img_path', type=str, default='img/')parser.add_argument('--txt_path', type=str, default='labels/test.txt')parser.add_argument('--json_path', type=str, default='json/')parser.add_argument('--class_names', type=str, default='[your class name]') # 修改为你的类别名称opt = parser.parse_args()return optdef decode_txt_file(txt_path, img_path, json_path, class_names):class_name = {i: name for i, name in enumerate(class_names)}dic = {}dic['version'] = '5.0.2'dic['flags'] = {}dic['shapes'] = []img_name = os.path.basename(txt_path).replace('.txt', '.jpg')img = cv2.imread(os.path.join(img_path, img_name))imageHeight, imageWidth, _ = img.shapewith open(txt_path) as f:datas = f.readlines()for data in datas:shape = {}data = data.strip().split(' ')class_id = int(data[0])shape['label'] = class_name[class_id]x = float(data[1]) * imageWidthy = float(data[2]) * imageHeightw = float(data[3]) * imageWidthh = float(data[4]) * imageHeightx1 = x - w / 2y1 = y - h / 2x2 = x1 + wy2 = y1 + hshape['points'] = [[x1, y1], [x2, y2]]shape['shape_type'] = 'rectangle'shape['flags'] = {}dic['shapes'].append(shape)dic['imagePath'] = img_namedic['imageData'] = base64.b64encode(open(os.path.join(img_path, img_name), 'rb').read()).decode('utf-8')dic['imageHeight'] = imageHeightdic['imageWidth'] = imageWidthjson_file = os.path.join(json_path, os.path.basename(txt_path).replace('.txt', '.json'))with open(json_file, 'w') as fw:json.dump(dic, fw)print(f'Saved {json_file}.')if __name__ == '__main__':opt = parse_opt()img_path = opt.img_pathtxt_path = opt.txt_pathjson_path = opt.json_pathclass_names = opt.class_names.split(',')if txt_path.endswith('.txt'):  # 单个文件转换decode_txt_file(txt_path, img_path, json_path, class_names)print('The conversion of single txt to json is complete')else:txt_names = os.listdir(txt_path)  # 多个文件转换for txt_name in txt_names:txt_file = os.path.join(txt_path, txt_name)decode_txt_file(txt_file, img_path, json_path, class_names)print('The conversion of txt to json is complete')

txt → json

import os
import json
import cv2
import base64
import argparsedef parse_opt():# Parse command line arguments.parser = argparse.ArgumentParser()parser.add_argument('--img_path', type=str, default='img/')parser.add_argument('--txt_path', type=str, default='labels')parser.add_argument('--json_path', type=str, default='json/')parser.add_argument('--class_names', type=str, default='[your class name]') # 修改为你的类别名称opt = parser.parse_args()return optdef decode_txt_file(txt_path, img_path, json_path, class_names):# Convert a txt file to a json file.class_name = {i: name for i, name in enumerate(class_names)}dic = {}dic['version'] = '5.0.2'dic['flags'] = {}dic['shapes'] = []img_name = os.path.basename(txt_path).replace('.txt', '.jpg')img = cv2.imread(os.path.join(img_path, img_name))imageHeight, imageWidth, _ = img.shapewith open(txt_path) as f:datas = f.readlines()for data in datas:shape = {}data = data.strip().split(' ')class_id = int(data[0])shape['label'] = class_name[class_id]x = float(data[1]) * imageWidthy = float(data[2]) * imageHeightw = float(data[3]) * imageWidthh = float(data[4]) * imageHeightx1 = x - w / 2y1 = y - h / 2x2 = x1 + wy2 = y1 + hshape['points'] = [[x1, y1], [x2, y2]]shape['shape_type'] = 'rectangle'shape['flags'] = {}dic['shapes'].append(shape)dic['imagePath'] = img_namedic['imageData'] = base64.b64encode(open(os.path.join(img_path, img_name), 'rb').read()).decode('utf-8')dic['imageHeight'] = imageHeightdic['imageWidth'] = imageWidthjson_file = os.path.join(json_path, os.path.basename(txt_path).replace('.txt', '.json'))with open(json_file, 'w') as fw:json.dump(dic, fw)print(f'Saved {json_file}.')def convert(img_size, box):# Convert absolute coordinates to relative coordinates.dw = 1. / (img_size[0])dh = 1. / (img_size[1])x = (box[0] + box[2]) / 2.0 - 1y = (box[1] + box[3]) / 2.0 - 1w = box[2] - box[0]h = box[3] - box[1]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def decode_json(json_path, json_name, txt_path):# Convert a json file to a txt file.class_name = {name: i for i, name in enumerate(class_names)}txt_file = open(os.path.join(txt_path, json_name[0:-5] + '.txt'), 'w')json_path = os.path.join(json_path, json_name)data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))img_w = data['imageWidth']img_h = data['imageHeight']for i in data['shapes']:label_name = i['label']if (i['shape_type'] == 'rectangle'):x1 = int(i['points'][0][0])y1 = int(i['points'][0][1])x2 = int(i['points'][1][0])y2 = int(i['points'][1][1])bb = (x1, y1, x2, y2)bbox = convert((img_w, img_h), bb)txt_file.write(str(class_name[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')print(f"Saved{json_name[0:-5] + '.txt'}")txt_file.close()if __name__ == '__main__':opt = parse_opt()img_path = opt.img_pathtxt_path = opt.txt_pathjson_path = opt.json_pathclass_names = opt.class_names.split(',')# Convert txt files to json files.if txt_path.endswith('.txt'):decode_txt_file(txt_path, img_path, json_path, class_names)print('The conversion of single txt to json is complete')else:txt_names = os.listdir(txt_path)for txt_name in txt_names:txt_file = os.path.join(txt_path, txt_name)decode_txt_file(txt_file, img_path, json_path, class_names)print('The conversion of txt to json is complete')

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

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

相关文章

【机器学习】——朴素贝叶斯模型

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

【Android+多线程】异步 多线程 知识总结:基础概念 / 多种方式 / 实现方法 / 源码分析

1 基本概念 1.1 线程 定义:一个基本的CPU执行单元 & 程序执行流的最小单元 比进程更小的可独立运行的基本单位,可理解为:轻量级进程组成:线程ID 程序计数器 寄存器集合 堆栈注:线程自己不拥有系统资源&#…

Error: Invalid version flag: if 问题排查

问题描述: 国产化系统适配,arm架构的centos 在上面运行docker 启动后需要安装数据库 依赖perl 在yum install -y perl 时提示: “Error: Invalid version flag: if”

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核,鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征,性能超越Linux内核10.7%。 鸿蒙内核更弹性:元OS架构,性能安全双收益 万…

五种创建k8s的configMap的方式及configmap使用

configmap介绍 Kubernetes 提供了 ConfigMap 来管理应用配置数据,将配置信息从容器镜像中解耦,使应用更灵活、可移植。 1、基于一个目录来创建ConfigMap ​ 你可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当你基于目…

如何将本地项目上传到gitee上

本地项目代码想上传到gitee管理、使用idea编辑器操作上传 新建仓库、填写信息 创建好了仓库,把HTTPS路径复制一下,之后会用到。 用命令进入项目进行git初始化 执行命令: cd 文件夹 git init 用idea把项目打开,然后配置一下gi…

大型语言模型LLM - Finetuning vs Prompting

资料来自台湾大学李宏毅教授机器学课程ML 2023 Spring,如有侵权请通知下架 台大机器学课程ML 2023 Springhttps://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php2023/3/10 课程 機器如何生成文句 内容概要 主要探讨了大型语言模型的两种不同期待及其导致的两类…

Scikit-learn Pipeline完全指南:高效构建机器学习工作流

在机器学习工作流程中,组合估计器通过将多个转换器(Transformer)和预测器(Predictor)整合到一个管道(Pipeline)中,可以有效简化整个过程。这种方法不仅简化了数据预处理环节,还能确保处理过程的一致性,最大限度地降低数据泄露的风险。构建组合估计器最常用的工具是Scikit-learn…

kali Linux中foremost安装

记录一下 foremost工具介绍 foremost是基于文件开始格式,文件结束标志和内部数据结构进行恢复文件的程序。该工具通过分析不同类型文件的头、尾和内部数据结构,同镜像文件的数据进行比对,以还原文件。它默认支持19种类型文件的恢复。用户还可…

ChatGPT如何辅助academic writing?

今天想和大家分享一篇来自《Nature》杂志的文章《Three ways ChatGPT helps me in my academic writing》,如果您的日常涉及到学术论文的写作(writing)、编辑(editing)或者审稿( peer review)&a…

2024年11月26日Github流行趋势

项目名称:v2rayN 项目维护者:2dust yfdyh000 CGQAQ ShiinaRinne Lemonawa 项目介绍:一个支持Xray核心及其他功能的Windows和Linux图形用户界面客户端。 项目star数:70,383 项目fork数:11,602 项目名称:fre…

大数据面试SQL题-笔记02【查询、连接、聚合函数】

大数据面试SQL题复习思路一网打尽!(文档见评论区)_哔哩哔哩_bilibiliHive SQL 大厂必考常用窗口函数及相关面试题 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】大数据面试SQL题-笔记02【查询、连接、聚合函数】​​​​​​​ 目录 01、查询 01…

Unity类银河战士恶魔城学习总结(P145 Save Skill Tree 保存技能树)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了技能树的保存 警告!!! 如果有LoadData()和SaveData()…

redmi 12c 刷机

刷机历程 一个多月前网购了redmi 12c这款手机, 价格只有550,用来搞机再适合不过了, 拆快递后就开始倒腾,网上有人说需要等7天才能解锁,我绑定了账号过了几天又忍不住倒腾,最后发现这块手机不用等7天解锁成功了,开始我为了获取root权限, 刷入了很火的magisk,但是某一天仍然发现/…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】

目录 1 前言2 YOLO在不同领域的应用3 物体检测指标和NMS3.1 mAP和IOU3.2 mAP计算流程3.2.1 VOC 数据集3.2.2 微软 COCO 数据集 3.3 NMS 1 前言 最近在做目标检测模型相关的优化,重新看了一些新的论文,发现了几篇写得比较好的YOLO系列论文综述&#xff0…

【通俗理解】步长和学习率在神经网络中是一回事吗?

【通俗理解】步长和学习率在神经网络中是一回事吗? 【核心结论】 步长(Step Size)和学习率(Learning Rate, LR)在神经网络中并不是同一个概念,但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…

STL之算法概览

目录 算法概览 算法分析与复杂度标识O() STL算法总览 质变算法mutating algorithms----会改变操作对象之值 非质变算法nonmutating algorithms----不改变操作对象之值 STL算法的一般形式 算法的泛化过程 算法概览 算法,问题之解法也。 以有限的步骤&#xff0…

华为IPD流程管理体系L1至L5最佳实践-解读

该文档主要介绍了华为IPD流程管理体系,包括流程体系架构、流程框架实施方法、各业务流程框架示例以及相关案例等内容,旨在帮助企业建立高效、规范的流程管理体系,实现业务的持续优化和发展。具体内容如下: 1. 华为流程体系概述 -…

【青牛科技】 D2822M 双通道音频功率放大电路芯片介绍,用于便携式录音机和收音机作音频功率放大器

概述: D2822M 用于便携式录音机和收音机作音频功率放大器。D2822M 采用 DIP8 和 SOP8 封装形式。 特点:  电源电压降到 1.8V 时仍能正常工作  交越失真小  静态电流小  可作桥式或立体声式功放应用  外围元件少  通道分离度高  开机和关机…

【Python中while循环】

一、深拷贝、浅拷贝 1、需求 1)拷贝原列表产生一个新列表 2)想让两个列表完全独立开(针对改操作,读的操作不改变) 要满足上述的条件,只能使用深拷贝 2、如何拷贝列表 1)直接赋值 # 定义一个…