YOLOv7姿态估计pose estimation(姿态估计-目标检测-跟踪)

news/2024/7/10 2:33:53 标签: YOLO, 目标检测, 目标跟踪

YOLOv7姿态估计(pose estimation)是一种基于YOLOv7算法的姿态估计方法。该算法使用深度学习技术,通过分析图像中的人体关键点位置,实现对人体姿态的准确估计。

姿态估计是计算机视觉领域的重要任务,它可以识别人体的关节位置和姿势,从而为人体行为分析、动作识别、运动捕捉等应用提供基础支持。YOLOv7姿态估计算法通过端到端的训练和推理过程,能够快速、准确地检测和估计人体的姿态信息。

YOLOv7姿态估计算法的核心思想是将姿态估计问题转化为目标检测问题。它使用YOLOv7网络结构进行图像的目标检测,并在检测到的人体目标上进行关键点定位。通过预测人体关键点的位置,可以进一步计算出人体的姿态信息。

与传统的姿态估计方法相比,YOLOv7姿态估计算法具有以下优势:首先,它采用了YOLOv7的快速检测器,能够在保持高准确率的同时实现实时的姿态估计。其次,它使用了端到端的训练和推理过程,减少了传统方法中的多个阶段和复杂的流程,简化了算法的实现和应用。

YOLOv7姿态估计算法在人体姿态估计领域取得了显著的成果,并在一些人体行为分析、动作识别等应用中得到了广泛应用。它为计算机视觉领域的研究者和开发者提供了一种高效、准确的姿态估计解决方案。

总之,YOLOv7姿态估计是一种基于YOLOv7算法的快速、准确的姿态估计方法。它通过图像中的目标检测和关键点定位,实现对人体姿态的精确估计。该方法在计算机视觉领域有着广泛的应用前景,并为相关领域的研究和开发提供了重要的技术支持。

概述

YOLOv7姿态估计:一种快速准确的人体姿态估计模型

人体姿态估计是计算机视觉中的一项重要任务,具有各种应用,例如动作识别、人机交互和监控。近年来,基于深度学习的方法在人体姿态估计方面取得了显著的性能。其中最流行的深度学习方法之一是YOLOv7姿态估计模型。

算法

YOLOv7姿态估计模型是YOLOv7目标检测模型的扩展,使用单个神经网络同时预测图像中多个物体的边界框和类别概率。在YOLOv7姿态估计模型中,网络预测每个人的关键点位置,从而可以用于估计人的姿态

网络

YOLOv7姿态估计模型基于深度卷积神经网络架构,由多个卷积层、最大池化和全连接层组成。网络接受输入图像并产生特征图,然后用于预测每个人的关键点位置。

 

数据集

YOLOv7姿态估计模型使用大型数据集进行训练,例如COCO(通用对象上下文)和MPII(马克斯·普朗克计算机科学研究所),这些数据集包含成千上万的人在各种姿势和环境中的注释图像。该模型使用监督学习和数据增强技术进行训练,例如随机缩放、旋转和平移输入图像。

 

优势

YOLOv7姿态估计模型的一个关键优势是其速度和准确性。该模型能够实时估计多个人的姿态,使其适用于人机交互和监控等应用。此外,该模型在COCO和MPII等基准数据集上实现了最先进的性能,展示了其准确性和鲁棒性。

结论


总之,YOLOv7姿态估计模型是一种快速准确的基于深度学习的人体姿态估计模型。其能够实时估计多个人的姿态,使其适用于各种应用,而其在基准数据集上的最先进性能证明了其有效性。随着深度学习的不断发展,我们可以预期在人体姿态估计方面会有进一步的改进,而YOLOv7姿态估计模型很可能在这些发展中发挥重要作用。

代码 
#全部代码可私信或者qq1309399183
def run(poseweights="yolov7-w6-pose.pt",source="football1.mp4",device='cpu',view_img=False,
        save_conf=False,line_thickness = 3,hide_labels=False, hide_conf=True):

    frame_count = 0  #count no of frames
    total_fps = 0  #count total fps
    time_list = []   #list to store time
    fps_list = []    #list to store fps
    
    device = select_device(opt.device) #select device
    half = device.type != 'cpu'

    model = attempt_load(poseweights, map_location=device)  #Load model
    _ = model.eval()
    names = model.module.names if hasattr(model, 'module') else model.names  # get class names
   
    if source.isnumeric() :    
        cap = cv2.VideoCapture(int(source))    #pass video to videocapture object
    else :
        cap = cv2.VideoCapture(source)    #pass video to videocapture object
   
    if (cap.isOpened() == False):   #check if videocapture not opened
        print('Error while trying to read video. Please check path again')
        raise SystemExit()

    else:
        frame_width = int(cap.get(3))  #get video frame width
        frame_height = int(cap.get(4)) #get video frame height

        
        vid_write_image = letterbox(cap.read()[1], (frame_width), stride=64, auto=True)[0] #init videowriter
        resize_height, resize_width = vid_write_image.shape[:2]
        out_video_name = f"{source.split('/')[-1].split('.')[0]}"
        out = cv2.VideoWriter(f"{source}_keypoint.mp4",
                            cv2.VideoWriter_fourcc(*'mp4v'), 30,
                            (resize_width, resize_height))

        while(cap.isOpened): #loop until cap opened or video not complete
        
            print("Frame {} Processing".format(frame_count+1))

            ret, frame = cap.read()  #get frame and success from video capture
            
            if ret: #if success is true, means frame exist
                orig_image = frame #store frame
                image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB) #convert frame to RGB
                image = letterbox(image, (frame_width), stride=64, auto=True)[0]
                image_ = image.copy()
                image = transforms.ToTensor()(image)
                image = torch.tensor(np.array([image.numpy()]))
            
                image = image.to(device)  #convert image data to device
                image = image.float() #convert image to float precision (cpu)
                start_time = time.time() #start time for fps calculation
            
                with torch.no_grad():  #get predictions
                    output_data, _ = model(image)

                output_data = non_max_suppression_kpt(output_data,   #Apply non max suppression
                                            0.25,   # Conf. Threshold.
                                            0.65, # IoU Threshold.
                                            nc=model.yaml['nc'], # Number of classes.
                                            nkpt=model.yaml['nkpt'], # Number of keypoints.
                                            kpt_label=True)
            
                output = output_to_keypoint(output_data)

                im0 = image[0].permute(1, 2, 0) * 255 # Change format [b, c, h, w] to [h, w, c] for displaying the image.
                im0 = im0.cpu().numpy().astype(np.uint8)
                
                im0 = cv2.cvtColor(im0, cv2.COLOR_RGB2BGR) #reshape image format to (BGR)
                gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh

                for i, pose in enumerate(output_data):  # detections per image
                
                    if len(output_data):  #check if no pose
                        for c in pose[:, 5].unique(): # Print results
                            n = (pose[:, 5] == c).sum()  # detections per class
                            print("No of Objects in Current Frame : {}".format(n))
                        
                        for det_index, (*xyxy, conf, cls) in enumerate(reversed(pose[:,:6])): #loop over poses for drawing on frame
                            c = int(cls)  # integer class
                            kpts = pose[det_index, 6:]
                            label = None if opt.hide_labels else (names[c] if opt.hide_conf else f'{names[c]} {conf:.2f}')
                            plot_one_box_kpt(xyxy, im0, label=label, color=colors(c, True), 
                                        line_thickness=opt.line_thickness,kpt_label=True, kpts=kpts, steps=3, 
                                        orig_shape=im0.shape[:2])

环境安装教程

#1.克隆项目并进入

#联系我:然后git clone my_projcet

 2.linux创建虚拟环境

python3 -m venv psestenv
source psestenv/bin/activate

3.如果windows用户请用这个:

python3 -m venv psestenv cd psestenv 
cd Scripts activate 
cd .. 
cd .. 
 pip install --upgrade pip

4.

  1. pip install
pip install -r requirements.txt

结果展示

更多视觉相关项目见专栏!。如果对你有用,欢迎私聊点赞交流

 

 


http://www.niftyadmin.cn/n/5345099.html

相关文章

React进阶 - 13(说一说 React 中的虚拟 DOM)

本章内容 目录 一、为什么需要”虚拟DOM“二、虚拟 DOM“ 带来的希望三、虚拟 DOM“ 的优势(性能大幅度提升 & 跨端应用) 上一节我们讲了 state、props与render函数的关系,本节内容开始了解 React中的”虚拟 DOM“ 相关知识。 一、为什…

node 第二十三天 mongoDB shell 命令 CRUD 增删改查 基础

什么是 mongoDB shell 命令 mongoDB shell 命令就是在cmd窗口或者powershell窗口与mongoDB交互的命令, 以下简称mongosh 对应我们上一天安装的 mongosh 工具 有什么用 mongosh 对一般的开发者可能意义不大, 因为在开发过程中我们会基于某一款语言来使用mongoDB, 比如在node端我…

android gradle 使用总结

一 buildscript buildscript:这里面的声明(repositories,dependencies)是 gradle脚本自身需要使用的资源,会优先加载, 而外面的声明(repositories,dependencies)是项目…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…

即时设计好用吗?即时设计都有什么优势?

即时设计是否易于使用?即时设计有哪些易于使用的功能?假如你在寻找一个免费的Sketch 或者网页版本 PS,那么「即时设计」这是个不错的选择。这个云端 UI 设计工具允许您在不占用计算机内存的情况下使用任何设备。它可以快速存储您的设计文件&a…

酷开科技 | 酷开系统全能基因 融合架构更多精彩

智能电视和智能电视操作系统早已不是新鲜事物,随着人们对智能电视的使用需求越来越多,一些消费者开始了探索电视的更多可能性,酷开科技通过对消费者群体的调研将酷开系统进行了创造性的升级,更强大的功能,让我们深切的…

# Java NIO(一)FileChannel

Java NIO 1.BIO与NIO的区别 BIO为阻塞IO,NIO为非阻塞IO。 BIONIOJAVA1.4之前Java 1.4之后面向流:以byte为单位处理数据面向块:以块为单位处理数据同步阻塞同步非阻塞无选择器(Selector) 1.1NIO的核心组成部分 Cha…

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料…