当前位置: 首页 > news >正文

Pytorch+Python实现人体关键点检测

用Python+Pytorch工程代码对人体进行关键点检测和骨架提取,并实现可视化。

使用背景:

物体检测为许多视觉任务提供动力,如实例分割、姿态估计、跟踪和动作识别。它在监控、自动驾驶和视觉答疑中有下游应用。当前的对象检测器通过紧密包围对象的轴向包围框来表示每个对象。然后,他们将目标检测减少到大量潜在目标边界框的图像分类。对于每个边界框,分类器确定图像内容是特定的对象还是背景。

人体关键点检测属于目标检测的一个小分支,在很多虚拟应用场景中需要使用,比如说姿态识别、虚拟穿衣等应用领域。今天给大家推荐一个好用的人体关键点检测项目代码,并基于该代码进行一定的升级,使得提取的人体关键点可以独立显示在可视化界面当中。


使用环境:

本项目通过Python实现,运行环境为:
Python 3.7
Pytorch 1.8.1
Opencv 4.5.4.60


使用代码:

本项目实现基于rwightman的代码进行改进实现,
参考代码地址:https://github.com/rwightman/posenet-python

源代码效果(左图为原图,右图为检测结果图):
在这里插入图片描述

修改后的效果:
在这里插入图片描述


代码使用步骤:

如下的代码都基于参考github链接源码进行直接修改,找到上下行代码参考修改的具体位置。
本代码以源代码视频应用文件举例(webcam_demo.py)

第一步:
在原项目工程代码中找到webcam_demo.py
修改视频获取路径(基于源代码修改):

def main():
    model = posenet.load_model(args.model)
    model = model.cuda()
    output_stride = model.output_stride

    # cap = cv2.VideoCapture(args.cam_id)
    cap = cv2.VideoCapture('3.mp4')
    cap.set(3, args.cam_width)
    cap.set(4, args.cam_height)

    #背景视频读取
    cap2 = cv2.VideoCapture('2.mp4')
    cap2.set(3, args.cam_width)
    cap2.set(4, args.cam_height)

然后在视频显示代码部分添加提取关键点显示界面:

            min_pose_score=0.15, min_part_score=0.1)



        cv2.imshow('posenet', overlay_image)
        # cv2.imshow('net', overlay_image)
        # cv2.resizeWindow('posenet', 500, 900)

        overlay_image2 = posenet.draw_skel_and_kp2(
            display_image2,display_image2, pose_scores, keypoint_scores, keypoint_coords,
            min_pose_score=0.15, min_part_score=0.1)

        cv2.imshow('posenet2', overlay_image2)
        #提取skeleton
        # cv2.namedWindow("dance", 0)
        # cv2.resizeWindow("dance", 600, 900)  # 设置窗口大小
        #
        # cv2.imshow("dance", img)

        frame_count += 1
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    print('Average FPS: ', frame_count / (time.time() - start))

第二步:
修改posenet/utils.py代码部分:
添加提取的骨架的视频背景函数:

#背景视频
def read_cap2(cap, scale_factor=1.0, output_stride=16):
    res2, img2 = cap.read()
    if not res2:
        raise IOError("webcam failure")
    return _process_input2(img2, scale_factor, output_stride)

添加定义骨架关键点绘制函数:

def draw_skel_and_kp2(
        img, img2, instance_scores, keypoint_scores, keypoint_coords,
        min_pose_score=0.1, min_part_score=0.1):        #将置信度由0.5改为0.3

    bk=img2
    out_img = img
    adjacent_keypoints = []
    cv_keypoints = []
    for ii, score in enumerate(instance_scores):
        if score < min_pose_score:
            continue

        new_keypoints = get_adjacent_keypoints(
            keypoint_scores[ii, :], keypoint_coords[ii, :, :], min_part_score)
        adjacent_keypoints.extend(new_keypoints)

        for ks, kc in zip(keypoint_scores[ii, :], keypoint_coords[ii, :, :]):
            if ks < min_part_score:
                continue
            cv_keypoints.append(cv2.KeyPoint(kc[1], kc[0], 10. * ks))

    if cv_keypoints:
        bk = cv2.drawKeypoints(
            bk, cv_keypoints, outImage=np.array([]), color=(255, 255, 0),
            flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    out_img = cv2.polylines(bk, adjacent_keypoints, isClosed=False, color=(255, 255, 0),thickness=20)
    return out_img

然后就能以一个纯粹的骨架关键点样式显示在另一个UI界面啦:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上面用的是段dy的舞蹈视频做demo~


Reference:

1、https://github.com/rwightman/posenet-python
2、Zhou, Xingyi, Dequan Wang, and Philipp Krähenbühl. “Objects as points.” arXiv preprint arXiv:1904.07850 (2019).

相关文章:

  • 【1024】程序员福利
  • Redis产生的问题:在关闭虚拟机退出后重启发生网卡启动失败
  • 浅谈Vue3的优势
  • 如何在Vue+ElementUI项目中使用iconfont图标库
  • Python基础加强学习
  • C语言-简单的程序设计
  • 链队列基本操作
  • 多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---高度控制
  • Python是“真火”还是“虚火”?
  • 为什么要做数据治理以及如何进行数据治理?
  • 那些被渐渐遗忘的python知识点
  • LeetCode16. 最接近的三数之和
  • 外包干了三年,真废了。。。
  • WinLicense 3.1.3.0 Crack
  • 通过Java监听MySQL数据的变化
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • gulp 教程
  • HashMap剖析之内部结构
  • input的行数自动增减
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Less 日常用法
  • markdown编辑器简评
  • Node + FFmpeg 实现Canvas动画导出视频
  • Node 版本管理
  • react-native 安卓真机环境搭建
  • spring boot下thymeleaf全局静态变量配置
  • 对超线程几个不同角度的解释
  • 经典排序算法及其 Java 实现
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端性能优化——回流与重绘
  • 通过几道题目学习二叉搜索树
  • 我的面试准备过程--容器(更新中)
  • 线性表及其算法(java实现)
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 正则表达式
  • 正则表达式小结
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • raise 与 raise ... from 的区别
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #HarmonyOS:基础语法
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (二)PySpark3:SparkSQL编程
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十六)一篇文章学会Java的常用API
  • (四)Linux Shell编程——输入输出重定向
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)