基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

news2024/11/15 11:16:56

目录

前言

1.扩大检测框区域

2.先检测手部,后检测手部关键点

3.正面视角检测

4.侧面视角检测

5.摄像头视角检测

6.遮挡视角检测

7.结论


前言

        使用YOLOv8-m对图像进行手部检测,然后扩大检测框区域,并对该区域使用YOLOv8-s-pose使用关键点检测,实现实时的手部关键点检测。

        实现效果:


1.扩大检测框区域

        参考:基于YOLOv8-pose的手部关键点检测(2)- 模型训练、结果分析和超参数优化

        需要将手部区域放大:2/3 放大框的函数如下,scale=2/3:

def expand_bbox(xyxy, img_width, img_height, scale=0.1):
    # 计算宽度和高度,和中心点
    width = xyxy[2] - xyxy[0]
    height = xyxy[3] - xyxy[1]
    center_x = xyxy[0] + width / 2
    center_y = xyxy[1] + height / 2

    # 增加10%的宽度和高度
    new_width = width * (1 + scale)
    new_height = height * (1 + scale)

    # 计算新的边界框坐标,并确保新的边界框坐标不超过图片的边界
    new_x1 = max(2, int(center_x - new_width / 2))
    new_y1 = max(2, int(center_y - new_height / 2))
    new_x2 = min(int(img_width) - 2, int(center_x + new_width / 2))
    new_y2 = min(int(img_height), int(center_y + new_height / 2))

    return new_x1, new_y1, new_x2, new_y2

2.先检测手部,后检测手部关键点

        关键代码如下,下面结果开始展示容错,因为我把scale错写成了1/3

    frame, _ = resize_image(frame, 720)
    img_height, img_width, _ = frame.shape

    img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    hand_all = det_shou(img)[0]

    for i, bbox in enumerate(hand_all.boxes.xyxy):
        x1, y1, x2, y2 = list(map(int, bbox))
        x11, y11, x22, y22 = expand_bbox(bbox, img_width, img_height, scale=1 / 3)
        conf = hand_all.boxes.conf[i]
        cls = hand_all.boxes.cls[i]
        label = f'{hand_all.names[int(cls)]} {float(conf):.2f}'

        # 绘制边界框和标签
        cv2.rectangle(frame, (x11, y11), (x22, y22), (0, 255, 0), 2)
        cv2.putText(frame, label, (x11, y11 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

        image_shou = frame[y11:y22, x11:x22]
        shou_all = pose_shou(image_shou)[0].cpu().numpy()

        if len(shou_all.boxes.conf) > 0:
            kpts = [list(map(int, shou_all.keypoints.xy[0].reshape(1, 42)[0].tolist()))]

            image_shou = draw_bboxes_and_keypoints(image_shou, shou_all.boxes.xyxy, shou_all.boxes.conf,
                                                   shou_all.boxes.cls,
                                                   kpts=kpts, cat_order=_connections, line_color=line_color)

            frame[y11:y22, x11:x22] = image_shou

    cv2.imshow('Frame', frame)

        以下绿色框表示:YOLOv8的bbox扩大得到的检测框;

        以下红色框表示:YOLOv8-pose的bbox。


3.正面视角检测

        不遮挡,基本都能检测正确。


4.侧面视角检测

        开了二倍速,也可以完美检测,不过在手交叉时候略有检测错误。


5.摄像头视角检测

        慢速下关键点都可以识别准确。


6.遮挡视角检测

        存在遮挡情况下,检测准确度骤降。一方面,一只手被手部检测后,会得到两个检测框(数据集里有两只手交叉的情况,会有两个框重叠)。另一方面,手部关键点数据集没有点的分类,被遮挡点当做不可见点处理。这样无法预测不可见的位置。


7.结论

        非遮挡情况,不存在手部相交,基本都可以识别正确。存在手部相交时,准确率会骤降。

        遮挡情况,可能导致模型几乎不可用,需要加入前处理和后处理。合并最接近相邻手部检测框(即使是两只手也当做一只手来做)。如果一个检测框检测出多只手,只取置信度最大的那只。增加局部区域物品检测,判断是否存在遮挡。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库版本介绍

达梦数据库根据不同用户的不同需求,提供了三种版本的数据库:DM Standard Edition 标准版、DM Enterprise Edition 企业版、DM Security Edition 安全版。那么这三种版本有什么区别,我们该如何选择合适的版本?下面先介绍三种版本各…

【笔记】泰山派环境配置遇到E: Unable to locate package repo

答案来自通义千问,解决了我的问题,做一些记录 你尝试在Ubuntu或Debian系统上使用apt命令安装repo工具,但是遇到了问题,因为repo不是直接在软件源中作为一个独立的包提供的。repo是Google的一个Git仓库管理工具,通常用…

【系统架构设计】系统性能评价(二)

【系统架构设计】系统性能评价(二) 性能指标性能计算性能设计阿姆达尔解决方案负载均衡 性能评估基准测试程序Web 服务器的性能评估 性能指标 性能计算 性能设计 阿姆达尔解决方案 阿姆达尔定律: 系统中对某部件采用某种更快的执行方式&a…

Centos8和stream 9防火墙基本使用

查发行版: [rootlocalhost nps-0.26.10]# cat /etc/redhat-releaseCentOS Stream release 9查看防火墙状态 systemctl status firewalld firewall-cmd --state开启/关闭/重启防火墙 systemctl start firewalld[rootlocalhost conf]# systemctl start firewalld …

Eureka原理与实践:深入探索微服务架构的核心组件

在微服务架构日益盛行的今天,服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka,作为Netflix开源的服务注册与发现框架,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理&…

ubuntu 24.04 安装 Nvidia 显卡驱动 + CUDA + cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会!

ubuntu 24.04 安装 Nvidia 显卡驱动 CUDA cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会! 1.查看本机显卡型号 lspci | grep -i nvidia输出如下: 01:00.0 3D controller: NVIDIA Corporation GM108M [GeForc…

焦虑迷雾中的幻觉挑战?专家教你如何拨云见日!

在这个快节奏、高压力的时代,焦虑症已成为许多人难以言说的秘密。它不仅让人心情沉重,更有可能在极端情况下引发幻觉,仿佛置身于一个光怪陆离、难以分辨真假的世界。面对这样的困境,我们该如何自救,如何找到那束穿透焦…

ansible【自动化配置】(thirty day)

回顾 1、mysql和python (1)不需要执行mysql_ssl_rsa_setup (2)Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql (1)connpymysql.connect(host,user,password,database,prot) …

OpenCV图像处理——积分图像计算(C++/Python)

概述 积分图像是一种高效的图像处理技术,最初由Crow在1984年提出,目的是为了提高多尺度透视投影的渲染速度。它通过构建一个积分图,使得图像中任意矩形区域的像素和能够在常数时间内快速计算出来,极大地减少了在图像模糊、边缘提…

WARNING: There was an error checking the latest version of pip. 解决方案

WARNING: There was an error checking the latest version of pip. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

Vue.js入门系列(十):深入理解Vue指令及自定义指令的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

【技术前沿】MetaGPT入门安装部署——用多个大语言模型解决任务!一键安装,只需填写OpenAI API

项目简介 MetaGPT 是一个多智能体框架,旨在构建全球首家 “AI 软件公司”。该项目通过为 GPT 分配不同的角色,模拟产品经理、架构师、工程师等职业,协同完成复杂的软件开发任务。MetaGPT 将一个简单的需求转化为完整的软件开发流程&#xff…

点接触导致Fluent Meshing网格划分出错的处理

问题概述 在CFD建模中,几何处理有时会出现两个面是单点接触的情形。 举例如下图所示,在球形计算域内部,存在分别用黄色和粉红色标记的内部悬浮面,两者接触区域为一个点,而非一条曲线。 上述几何模型可正确的导入Flue…

从零搭建xxl-job(四):xxljob进行一些性能优化

之前的代码这部分并没有补充完毕,假如调度中心如果判断有定时任务要执行了,该怎么远程通知给执行定时任务的程序呢?当定时任务要把自己的信息发送给调度中心时,是通过一个RegistryParam对象发送的。该对象内部封装了定时任务相关的…

鸿蒙自定义Tab,可居左显示

最近写鸿蒙项目时,需要用到类似Android的TabLayout控件,鸿蒙官方也有提供类似实现的组件Tabs。但是官方Tabs组件,实在有点鸡肋,首先 TabContent和 TabBar是绑定在一起的放在Tabs里面的,如果UI是TabBar的背景是一个整体…

可视化大屏入口界面,炫酷科技又不失简洁时尚。

可视化大屏界面,大家见到很多了,当可视化大屏是多个系统的融合,而且彼此又相互独立,就需要设计一个入口页面,便于分流客户,这次我给大家分享一批。 设计可视化大屏入口界面时,可以结合炫酷科技…

#laravel部署安装报错loadFactoriesFrom是undefined method #

场景: 在git上clone一个项目代码吗laravel版本是5.6 php的版本是7.1 但是运行的时候一直提示错误 Call to undefined method Eachdemo\Rbac\RbacServiceProvider::loadFactoriesFrom() 解决办法: 给RbacServiceProvider,手动添加方…

中国生态地理区划更新和优化

在机器学习或深度学习研究时,建立的模型用于不同地区或时间的数据进行泛化时,其泛化能力往往较差,所以目前在遥感领域用深度学习或机器学习建模时很多文献都是建立分区的模型,即在不同的地理分区内建立模型,泛化时针对…

代码随想录算法训练营第十八天

力扣题部分: 530.二叉搜索树的最小绝对差 题目链接: 题面: 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 思路: 写关于二叉搜索树的问题,一定要先掌握二…