yolo txt格式转coco json格式

yolo txt格式转coco json格式

**问题背景:**下载coco128数据集,使用yolov5模型进行推理并使用pycocotools.cocoeval 对预测结果进行精度计算。
coco128 下载地址:https://tianchi.aliyun.com/dataset/108650
解压缩cocozip之后可以看到如下的目录层级 :
在这里插入图片描述
在两个training017目录下,分别包含一个图片jpg文件和label txt文件。
├── images
│ └── train2017
└── 000000000009.jpg
├── labels
│ └── train2017
└── 000000000009.txt
转换代码:

import os
import json
import cv2
import random
import time
from PIL import ImageCOCO_REVERSE_LABEL_MAP = { 1:  1,  2:  2,  3:  3,  4:  4,  5:  5,  6:  6,  7:  7,  8:  8,9:  9, 10: 10, 11: 11, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17,17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25,25: 27, 26: 28, 27: 31, 28: 32, 29: 33, 30: 34, 31: 35, 32: 36,33: 37, 34: 38, 35: 39, 36: 40, 37: 41, 38: 42, 39: 43, 40: 44,41: 46, 42: 47, 43: 48, 44: 49, 45: 50, 46: 51, 47: 52, 48: 53,49: 54, 50: 55, 51: 56, 52: 57, 53: 58, 54: 59, 55: 60, 56: 61,57: 62, 58: 63, 59: 64, 60: 65, 61: 67, 62: 70, 63: 72, 64: 73,65: 74, 66: 75, 67: 76, 68: 77, 69: 78, 70: 79, 71: 80, 72: 81,73: 82, 74: 84, 75: 85, 76: 86, 77: 87, 78: 88, 79: 89, 80: 90}id_to_cate = {1: 'person', 2: 'bicycle', 3: 'car', 4: 'motorcycle', 5: 'airplane', 6: 'bus', 7: 'train', 8: 'truck',9: 'boat', 10: 'traffic light', 11: 'fire hydrant', 13: 'stop sign', 14: 'parking meter', 15: 'bench',16: 'bird', 17: 'cat', 18: 'dog', 19: 'horse', 20: 'sheep', 21: 'cow', 22: 'elephant', 23: 'bear',24: 'zebra', 25: 'giraffe', 27: 'backpack', 28: 'umbrella', 31: 'handbag', 32: 'tie', 33: 'suitcase',34: 'frisbee', 35: 'skis', 36: 'snowboard', 37: 'sports ball', 38: 'kite', 39: 'baseball bat',40: 'baseball glove', 41: 'skateboard', 42: 'surfboard', 43: 'tennis racket', 44: 'bottle', 46: 'wine glass',47: 'cup', 48: 'fork', 49: 'knife', 50: 'spoon', 51: 'bowl', 52: 'banana', 53: 'apple', 54: 'sandwich',55: 'orange', 56: 'broccoli', 57: 'carrot', 58: 'hot dog', 59: 'pizza', 60: 'donut', 61: 'cake',62: 'chair', 63: 'couch', 64: 'potted plant', 65: 'bed', 67: 'dining table', 70: 'toilet', 72: 'tv',73: 'laptop', 74: 'mouse', 75: 'remote', 76: 'keyboard', 77: 'cell phone', 78: 'microwave', 79: 'oven',80: 'toaster', 81: 'sink', 82: 'refrigerator', 84: 'book', 85: 'clock', 86: 'vase', 87: 'scissors',88: 'teddy bear', 89: 'hair drier', 90: 'toothbrush'
}def yolotxt2cocojson(save_dir,label_dir,img_dir):categories=[]for id,label in id_to_cate.items():categories.append({'id':id,'name':label,'supercategory':'None'})write_json_context=dict()                                                      #写入.json文件的大字典write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2024, 'contributor': 'coco128', 'date_created': '2024-09-06'}write_json_context['licenses']=[{'id':1,'name':None,'url':None}]write_json_context['categories']=categorieswrite_json_context['images']=[]write_json_context['annotations']=[]#接下来的代码主要添加'images'和'annotations'的key值img_list_ori=os.listdir(img_dir)                                           #遍历该文件夹下的所有文件,并将所有文件名添加到列表中label_list_ori=os.listdir(label_dir)# label与image中对应的数据(原始下载coco128数据 image和label并非一一对应)img_list_ori_names   = [file.replace('.jpg', '') for file in img_list_ori   ]print( "img_list_ori_names = ", len(img_list_ori_names) )label_list_ori_names = [file.replace('.txt', '') for file in label_list_ori ]intersection = [ item for item in img_list_ori_names if item in label_list_ori_names ]print( len(intersection) )img_list = [name+".jpg" for name in intersection ]print( "img_list = ",len(img_list) )for i,img_name in enumerate(img_list):img_path = os.path.join(img_dir,img_name) image = Image.open(img_path)                                               #读取图片,然后获取图片的宽和高W, H = image.sizeimg_context={}                                                              #使用一个字典存储该图片信息img_context['file_name']=img_nameimg_context['height']=Himg_context['width']=Wimg_context['date_captured']='2022-07-8'img_context['id']=i                                                         #该图片的idimg_context['license']=1img_context['color_url']=''img_context['flickr_url']=''write_json_context['images'].append(img_context)                            #将该图片信息添加到'image'列表中label_name = img_name.split('.')[0] +'.txt'                                          #获取该图片对应的txt文件with open(os.path.join(label_dir,label_name),'r') as fr:lines=fr.readlines()                                                   #读取txt文件的每一行数据,lines2是一个列表,包含了一个图片的所有标注信息for j,line in enumerate(lines):bbox_dict = {}                                                          #将每一个bounding box信息存储在该字典中class_id,x,y,w,h=line.strip().split(' ')                                          #获取每一个标注框的详细信息class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h)       #将字符串类型转为可计算的int和float类型xmin=(x-w/2)*W                                                                    #坐标转换ymin=(y-h/2)*Hxmax=(x+w/2)*Wymax=(y+h/2)*Hw=w*Wh=h*Hbbox_dict['id']=i*10000+j                                                         #bounding box的坐标信息bbox_dict['image_id']=ibbox_dict['category_id']=COCO_REVERSE_LABEL_MAP[class_id+1]                                               #注意目标类别要加一bbox_dict['iscrowd']=0height,width=abs(ymax-ymin),abs(xmax-xmin)bbox_dict['area']=height*widthbbox_dict['bbox']=[xmin,ymin,w,h]bbox_dict['segmentation']=[]write_json_context['annotations'].append(bbox_dict)                               #将每一个由字典存储的bounding box信息添加到'annotations'列表中save_name = img_dir.split('/')[-1]save_name = "test0906"name = os.path.join(save_dir,'{}.json'.format(save_name))with open(name,'w') as fw:                                                                #将字典信息写入.json文件中json.dump(write_json_context,fw,indent=2,ensure_ascii=False)                        #加后缀ensure_ascii=False放置写入后中文乱码if __name__ =="__main__":save_dir = "./"label_dir = "./labels/train2017/"img_dir = "./images/train2017/"yolotxt2cocojson(save_dir,label_dir,img_dir)

参考链接:https://blog.csdn.net/a1004550653/article/details/131301909

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

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

相关文章

全面掌握信息架构:数字化转型的最佳实践与应用指南

在全球化和信息化高度发展的今天,企业正面临前所未有的挑战与机遇 数字化转型已成为各大企业保持竞争力的必由之路,而成功的数字化转型离不开稳健且灵活的信息架构。《信息架构:商业智能&分析与元数据管理参考模型》正是一本为企业提供全…

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…

Java中的类加载与卸载机制详解

在Java虚拟机(JVM)中,类加载和类卸载机制是Java运行时环境的重要组成部分。理解类的加载与卸载不仅有助于深入掌握JVM的运行原理,还可以帮助开发者优化程序性能,特别是在内存管理和应用程序生命周期管理中起到关键作用…

《零散知识点 · Kafka 知识拓展》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

教师节特辑:AI绘制的卡通人物,致敬最可爱的人‍

【编号:9】教师节到了,今天我要分享一组由AI绘制的教师节主题卡通人物插画,每一幅都充满了对老师的敬意和爱戴。让我们一起用这些可爱的卡通形象,向辛勤的园丁们致敬! 🎓【教师形象】 这…

并发编程 - NSThread

引言 关于并发编程,我们在前面的博客中已经介绍过了GCD和NSOperation&NSOperationQueue。这两种方案足以覆盖大多数开发场景。然而,理解NSThread仍然是有必要的。虽然它在现代开发中使用较少,但对于理解底层线程管理和并发编程的基础&am…

量化交易backtrader实践(一)_数据获取篇(2)_tushare与akshare

上一节回顾 在上一节中,从股票的基本功能和主要数据进行小结,明确了进行backtrader回测所需要的数据,并且学习了backtrader的数据来源以及PandasData的格式要求,已经做到假设拿到.txt或.csv文件后,能把里面的股票基本…

赎金信--力扣383

赎金信 题目思路一方法一:哈希表思路二方法二 数组 题目 思路一 我们使用哈希表map的思路,A能不能由B组成,说明B包含的元素个数要大于等于A。 所以我们先利用map的key和value分别对magazine中的出现的字符以及出现的次数存储起来。 然后我们…

【射频通信电子线路基础第三讲】射频网络与阻抗匹配包括射频电路与网络、二端口射频网络参数,阻抗匹配解析法

一、射频电路与网络 1、物理等效电路与网络等效电路 (1)物理等效电路:是基于电流电压的等效电路,采用集总参数,反应电路内部的原理 (2)网络等效电路:是基于功率的等效电路&#x…

页面水印的实现以及防删除方案

水印相关 引言绘制一个水印输出背景图封装一点点细节图片加水印防止水印删除问题解决方案 引言 在企业里为了防止信息泄露和保护知识产权,通常会在页面和图片上添加水印 前端页面水印的添加一般有这几种方式:dom 元素循环、canvas 输出背景图、svg 实现…

企业财税自动化解决方案的成本效益分析与投资回报预测

随着企业规模的扩大和业务复杂度的增加,企业在财务管理方面也面临着诸多挑战,传统的财务管理方式逐渐无法满足企业经营需求,借助财税自动化解决方案来提高财务效率和准确性、降低人力成本,为企业带来长期的效益提升,已…

通过战略性SEO整合提升B2B内容的可见性、权威性和投资回报率

精明的市场营销者知道,尽管B2B营销的重点是推动商业采购,但归根结底,商务买家依然是消费者。无论你是针对返校购物的父母的鞋子品牌,还是寻找新的内容制作合作伙伴以扩大内容计划的市场营销领导者,搜索引擎优化&#x…

航空航天混合动力(2)电动飞机发展中的电气连接挑战

航空航天混合动力(2)电动飞机发展中的电气连接挑战 1.概述2.更高的电压(千伏)和功率(兆瓦)2.缓解局部放电/电晕效应3.提高可靠性,更恶劣的环境,频繁的维护和检查,冲击和振动4.减重5.抗电弧跟踪和液压油阻力6.严格的可燃性,毒性和烟雾要求7.海拔和气压的影响8.工作温度范围…

远程存储 RDMA

什么是 RDMA RDMA(Remote Direct Memory Access)指的是远程直接内存访问,这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法。 Remote:数据通过网络与远程机器间进行数据传输。 Direct:没有内核的参与&am…

【区块链 + 人才服务】CERX- 基于联盟链的研学资源交换网络 | FISCO BCOS应用案例

CERX 是定位于面向高校科学研究与教学的分布式研学资产交换网络,构建一个用于数据、算法模型、论文和课程的研学资源价值流转平台。该平台采用 FISCO BCOS 联盟链为核心区块链层。 CERX 基于“交叉学科”的人才培养生态,围绕“科研、课件、课程、证书”…

Linux基础3-基础工具1(什么是工具,yum,vim基础)

目录 一.什么是工具 二.yum 2.1 yum基础 2.2 yum拓展 2.3 rzsz 三.vim基础 四.下章内容 1. vim 插入模式,底行模式,命令模式下详解。vim基础配置 2. gcc/g 基础 一.什么是工具 工具的本质是也是指令。通过工具我们能快速的实现某些功能 二.yum 2.1…

JVM合集

序言: 1.什么是JVM? JVM就是将javac编译后的.class字节码文件翻译为操作系统能执行的机器指令翻译过程: 前端编译:生成.class文件就是前端编译后端编译:通过jvm解释(或即时编译或AOT)执行.class文件时跨平台的,jvm并不是跨平台的通过javap进行反编译2.java文件是怎么变…

任意论文一键变播客,谷歌正式发布Illuminate,它能重构研究者的学习方式吗?

先来听一段英文播客,内容是不是很熟悉? ,时长04:27 是的,这俩人就是在聊那篇《Attention is All You Need》。在 4 分半的对话里,他们介绍了论文的核心内容,一问一答,听上去相当自然。 播客原址…

SpringBoot大学生租房平台:技术实现与市场分析

第2章 开发环境与技术 大学生租房平台的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对大学生租房平台用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的,是经常变动的,没有办…