记录::关键点检测数据转化和可视化LSP、FLIC转yolov8-pose的txt

最近想试一下关键点检测的效果,先从yolov8-pose开始,不想跑coco那么大的数据集,就找了两个比较小的

yolov8-pose的txt数据格式如下:

        类别、box、节点,数据做了归一化

可视化只显示了点,没有连线

参数:

        mat_path 是 数据集mat文件所在地址,包含mat文件名
        image_path 是 数据集图像的地址,不包含图像名
        save_path 是 转换为txt后保存的地址
        save_path 是可视化结果保存的地址

1、lsp

LSP:运动场景,单人数据集,截取后的单人区域,图片很小,2000张图片,14个节点

def save_joints_lsp(mat_path, image_path, save_path,save_path1):
    """
    mat_path 是 lsp数据集mat文件所在地址,包含mat文件名
    image_path 是 lsp数据集图像的地址,不包含图像名
    save_path 是 转换为txt后保存的地址
    save_path 是可视化结果保存的地址
    lsp数据集共2000张图片
    """
    joints = loadmat(mat_path)
    joints = joints["joints"].transpose(2, 0, 1)
    joints = joints[:, :, :]

    #num = 0
    for img_path in glob.glob("%s/*.jpg" % image_path):
        img_name = img_path.split("/")[-1].split(".")[0]
        img = Image.open(img_path)
        img = np.array(img, dtype=np.uint8)
        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
        imgh, imgw = img.shape[:2]
        num = int(img_name[2:])
        cen_points = joints[num-1, ...]

        points_num = cen_points.shape[-1]
        point_dict = {}
        ps = []
        for points_ in range(points_num):
            point_x = cen_points[0, points_]
            point_y = cen_points[1, points_]
            vi = cen_points[2, points_]
            if vi==0:
                vi = 2.0
            elif vi==2:
                print(name)
            point_dict[str(points_)] = [point_x/imgw, point_y/imgh,vi]
            # cv2.circle(img, (int(point_x), int(point_y)), 5, colors[points_],
            #                   thickness=-1)

            ps.append([int(point_x), int(point_y)])
        # x, y, w, h = cv2.boundingRect(np.array([ps]))
        # x = (x+w/2)/imgw
        # y = (y+h/2)/imgh
        # w = (w+6)/imgw
        # h = (h+6)/imgh
        x =0.5
        y = 0.5
        w =1
        h=1

        with open(os.path.join(save_path, img_name + ".txt"), "w") as f:
            f.write(str(0)+" "+str(x)+" "+str(y)+" "+str(w)+" "+str(h))
            cv2.rectangle(img,(int(x*imgw-w*imgw/2),int(y*imgh-h*imgh/2)),
                          (int(x*imgw+w*imgw/2),int(y*imgh+h*imgh/2)),
                          (0,0,255),5)
            for i in point_dict:
                p = point_dict[i]
                f.write(" "+str(p[0]) + " " + str(p[1]) + " " + str(p[2]))
                cv2.circle(img, (int(p[0]*imgw), int(p[1]*imgh)), 5, colors[points_],
                           thickness=-1)
            f.write("\n")



            #img_txt.write(str(point_dict))
        f.close()
        #num += 1
        # 若不想看图片中关键点的位置是否准确,请注释掉后面两行
        # cv2.imshow("img", img)
        # cv2.waitKey()
        cv2.imwrite(save_path1+"/"+img_name+".jpg",img)

2、FLIC

FLIC:电影场景,多人情况下label也只有单人,labels有29个节点,大多为nan,选了9个节点

def save_flic(mat_path, image_path, save_path,save_path1):
    examples = loadmat(mat_path)
    examples = examples["examples"][0]
    joint_ids = ['lsho', 'lelb', 'lwri', 'rsho', 'relb', 'rwri', 'lhip',
                 'lkne', 'lank', 'rhip', 'rkne', 'rank', 'leye', 'reye',
                 'lear', 'rear', 'nose', 'msho', 'mhip', 'mear', 'mtorso',
                 'mluarm', 'mruarm', 'mllarm', 'mrlarm', 'mluleg', 'mruleg',
                 'mllleg', 'mrlleg']
    available = ['lsho', 'lelb', 'lwri', 'rsho', 'relb', 'rwri', 'lhip','rhip', 'head']

    for i, example in enumerate(examples):
        joint = example[2].T
        img_name = example[3][0]
        joints = dict(zip(joint_ids, joint))

        img =cv2.imread(image_path+"/"+img_name)
        img_name = img_name.split(".")[0]
        imgh, imgw = img.shape[:2]
        point_dict = {}
        ps = []
        head = np.asarray(joints['reye']) + \
               np.asarray(joints['leye']) + \
               np.asarray(joints['nose'])
        head /= 3
        joints['head'] = head.tolist()
        for name in available:
            #joint_pos.append(joints[name])
            point = joints[name]
            point_dict[name] = [point[0]/imgw, point[1]/imgh,2.0]
            ps.append([int(point[0]), int(point[1])])
        x, y, w, h = cv2.boundingRect(np.array([ps]))
        x = (x+w/2)/imgw
        y = (y+h/2)/imgh
        w = (w+20)/imgw
        h = (h+20)/imgh
        with open(os.path.join(save_path, img_name + ".txt"), "w") as f:
            f.write(str(0) + " " + str(x) + " " + str(y) + " " + str(w) + " " + str(h))
            cv2.rectangle(img, (int(x * imgw - w * imgw / 2), int(y * imgh - h * imgh / 2)),
                          (int(x * imgw + w * imgw / 2), int(y * imgh + h * imgh / 2)),
                          (0, 0, 255), 5)
            c =0
            for i in point_dict:
                p = point_dict[i]
                f.write(" " + str(p[0]) + " " + str(p[1]) + " " + str(p[2]))
                cv2.circle(img, (int(p[0] * imgw), int(p[1] * imgh)), 5, colors[c],
                           thickness=-1)
            f.write("\n")
            c = c+1
            # img_txt.write(str(point_dict))
        f.close()

        # num += 1
        # 若不想看图片中关键点的位置是否准确,请注释掉后面两行
        # cv2.imshow("img", img)
        # cv2.waitKey()
        cv2.imwrite(save_path1 + "/" + img_name + ".jpg", img)

完整代码:https://github.com/ziyaoma/detect-pose

参考:LSP数据集与MPII数据集标签转txt文件(字典形式储存)_mpii标注文件修改成txt-CSDN博客

https://github.com/Fangyh09/PoseDatasets

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day23 修剪二叉搜索树 将有序数组转换为二叉搜索树 将二叉搜索树转换为累加树

题目1:669 修剪二叉搜索树 题目链接:669 修剪二叉搜索树 题意 将二叉搜索树的节点值修剪到[low,high]这个范围内 递归 递归三部曲: 1)递归函数的参数和返回值 2)终止条件 3)单层递归逻辑 代码 /**…

Cobbler部署(PXE二次封装)

文章目录 Cobbler 部署一、Cobbler简介二、Cobbler的工作原理三、Cobbler安装1、操作过程命令格式2、cobbler安装图文详解 Cobbler 部署 一、Cobbler简介 Cobbler是一款Linux生态的自动化运维工具,基于Python2开发,用于自动化批量部署安装操作系统&…

MySQL运维篇(二)主从复制

一、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过 二进制日志 传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL 支持一台主库同时向多台从库进行复制, 从…

网络安全防护部署所需要注意的几点

顶层设计概念 考虑项目各层次和各要素,追根溯源,统揽全局,在最高层次上寻求问题的解决之道 顶层设计”不是自下而上的“摸着石头过河”,而是自上而下的“系统谋划” 网络安全分为 物理、网络、主机、应用、管理制度 边界最强 接…

springboot109新闻稿件管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的新闻稿件管理系统 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获…

卡尔曼滤波、马尔科夫模型、粒子滤波、TSP问题知识点回顾

前面有小结了概率论、线性代数、现代控制理论的一些知识点,这边再来回顾下之前看过了关于卡尔曼滤波、马尔科夫模型、粒子滤波、动态规划中的TSP问题,这边也只是知其形,便于日后应用到一些实际案例中。 一.卡尔曼滤波 这边只是记录要点&…

浪花 - 主页开发

一、简易版主页 1. 主页展示用户列表 <template><!--推荐用户列表--><van-cardv-for"user in userList":desc"user.profile":title"${user.username}(${user.planetCode})":thumb"user.avatarUrl"><template #…

利用预训练模型SKEP进行情感分析

项目地址&#xff1a;文本情感分析 - 飞桨AI Studio星河社区 (baidu.com) baidu/Senta: Baidus open-source Sentiment Analysis System. (github.com) 本项目将详细全面介绍情感分析任务的两种子任务&#xff0c;句子级情感分析和目标级情感分析。 同时演示如何使用情感分析…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列&#xff1f; 消息队列是一种进程间通信或同一进程的不同线程间的通信方式&#xff0c;软件的贮列用来处理一系列的输入&#xff0c;通常是来自用户。消息队列提供了异步的通信协议&#xff0c;每一个贮列中的纪录包含详细说明的数据…

一文看完String的前世今生,内容有点多,请耐心看完!

写在开头 String字符串作为一种引用类型&#xff0c;在Java中的地位举足轻重&#xff0c;也是代码中出现频率最高的一种数据结构&#xff0c;因此&#xff0c;我们需要像分析Object一样&#xff0c;将String作为一个topic&#xff0c;单独拿出来总结&#xff0c;这里面涉及到字…

虹科分享 | Redis与MySQL协同升级企业缓存

文章速览&#xff1a; MySQL为什么需要Redis EnterpriseRedis Enterprise带来哪些优势Redis Enterprise与MySQL协同 传统的MySQL数据库在处理大规模应用时已经到了瓶颈&#xff0c;Redis Enterprise怎样助力突破这一瓶颈&#xff1f;Redis Enterprise与MYSQL共同用作企业级缓存…

第二次作业+第三次作业

第二次作业第三次作业 第二次作业 题目&#xff1a; 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[ww…

[全连接神经网络]Transformer代餐,用MLP构建图像处理网络

一、MLP-Mixer 使用纯MLP处理图像信息&#xff0c;其原理类似vit&#xff0c;将图片进行分块(patch)后展平(fallten)&#xff0c;然后输入到MLP中。理论上MLP等价于1x1卷积&#xff0c;但实际上1x1卷积仅能结合通道信息而不能结合空间信息。根据结合的信息不同分为channel-mixi…

hash应用

目录 一、位图 1.1、引出位图 1.2、位图的概念 1.3、位图的应用 1.4、位图模拟实现 二、布隆过滤器 2.1、什么是布隆过滤器 2.2、布隆过滤器应用的场景 2.3、布隆过滤器的原理 2.4、布隆过滤器的查找 2.5、布隆过滤器的插入 2.6、布隆过滤器的删除 2.7、布隆过滤器…

深入解析JavaScript中箭头函数的用法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 箭头函数(Arrow function)是JavaScript ES6中引入的一大特性。箭头函…

数字图像处理期末速成笔记

目录 一、基础知识二、相邻像素间基本关系三、图像增强方法1、直方图求解2、直方图均衡化3、直方图规定化4、图像平滑5、邻域平均法&#xff08;线性&#xff09;6、 中值滤波法&#xff08;分线性&#xff09;7、中值滤波与领域平均的异同8、4-邻域平滑法9、超限像素平滑法10、…

【Linux】yum

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 yum 1. 什么是yum&#xff1f;2. Linux系统(Centos)的生态3. yum的相关操作4. yum的本地配置5. 如何安装软件 1. 什么是yum&#xff1f; yum是一个软件下载安装的一个客户端&a…

逻辑运算

目录 AND OR NOT Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 逻辑运算可以保证连接多个条件&#xff0c;连接主要使用 AND、OR 、NOT完成 AND 1.查询职位不是办事员&#xff0c;但是工资低于 300 的员工信息 这个范例可以理…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

Visual Studio 设置编辑框(即代码编辑器)的背景颜色

在Visual Studio 中设置编辑框&#xff08;即代码编辑器&#xff09;的背景颜色&#xff0c;可以按照以下步骤进行&#xff1a; 打开Visual Studio。在菜单栏上找到并点击“工具”(Tools)选项。在下拉菜单中选择“选项”(Options)。在“选项”对话框中&#xff0c;导航至“环境…