目标检测脚本之mmpose json转yolo txt格式

news2024/11/17 17:42:46

目标检测脚本之mmpose json转yolo txt格式

一、需求分析

在使用yolopose及yolov8-pose 网络进行人体姿态检测任务时,有时需要标注一些特定场景的中的人型目标数据,用来扩充训练集,提升自己训练模型的效果。因为单纯的人工标注耗时费力,所以可以使用一些开源的大模型如(mmpose)来标注图片。以mmpose为例,对下面图片进行预测后生成的结果图如下所示:

1.预测图片

从预测图片可以看出,预测的结果还是不错的,目标框和关键点的位置预测的还是比较准确的。

mmpose 预测结果图

2. json 文件

从json 文件中可以看出,包含4个字段:Keyponts、keypoints_score、bbox、bbox_score,注意其中keypoints只包含关键点的(x,y)坐标值,并没有yolo格式中的v值。keypoints_score表示每个关键点的得分,bbox表示目标框的左上角和右下角坐标,bbox_score表示目标框的得分。

在这里插入图片描述
在这里插入图片描述

二、需求实现

1. 预计结果

如下图所示,希望通过脚本文件可以批量将mmpose生成的json文件转为yolo的txt标签格式

在这里插入图片描述

2. 源码实现:

# 处理 mmpose 推理后的json文件,生成coco格式关键点的标签文件
import json
import os
import cv2

# 目标检测框 x1y1x2y2 转 为 cls,x_center,y_center,w,h
def convert_xywh(box,image_width,image_height):
    x1,y1 = box[0],box[1]
    x2,y2 = box[2],box[3]
    x = (x2 + x1) /(2*image_width)
    y = (y2 + y1) /(2*image_height)
    width = (x2-x1) / image_width
    height = (y2-y1) / image_height
    class_id = 0
    return [class_id,round(x,4),round(y,4),round(width,4),round(height,4)]
    


#  判断目标的尺寸是否太小,这里设置了5以下返回True,可以自行根据实际情况更改
def is_too_small(label,image_width,image_height):
    if label[4] * image_width < 5 or label[3] * image_height< 5:
        return True


def json2txt(json_dir,image_dir,save_label_dir):
    """
    根据输入的json文件夹,图像文件夹,和保存标签的文件夹,生成coco格式的标签文件。
    
    Args:
        json_dir (str): 存放json文件的文件夹路径。
        image_dir (str): 存放图像文件的文件夹路径。
        save_label_dir (str): 保存标签文件的文件夹路径。
    
    Returns:
        None
    """
    print(save_label_dir)
    if not os.path.exists(save_label_dir):
        os.makedirs(save_label_dir)
    
    json_list = os.listdir(json_dir)
    for json_file in json_list:
        image_file = os.path.join(image_dir,json_file.split('.')[0]+'.jpg')
        img = cv2.imread(image_file)
        if img is None:
            continue
        width,height = img.shape[1],img.shape[0]
        json_path = os.path.join(json_dir,json_file)
        label_path = os.path.join(save_label_dir,json_file.split('.')[0]+'.txt')
        
        
        with open(json_path,'r',encoding='utf-8') as f:
            result = json.load(f)  # 读取json文件
            kepoints = []
            kepoints_scores = []
            boxes = []
            
            for item in result:
                kepoints.append(item.get("keypoints"))
                kepoints_scores.append(item.get("keypoint_scores"))
                boxes.append(item.get("bbox"))
            
            # print(len(boxes))
            
            coco_model_kepoints = []
            coco_boxes = []
            # 共有多少个目标,也相当于多少组关键点评分
            for i in range(len(kepoints_scores)):
                coco_model_kepoints_temp = []
                #每组关键点有17个,每个关键点有2个值,需要将每个关键点都转换成coco格式,补充为3个值
                for j in range(len(kepoints_scores[i])):                   
                    if kepoints_scores[i][j] >= 0.45:
                        x = kepoints[i][j][0]/width if kepoints[i][j][0]/width > 0 else 0
                        y = kepoints[i][j][1]/height if kepoints[i][j][1]/height > 0 else 0
                        v = 2
                    else:
                        x = 0
                        y = 0
                        v = 0
                    
                    if x > 1:
                        x = 1
                    if y > 1:
                        y = 1
                    x = round(x,4)
                    y = round(y,4)
                    coco_model_kepoints_temp.append(x)
                    coco_model_kepoints_temp.append(y)
                    coco_model_kepoints_temp.append(v)
                
                if all(v == 0 for v in coco_model_kepoints_temp) is False:
                    coco_boxes.append(convert_xywh(boxes[i][0],width,height))
                    coco_model_kepoints.append(coco_model_kepoints_temp)
                
            final_label = []   
            for k in range(len(coco_model_kepoints)):
                temp_label = []
                for item1 in coco_boxes[k]:
                    temp_label.append(item1)
                for item2 in coco_model_kepoints[k]:
                    temp_label.append(item2)
    
                final_label.append(temp_label)
            with open(label_path,'w',encoding='utf-8') as f1:
                for label in final_label:
                    if is_too_small(label,width,height):
                        continue
                    for item in label:
                        f1.write(str(item)+' ')
                    f1.write('\n')


if __name__ == '__main__':
    json_dir = '' # 放置使用mmpose 预测出来的图片的json 文件路径
    image_dir = '' # 放置用于预测的图片路径
    save_label_dir = '' # 用来保存最终label文件的路径

    json2txt(json_dir,image_dir,save_label_dir)


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

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

相关文章

笔记软件内怎么查看文章字数 笔记查看字数的操作步骤

在记录生活点滴、工作要务时&#xff0c;你是否曾像我一样&#xff0c;为了知道写了多少字而犯愁&#xff1f;尤其是在需要精确控制字数时&#xff0c;那种焦虑感更是如影随形。 记得有一次&#xff0c;我为了一个项目报告苦思冥想&#xff0c;好不容易写了个初稿&#xff0c;…

0111qt

实现闹钟&#xff0c;并播报懒虫...~ daytest.pro: QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (th…

堆叠线:实现高效连接和数据传输的利器

堆叠线是一种常见的网络连接解决方案&#xff0c;主要应用于数据中心和企业网络等领域。本文将介绍堆叠线的定义、分类、作用以及与光纤线的区别&#xff0c;同时提供详细的堆叠线接法和相关问题的解答。 第一部分&#xff1a;堆叠线是什么 堆叠线是一种用于连接网络设备的高…

mysql日志那些事

一、Mysql常见日志 MySQL有不同类型的日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分为二进制日志、错误日志、通用查询日志、慢查询日志和中继日志&#xff0c;使用这些日志可以查看MySQL内部发生的事情。 二、慢查询日志&#xff08;slow query log&#xff0…

windows安装RabbitMq,修改数据保存位置

1、先安装Erlang&#xff0c; Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹&#xff0c;找到rabbitmq-env.bat&#xff0c;编辑文件…

初识Hadoop-概述与关键技术

一.大数据概述 1.什么是大数据 高速发展的信息时代&#xff0c;新一轮科技革命和变革正在加速推进&#xff0c;技术创新日益成为重塑经济发展模式和促进经济增长的重要驱动力量&#xff0c;而“大数据”无疑是核心推动力。 那么&#xff0c;什么是“大数据”呢&#xff1…

力扣hot100 二叉树的最近公共祖先 递归

Problem: 236. 二叉树的最近公共祖先 &#x1f468;‍&#x1f3eb; 参考大佬题解 &#x1f496; 图解 时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) &#x1f496; AC code /*** Definition for a binary tree node.*…

在Java中正确使用Optional

Optional类是在Java 8中引入的&#xff0c;用于解决NullPointerException的问题。 java.util.Optional类是一个泛型类型的类&#xff0c;只包含一个类型为T的值。其目的是提供对可能为null的类型T的引用对象的更安全的替代方案。但是&#xff0c;只有在正确使用的情况下&#…

Discourse 访问统计数据的不一致

Discourse 如果使用网站跟踪程序&#xff0c;例如 Google Analytics 得到的网站访问数据和真实的网站访问数据是不一致的。 通常 Google Analytics 提供的数据更少&#xff0c;或者说是少很多。 这是因为 Discourse 的数据调用使用的是 API&#xff0c;在你的页面载入后&…

Java医院综合绩效考核系统源代码

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作…

【C语言小游戏】贪吃蛇

文章目录 1.引言2.运行图2.涉及知识3 Windows API3.1 控制台3.2 控制台屏幕坐标3.3 操作句柄3.4 控制台屏幕光标3.5 监视按键 4. 设计说明5. 完整代码 1.引言 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇 实现基本的功能&#xff1a; 贪吃蛇地图绘制蛇吃⻝物的…

《BackTrader量化交易图解》第9章:回测结果分析

文章目录 9. 回测结果分析9.1 常用量化分析指标9.2 Analyzer 分析类9.3 Analyzer 分析模块架构图9.4 SQN 指数9.5 案例&#xff1a;回测数据基本分析9.6 案例&#xff1a;回测数据扩展指标分析 9. 回测结果分析 9.1 常用量化分析指标 使用BackTrader等量化软件做交易会生成大…

js(JavaScript)数据结构之字典

什么是数据结构&#xff1f; 下面是维基百科的解释&#xff1a; 数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装&#xff1a;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 我们每天的编码中都会…

审稿变慢?还疯狂拒稿?这本毕业神刊如今争议不断,还值得一投吗?

【SciencePub学术】 IEEE ACCESS 期刊评说 网友辣评 评说1&#xff1a;麻了&#xff0c;11月17收到外审&#xff0c;现在意见还没回来啊&#xff0c;神刊肿么了&#xff1f; 评说2&#xff1a;两个审稿人评审的&#xff0c;一个拒绝&#xff08;最终意见大修&#xff09;&…

代码随想录 Leetcode707. 设计链表

题目&#xff1a; 代码(首刷看解析 2024年1月11日&#xff09;&#xff1a; class MyLinkedList { private:struct ListNode{int val;ListNode* next;ListNode(int val):val(val),next(nullptr){}};int size;ListNode* dummyHead; public:MyLinkedList() {dummyHead new List…

序章 初始篇—转生到vue世界!

Vue.js 是什么&#xff1f; Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…

四、C++运算符(4)比较运算符

作用&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或者假值 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespace std; int main() {//int a 10;int b 20; //变量a重新赋值为100//cout << (ab) << end…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…

order by 与 分页 的冲突

order by 与 分页 的冲突 问题背景 Oracle拼接SQL&#xff0c;JAVA使用SQLQueryExecutor执行拼接的SQL&#xff0c;SQL如下&#xff1a; SELECT col_key, col_other_info FROM tb_tableName WHERE col_where_info 一些筛选条件 order by col_updatetime desc 该表中的数…

一行代码给Button添加一个光标焦点动画:得着焦点按钮放大,失去焦点按钮恢复

当光标进入Button的时候&#xff0c;也就是Button得着焦点时&#xff0c;Button出现放大效果&#xff0c;失去焦点的时候&#xff0c;恢复原来的尺寸。 本例仅供学习交流之用 一、效果 按钮得着焦点&#xff0c;放大 按钮失去焦点&#xff0c;恢复 二、给按钮添加动效 得着…