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

news/2024/7/10 23:25:24 标签: 目标检测, YOLO, mmpose, yolopose

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

一、需求分析

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

1.预测图片

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

<a class=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.niftyadmin.cn/n/5326202.html

相关文章

用Python制作一个网站来介绍bicart

本文使用创作助手。 下面是一个使用Flask框架制作的bicart介绍网站的示例&#xff0c;其中包括美观的界面、背景颜色和背景音乐&#xff0c;以及图片轮播、描点、登录和注册功能。 from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask…

技术阅读周刊第十四期:Golang 作者 Rob Pike 在 GopherConAU 上的分享

技术阅读周刊&#xff0c;每周更新。 历史更新 20231215&#xff1a;第十期20231122&#xff1a;第十一期20231129&#xff1a;第十二期20240105&#xff1a;第十三期&#xff1a;一些提高生产力的终端命令 What We Got Right, What We Got Wrong URL: https://commandcenter.b…

安装Office Web Apps 2013

Office Web Apps 可以让用户通过浏览器就能操作Office文件&#xff08;Word,PowerPoint,Excel&#xff09;&#xff0c;客户端可以不安装Office&#xff0c;而且不用担心2003和2007文档格式的问题。下面入正题。 一、安装环境 因为Office Web Apps要求安装环境中不能用其它服…

Vue3中使用自定义指令

一&#xff0c;自定义指令&#xff1a; 应用场景&#xff1a;禁用按钮多次点击 1.vue2 a. src/libs/preventClick.js import Vue from vue const preventClick Vue.directive(preventClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el…

为何劳保鞋现在如此受欢迎,这就是原因!

当代年轻人最大的消费原则&#xff0c;必须是不花半点冤枉钱&#xff0c;伴随着军大衣成为“时尚单品”&#xff0c;硬核劳保鞋也大受欢迎。今天百华小编就与大家一起看看劳保安全鞋为何如此受大众欢迎呢。 首先&#xff0c;随着人们安全意识的提高&#xff0c;对个人安全和健康…

1127: 矩阵乘积

题目描述 计算两个矩阵A和B的乘积。 输入 第一行三个正整数m、p和n&#xff0c;0<m,n,p<10&#xff0c;表示矩阵A是m行p列&#xff0c;矩阵B是p行n列&#xff1b; 接下来的m行是矩阵A的内容&#xff0c;每行p个整数&#xff0c;用空格隔开&#xff1b; 最后的p行是矩…

逸学Docker【java工程师基础】1.认识docker并且安装

场景问题 在实际开发过程中我们有这样的场景问题 在开发阶段的环境配置到了其他人项目人员那里就不能运行了&#xff0c;尽管配置规格相同&#xff0c;但是在较多的不同的环境情况下还是可能会有错误。 开发&#xff1a;程序员&#xff1a;你那边可以运行了吗 测试&#xf…

Confluence跨大版本升级记录

初始版本7.4.18最终升级到了目前的最新版本8.7.1&#xff0c;在升级过程中遇到了很多问题&#xff0c;庆幸的是最后都解决了&#xff0c;记录一下。 背景 初始环境&#xff1a; OS&#xff1a;CentOS8.5 DB&#xff1a;10.8.8-MariaDB Confluence&#xff1a;7.4.18 公司…