基于 YOLOv8n-pose 模型的图像特征提取,可用于识别特定的姿态

2024-08-23 14:44

本文主要是介绍基于 YOLOv8n-pose 模型的图像特征提取,可用于识别特定的姿态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. __init__ 方法:初始化类的实例

2. save_pose_feat 方法:

3. load_db_pose_feat 方法:

4. cal_similarity 方法:


实现了一个基于 YOLOv8n-pose 模型的图像特征提取和相似性比较系统。它可以从图像中提取人体关键点信息,并将其保存为特征文件。然后,通过计算输入图像与数据库中图像特征的相似度,确定输入图像的类别。

1. __init__ 方法:初始化类的实例

加载 YOLOv8n-pose 模型并加载数据库中的姿态特征。
load_model 方法:加载 YOLOv8n-pose 模型。

 def load_model(self):model=YOLO('yolov8n-pose.pt')return model


extract_fact 方法:从输入图像中提取特征,包括目标框的坐标和人体关键点的归一化坐标。相当于是17个点相对于特定的框的位置做了归一化

    def extract_fact(self,img_path):list=[]result=self.model(img_path)x1,y1,x2,y2,conf,cls=result[0].boxes.data[0]x1,y1,x2,y2=x1.item(),y1.item(),x2.item(),y2.item()for x_y in result[0].keypoints.xy[0]:x,y=x_yx=x.item()y=y.item()x=(x-x1)/(x2-x1)y=(y-y2)/(y1-y2)list.append(x)list.append(y)# print(list)return list


2. save_pose_feat 方法:

从指定目录下的图像中提取姿态特征,并保存到文本文件中。

 def save_pose_feat(self):img_paths=glob.glob('image_arm\*\*')with open('feature.txt','w',encoding='utf-8') as f:for img_path in img_paths:img_name=img_path.split('\\')[-2]+' 'list=self.extract_fact(img_path)f.write(img_name)list=str(list)f.write(list)f.write('\n')


3. load_db_pose_feat 方法:

从保存的特征文件中加载数据库中的图像名称和特征。

    def load_db_pose_feat(self):with open('feature.txt','r',encoding='utf-8') as f:lines=f.readlines()db_names=[]db_features=[]for line in lines:db_name=line.split(' ')[0]db_feature=line.split(' ',1)[1]db_feature=json.loads(db_feature)db_names.append(db_name)db_features.append(db_feature)return db_names,db_features


4. cal_similarity 方法:

计算输入图像与数据库中图像特征的相似度,并确定输入图像的类别。

 如果找出来最相似的三张图片是一样的,那么就可以成功预测出来

 def cal_similarity(self,img_path):#计算相似度db_names,db_features=self.db_names,self.db_featuresdb_names=np.array(db_names)my_feature=self.extract_fact(img_path)db_features=np.array(db_features)my_feature=np.array(my_feature)dist=np.linalg.norm(my_feature-db_features,axis=1)stack_dist_name=np.column_stack((dist,db_names))sort_index=np.argsort(stack_dist_name[:,0])top3=stack_dist_name[sort_index][:3][:,1]top1=top3[0]count=0for i in top3[1:]:if i==top1:count+=1if count==2:print('类别是',top1)else:print('啥也不是')print()

完整代码如下:

import glob
import json
import osimport cv2
import numpy as np
from ultralytics import YOLO
class FrameFeat:def __init__(self):self.model=self.load_model()self.db_names,self.db_features=self.load_db_pose_feat()def load_model(self):model=YOLO('yolov8n-pose.pt')return modeldef extract_fact(self,img_path):list=[]result=self.model(img_path)x1,y1,x2,y2,conf,cls=result[0].boxes.data[0]x1,y1,x2,y2=x1.item(),y1.item(),x2.item(),y2.item()for x_y in result[0].keypoints.xy[0]:x,y=x_yx=x.item()y=y.item()x=(x-x1)/(x2-x1)y=(y-y2)/(y1-y2)list.append(x)list.append(y)# print(list)return listdef save_pose_feat(self):img_paths=glob.glob('image_arm\*\*')with open('feature.txt','w',encoding='utf-8') as f:for img_path in img_paths:img_name=img_path.split('\\')[-2]+' 'list=self.extract_fact(img_path)f.write(img_name)list=str(list)f.write(list)f.write('\n')def load_db_pose_feat(self):with open('feature.txt','r',encoding='utf-8') as f:lines=f.readlines()db_names=[]db_features=[]for line in lines:db_name=line.split(' ')[0]db_feature=line.split(' ',1)[1]db_feature=json.loads(db_feature)db_names.append(db_name)db_features.append(db_feature)return db_names,db_featuresdef cal_similarity(self,img_path):#计算相似度db_names,db_features=self.db_names,self.db_featuresdb_names=np.array(db_names)my_feature=self.extract_fact(img_path)db_features=np.array(db_features)my_feature=np.array(my_feature)dist=np.linalg.norm(my_feature-db_features,axis=1)stack_dist_name=np.column_stack((dist,db_names))sort_index=np.argsort(stack_dist_name[:,0])top3=stack_dist_name[sort_index][:3][:,1]top1=top3[0]count=0for i in top3[1:]:if i==top1:count+=1if count==2:print('类别是',top1)else:print('啥也不是')print()if __name__ == '__main__':img_path=r'D:\AI_37\ultralytics-8.2.74\ultralytics\pos-detect\img_1.png'ff=FrameFeat()# ff.extract_fact(img_path)# ff.save_pose_feat()ff.load_db_pose_feat()ff.cal_similarity(img_path) 

数据的格式如下 

 

 

这篇关于基于 YOLOv8n-pose 模型的图像特征提取,可用于识别特定的姿态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加