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

2024-01-19 18:04

本文主要是介绍记录::关键点检测数据转化和可视化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 = 0for 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.0elif 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)/imghx =0.5y = 0.5w =1h=1with 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].Timg_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 /= 3joints['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)/imgwy = (y+h/2)/imghw = (w+20)/imgwh = (h+20)/imghwith 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 =0for 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

这篇关于记录::关键点检测数据转化和可视化LSP、FLIC转yolov8-pose的txt的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623229

相关文章

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指