基于 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

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj