openpose人体姿态估计

2023-11-05

参考博客:Openpose驾驶员危险驾驶检测(抽烟打电话)

人体姿态识别模型—openpose

OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用。
参考:Github开源人体姿态识别项目OpenPose中文文档
OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

openpose模型有:手,脸,人体姿态。如图: 在这里插入图片描述

CoCo人体18点检测-图片

import cv2
import matplotlib.pyplot as plt
#配置文件
protoFile = './models/pose/coco/pose_deploy_linevec.prototxt'  
weightsfile = './models/pose/coco/pose_iter_440000.caffemodel' 
npoints = 18
POSE_PAIRS = [[1,0],[1,2],[1,5],[2,3],[3,4],[5,6],[6,7],[1,8],[8,9],[9,10],[1,11],[11,12],[12,13],[0,14],[0,15],[14,16],[15,17]]
#加载网络
net = cv2.dnn.readNetFromCaffe(protoFile,weightsfile)
#读取图片
im = cv2.imread('kai.jpg')
#(1440*1080)
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
inHeight = im.shape[0]  #1440
inWidth = im.shape[1]   #1080
netInputsize = (368,368)
#转为inpBlob格式
inpBlob = cv2.dnn.blobFromImage(im,1.0/255,netInputsize,(0,0,0),swapRB=True,crop=False)
#归一化后的图片最为输入传入net网络,然后输出
net.setInput(inpBlob)
output = net.forward()  #1*57*46*46


# plt.figure(figsize=(20,10))
# for i in range(npoints):
#     probMap = output[0,i,:,:]  #把18个output[2][3]输出出来  probMap.shape(46*46)
#     displayMap = cv2.resize(probMap,(inWidth,inHeight),cv2.INTER_LINEAR) #1440*1080
#     plt.subplot(3,6,i+1);plt.axis('on');
#     plt.imshow(displayMap,cmap='jet')
# plt.show()


scaleX = float(inWidth) / output.shape[3]    #float(1080)/64 = 23.47826086956522
scaleY = float(inHeight)/ output.shape[2]    #float(1440)/64 = 31.304347826086957
points = []
threshold = 0.1
for i in range(npoints):
    probMap = output[0,i,:,:]  #shape(46*46)
    minVal,prob,minLoc,point =cv2.minMaxLoc(probMap)
    x = scaleX * point[0]
    y = scaleY * point[1]
    if prob > threshold:
        points.append((int(x),int(y)))
    else:
        points.append(None)
    #points[]最后为18个关键点的坐标
    #[(516, 313), (516, 438), (399, 438), (375, 626), (352, 751), (610, 438), (633, 594), (657, 751), (446, 751),
    # (446, 970), (446, 1158), (563, 782), (540, 1001), (540, 1064), (493, 281), (540, 281), (446, 313), (563, 313)]


imPoints = im.copy()
imSkeleton = im.copy()
for i,p in enumerate(points):
    #enumerate把points的值前面带上索引i
    cv2.circle(imPoints,p,8,(255,255,0),thickness=1,lineType=cv2.FILLED)
    cv2.putText(imPoints,'{}'.format(i),p,cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2,lineType=cv2.LINE_AA)
for pair in POSE_PAIRS:
    partA = pair[0]
    partB = pair[1]
    #if points[partA] and points[partB]:
    cv2.line(imSkeleton,points[partA],points[partB],(255, 255,0),2)
    cv2.circle(imSkeleton, points[partA],8,(255,0,0),thickness=-1, lineType=cv2.FILLED)

plt.figure(figsize=(20,10))
plt.subplot(121)
plt.axis('off');plt.imshow(imPoints)
plt.subplot(122)
plt.axis('off');plt.imshow(imSkeleton)
plt.show()

检测结果:
18点姿态检测

CoCo人体18点检测-视频

把上述代码改为由opencv捕获摄像头,实时进行人体姿态检测

import cv2
def detect(img):
    protoFile = './models/pose/coco/pose_deploy_linevec.prototxt'
    weightsfile = './models/pose/coco/pose_iter_440000.caffemodel'
    npoints = 18
    POSE_PAIRS = [[1, 0], [1, 2], [1, 5], [2, 3], [3, 4], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [1, 11], [11, 12],
                  [12, 13], [0, 14], [0, 15], [14, 16], [15, 17]]
    net = cv2.dnn.readNetFromCaffe(protoFile, weightsfile)
    inHeight = img.shape[0]  # 1440
    inWidth = img.shape[1]  # 1080
    netInputsize = (368, 368)
    inpBlob = cv2.dnn.blobFromImage(img, 1.0 / 255, netInputsize, (0, 0, 0), swapRB=True, crop=False)
    net.setInput(inpBlob)
    output = net.forward()

    scaleX = float(inWidth) / output.shape[3]
    scaleY = float(inHeight) / output.shape[2]
    points = []
    threshold = 0.1
    for i in range(npoints):
        probMap = output[0, i, :, :]  # shape(46*46)
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
        x = scaleX * point[0]
        y = scaleY * point[1]
        if prob > threshold:
            points.append((int(x), int(y)))
        else:
            points.append(None)

    for i, p in enumerate(points):
        # enumerate把points的值前面带上索引i
        cv2.circle(img, p, 8, (255, 255, 0), thickness=1, lineType=cv2.FILLED)
        cv2.putText(img, '{}'.format(i), p, cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, lineType=cv2.LINE_AA)


cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    detect(frame)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按‘q’退出
        break

检测结果:
在这里插入图片描述

距离计算

为了检测驾驶员是否存在吸烟和打电话等危险行为,可以计算人体特定关键点之间的距离。
吸烟:右手到鼻子的距离或者左手到鼻子的距离。
打电话:右手到右耳的距离或者左手到左耳的距离。

import math
def __distance(A,B):
    if A is None or B is None:
        return 0
    else:
        return math.sqrt((A[0]-B[0])**2 + (A[1]-B[1])**2)

distance0 =  __distance(points[0],points[4]) #右手到鼻子距离
distance1 =  __distance(points[0],points[7]) #左手到鼻子距离
distance2 =  __distance(points[4],points[16]) #右手到右耳距离
distance3 =  __distance(points[7],points[17]) #左手到左耳距离
print('右手到鼻子距离:',distance0,'左手到鼻子距离:',distance1)
print('右手到右耳距离:',distance2,'左手到左耳距离:',distance3

计算结果

右手到鼻子距离: 467.6964827748868 左手到鼻子距离: 460.135849505339
右手到右耳距离: 447.97321348491363 左手到左耳距离: 447.97321348491363
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openpose人体姿态估计 的相关文章

随机推荐

  • MYSQL服务器在federated引擎下备份还原错误实例

    MYSQL服务器备份还原错误实例 大家好 我是服务器新人 在使用过程中经常出现一些问题 希望各位大神指点一下 感激 我们服务器用的是MYSQL5 0 维护一般用Navicat8 0 有两台主机 192 168 2 2 192 168 2 3
  • Open3D 点云均值滤波

    目录 一 算法原理 1 均值滤波 2 参考文献 二 代码实现 三 结果展示 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 1 均值滤波 对待处理的当前采样点 选择一个模板
  • 区块链能否助力重塑物流业?

    去年年底 就有部分技术人士看准了市场潜力巨大的快递市场 提出 用区块链技术整顿快递行业 的观点 引发热议 那么区块链到底能否拯救快递行业 基于区块链技术具有去中心化 集体维护 高度透明 去信任 匿名 不可篡改 可追溯等显著特点 可以在以下快
  • 【转】do{...}while(0)的意义和用法

    转自 http blogread cn it article 5907 linux内核和其他一些开源的代码中 经常会遇到这样的代码 do while 0 这样的代码一看就不是一个循环 do while表面上在这里一点意义都没有 那么为什么要
  • 2020软件测试工程师面试题汇总(内含答案)-看完BATJ面试官对你竖起大拇指!

    2020最新软件测试面试题汇总 内附参考答案 测试技术面试题 1 什么是兼容性测试 兼容性测试侧重哪些方面 参考答案 兼容测试主要是检查软件在不同的硬件平台 软件平台上是否可以正常的运行 即是通常说的软件的可移植性 兼容的类型 如果细分的话
  • Spring MVC 学习总结(四)——校验与文件上传

    Spring MVC不仅是在架构上改变了项目 使代码变得可复用 可维护与可扩展 其实在功能上也加强了不少 验证与文件上传是许多项目中不可缺少的一部分 在项目中验证非常重要 首先是安全性考虑 如防止注入攻击 XSS等 其次还可以确保数据的完整
  • 【Python基础】python必会的10个知识点

    来源 Towards Data Science 作者 Soner Yildirim 编译 VK Python在数据科学生态系统中占据主导地位 我认为 占据主导地位的两大原因是相对容易学习和数据科学库的丰富选择 Python是一种通用语言 因
  • android main system log,Log中'main', 'system', 'radio', 'events'以及android log分析

    1log文件分类简介 实时打印 的主要有 logcat main logcat radio logcat events tcpdump 还有高通平台的还会有 QXDM 日志 状态信息 的有 adb shell cat proc kmsg a
  • vlan中ACL inbound与outbound详解

    关键字 华为ACL配置 Cisco ACL配置 Vlan ACL配置 ACL一般有两种应用场景 应用到交换机物理端口和应用到Vlan 场景一 应用到交换机物理端口 网络拓扑 PC连接在交换机的Gig0 0 1端口 实现目的 禁止在PC上能够
  • 在python中使用nohup命令说明

    nohup功能 nohup 是 no hang up 的缩写 就是不挂断的意思 如果你正在运行一个进程 而且你觉得在退出帐户时该进程还不会结束 那么可以使用nohup命令 该命令可以在你退出帐户 关闭终端之后继续运行相应的进程 1 代码 n
  • 第七讲:构造函数与析构函数

    第七讲 构造函数与析构函数 本讲基本要求 掌握 构造和析构函数概念 初始化 作用 理解 构造构函的重载 带参数的构造函数两种表达格式 重点 难点 构造和析构函数概念 初始化 作用 通过前两章的学习 我们已经对类和对象有了初步的了解 在本章中
  • python期末复习提纲

    1 注释 变量命名 缩进 2 数据输入字符串函数input 注意结果为字符串 3 字符串解析函数eval的使用 特别注意输入字符串可直接解析为组合数据类型 理解 将字符串类型转化为现有组合类型 list dict set 或现有定义的变量等
  • 01-Embedding层是什么?怎么理解?简单的评论情感分类实验

    文章目录 1 One hot编码 2 Embedding 3 语义理解中Embedding意义 4 文本评论 代码实验 1 One hot编码 要知道embedding的作用 首先要了解独热编码 one hot 假设现在有如下对应关系 那么
  • 2016年下半年信息安全工程师上午选择题及解析

    以下有关信息安全管理员职责的叙述 不正确的是 A 信息安全管理员应该对网络的总体安全布局进行规划 B 信息安全管理员应该对信息系统安全事件进行处理 C 信息安全管理员应该负责为用户编写安全应用程序 D 信息安全管理员应该对安全设备进行优化配
  • SSM基本系统架构设计(Spring、Spring MVC 、MyBatis)

    系统根据功能的不同 项目结构可以划分为以下几个层次 1 持久对象层 也称持久层或持久化层 该层由若干持久化类 实体类 组成 2 数据访问层 DAO 层 该层由若干DAO 接口和MyBatis 映射文件组成 接口的名称统一以Dao 结尾 且M
  • 总汇nexus 服务启动异常

    总汇nexus 服务启动异常 故障描述1 故障描述2 故障描述3 备份准备修复的数据库 故障描述1 nexus oss 3 一直运行得没什么问题 忽然发现运行特别慢然后到服务器去重启 莫名其妙一直启动失败 查看日志发现如下报错信息 2022
  • C51单片机晶振频率、时钟周期、状态周期、机器周期、指令周期和总线周期的关系

    一 晶振频率 1 英文全称 frequency oscillate 2 定义 晶体振荡器的固有频率 不能改变 3 如果外接12Mhz晶振 则晶振频率12Mhz 二 时钟周期 1 英文全称 Clock Cycle 为晶振频率12Mhz倒数 2
  • 面试题computed和watch的区别

    computed和watch的区别 1 英文翻译成中文 computed就是计算属性的意思 是用来计算出一个值的 这个值 我们在调用的时候 1 不需要加括号 2 根据依赖缓存 watch就是监听的意思 1 immediat表示是否第一次执行
  • Prometheus on k8s 部署与实战操作进阶篇

    文章目录 一 概述 二 常见的几款监控工具 1 kube prometheus 和 kube prometheus stack 区别 2 Prometheus Operator 和kube prometheus 或 kube prometh
  • openpose人体姿态估计

    参考博客 Openpose驾驶员危险驾驶检测 抽烟打电话 人体姿态识别模型 openpose OpenPose人体姿态识别项目是美国卡耐基梅隆大学 CMU 基于卷积神经网络和监督学习并以caffe为框架开发的开源库 可以实现人体动作 面部表