图像标签格式转换

在做图像检测的时候,不同打标签软件得到的标签格式可能会不一样,此处提供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.rhkb.cn/news/478312.html

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

相关文章

不一样的css(三)

目录 一、前言 二、五角星 1.五角星,叠盖法: 2.五角星,拼凑法: 3.五角星,svg画法: 4.五角星,利用clip-path属性进行裁剪 三、结束语 一、前言 通过上两节的内容我们对css画小图标有了新…

autogen框架中使用chatglm4模型实现react

本文将介绍如何使用使用chatglm4实现react,利用环境变量、Tavily API和ReAct代理模式来回答用户提出的问题。 环境变量 首先,我们需要加载环境变量。这可以通过使用dotenv库来实现。 from dotenv import load_dotenv_ load_dotenv()注意.env文件处于…

Neural Magic 发布 LLM Compressor:提升大模型推理效率的新工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

LabVIEW实现TCP/IP通信

目录 1、TCP通信原理 2、硬件环境部署 3、云端环境部署 4、TCP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 8、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合…

Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程

目录 ⛳️推荐 前言 1. 安装docker与docker-compose 2. 启动容器运行镜像 3. 本地访问测试 4.安装内网穿透 5. 创建公网地址 6. 创建固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

Linux关于vim的笔记

Linux关于vim的笔记:(vimtutor打开vim 教程) --------------------------------------------------------------------------------------------------------------------------------- 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键…

Swift 实现链表重新排列:L0 → Ln → L1 → Ln-1

前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 143. 重排链表 不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…

Macos远程连接Linux桌面教程;Ubuntu配置远程桌面;Mac端远程登陆Linux桌面;可能出现的问题

文章目录 1. Ubuntu配置远程桌面2. Mac端远程登陆Linux桌面3. 可能出现的问题1.您用来登录计算机的密码与登录密钥环里的密码不再匹配2. 找不到org->gnome->desktop->remote-access 1. Ubuntu配置远程桌面 打开设置->共享->屏幕共享。勾选允许连接控制屏幕&…

ElasticSearch学习了解笔记

搜索引擎的原理: 1、查询分析(自然语言处理)理解用户需求 2、分词技术 3、关键词搜索匹配 4、搜索排序 lucence Lucene 是一个成熟的权威检索库 Elasticsearch 的搜索原理简单过程是,索引系统通过扫描文章中的每一个词&#xff…

GoF设计模式——结构型设计模式分析与应用

文章目录 UML图的结构主要表现为:继承(抽象)、关联 、组合或聚合 的三种关系。1. 继承(抽象,泛化关系)2. 关联3. 组合/聚合各种可能的配合:1. 关联后抽象2. 关联的集合3. 组合接口4. 递归聚合接…

【C++】C++11新特性详解:可变参数模板与emplace系列的应用

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

多模态大型语言模型(MLLM)综述

目录 多模态大语言模型的基础 长短期网络结构(LSTM) 自注意力机制 基于Transformer架构的自然语言处理模型 多模态嵌入的关键步骤 TF-IDF TF-IDF的概念 TF-IDF的计算公式 TF-IDF的主要思路 TF-IDF的案例 训练和微调多模态大语言模型(MLLM) 对比学习 (CLIP, ALIG…

Otter 安装流程

优质博文:IT-BLOG-CN 一、背景 随着公司的发展,订单库的数据目前已达到千万级别,需要进行分表分库,就需要对数据进行迁移,我们使用了otter,这里简单整理下,otter 的安装过程,希望对…

Web3 游戏周报(11.17 - 11.23)

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【11.17 - 11.23】Web3 游戏行业动态: 加密游戏开发商 Gunzilla Games 发推表示,其已与 Coinbase Ventures 达成合作并获得其投资。 国际足联将与 Mythica…

【linux学习指南】初识Linux进程信号与使用

文章目录 📝信号快速认识📶⽣活⻆度的信号📶 技术应⽤⻆度的信号🌉 前台进程(键盘)🌉⼀个系统函数 📶信号概念📶查看信号 🌠 信号处理🌉 忽略此信…

3DEXPERIENCE软件是干什么的—3DE软件代理商微辰三维

在当今数字化转型浪潮席卷全球各个行业的大背景下,3DEXPERIENCE 软件宛如一颗璀璨的明星,闪耀在产品设计、制造以及协同创新等诸多领域。它是由达索系统公司推出的一款综合性的、功能强大的商业软件平台,为企业的整个产品生命周期管理带来了前…

【大数据学习 | Spark-Core】广播变量和累加器

1. 共享变量 Spark两种共享变量:广播变量(broadcast variable)与累加器(accumulator)。 累加器用来对信息进行聚合,相当于mapreduce中的counter;而广播变量用来高效分发较大的对象&#xff0c…

STM32编程小工具FlyMcu和STLINK Utility 《通俗易懂》破解

FlyMcu FlyMcu 模拟仿真软件是一款用于 STM32 芯片 ISP 串口烧录程序的专用工具,免费,且较为非常容易下手,好用便捷。 注意:STM32 芯片的 ISP 下载,只能使用串口1(USART1),对应的串口…

MTK主板_安卓主板方案_MTK联发科主板定制开发

联发科(MTK)主板以其强大的性能和多样化的功能而受到广泛关注。该平台包括多个型号,例如MT6761、MT8766、MT6762、MT6765、MT8768和MT8788等,均配置了四核或八核64位处理器,主频可高达2.0GHz。采用先进的12nm工艺,搭载Android 11.…