点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

OpenCV DNN模块介绍

OpenCV自从发布了DNN模块之后,就开始以开挂的方式支持各种深度学习预训练模型的调用,DNN模块的全称为深度神经网络,但是并不是所有深度学习模型导出到OpenCV DNN模块中都可以使用,只有那些OpenCV声明支持的层与网络模型才会被DNN模块接受,当期OpenCV支持的模型与层类型可以在下面链接中找到相关文档

https://github.com/opencv/opencv/wiki/Deep-Learning-in-OpenCV

模型下载

OpenCV3.4.x的版本开始支持在OpenCV DNN模块中使用openopse的深度学习模型,实现人体单人姿态评估, 首先需要下载人体姿态评估的预训练模型。基于COCO数据集训练的模型下载地址如下:

http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel

基于MPI数据集训练的模型下载地址如下:

http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/mpi/pose_iter_160000.caffemodel

代码实现

下面只需要如下几步就可以实现基于OpenCV的单人姿态评估:

1.定义COCO数据集支持的18点人体位置与关系位置

BODY_PARTS = { "Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,"LEye": 15, "REar": 16, "LEar": 17, "Background": 18 }POSE_PAIRS = [ ["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"] ]

2.定义MPI数据集支持的15点人体位置与关系位置

BODY_PARTS = { "Head": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "Chest": 14,"Background": 15 }POSE_PAIRS = [ ["Head", "Neck"], ["Neck", "RShoulder"], ["RShoulder", "RElbow"],["RElbow", "RWrist"], ["Neck", "LShoulder"], ["LShoulder", "LElbow"],["LElbow", "LWrist"], ["Neck", "Chest"], ["Chest", "RHip"], ["RHip", "RKnee"],["RKnee", "RAnkle"], ["Chest", "LHip"], ["LHip", "LKnee"], ["LKnee", "LAnkle"] ]

3.根据不同数据集调用DNN模块加载指定的预训练模型

inWidth = 368
inHeight = 368
thr = 0.1
protoc = "D:/projects/pose_body/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
model = "D:/projects/pose_body/mpi/pose_iter_160000.caffemodel"
net = cv.dnn.readNetFromCaffe(protoc, model)

4.调用OpenCV打开摄像头

cap = cv.VideoCapture(0)
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
width = cap.get(cv.CAP_PROP_FRAME_WIDTH)

5.使用前馈网络模型预测

frameWidth = frame.shape[1]
frameHeight = frame.shape[0]
inp = cv.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),(0, 0, 0), swapRB=False, crop=False)
net.setInput(inp)
out = net.forward()

6.绘制检测到人体姿态关键点位置

points = []
for i in range(len(BODY_PARTS)):# Slice heatmap of corresponging body's part.heatMap = out[0, i, :, :]# Originally, we try to find all the local maximums. To simplify a sample# we just find a global one. However only a single pose at the same time# could be detected this way._, conf, _, point = cv.minMaxLoc(heatMap)x = (frameWidth * point[0]) / out.shape[3]y = (frameHeight * point[1]) / out.shape[2]# Add a point if it's confidence is higher than threshold.points.append((x, y) if conf > thr else None)for pair in POSE_PAIRS:partFrom = pair[0]partTo = pair[1]assert(partFrom in BODY_PARTS)assert(partTo in BODY_PARTS)idFrom = BODY_PARTS[partFrom]idTo = BODY_PARTS[partTo]if points[idFrom] and points[idTo]:x1, y1 = points[idFrom]x2, y2 = points[idTo]cv.line(frame, (np.int32(x1), np.int32(y1)), (np.int32(x2), np.int32(y2)), (0, 255, 0), 3)cv.ellipse(frame, (np.int32(x1), np.int32(y1)), (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)cv.ellipse(frame, (np.int32(x2), np.int32(y2)), (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)

完整的代码如下:

import cv2 as cv
import numpy as npdataset = 'MPI'
if dataset == 'COCO':BODY_PARTS = { "Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,"LEye": 15, "REar": 16, "LEar": 17, "Background": 18 }POSE_PAIRS = [ ["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"] ]
else:assert(dataset == 'MPI')BODY_PARTS = { "Head": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "Chest": 14,"Background": 15 }POSE_PAIRS = [ ["Head", "Neck"], ["Neck", "RShoulder"], ["RShoulder", "RElbow"],["RElbow", "RWrist"], ["Neck", "LShoulder"], ["LShoulder", "LElbow"],["LElbow", "LWrist"], ["Neck", "Chest"], ["Chest", "RHip"], ["RHip", "RKnee"],["RKnee", "RAnkle"], ["Chest", "LHip"], ["LHip", "LKnee"], ["LKnee", "LAnkle"] ]inWidth = 368
inHeight = 368
thr = 0.1
protoc = "D:/projects/pose_body/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
model = "D:/projects/pose_body/mpi/pose_iter_160000.caffemodel"
net = cv.dnn.readNetFromCaffe(protoc, model)cap = cv.VideoCapture(0)
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
video_writer = cv.VideoWriter("D:/pose_estimation_demo.mp4", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15, (640, 480), True)
while cv.waitKey(1) < 0:hasFrame, frame = cap.read()if not hasFrame:cv.waitKey()breakframeWidth = frame.shape[1]frameHeight = frame.shape[0]inp = cv.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),(0, 0, 0), swapRB=False, crop=False)net.setInput(inp)out = net.forward()print(len(BODY_PARTS), out.shape[0])# assert(len(BODY_PARTS) == out.shape[1])points = []for i in range(len(BODY_PARTS)):# Slice heatmap of corresponging body's part.heatMap = out[0, i, :, :]# Originally, we try to find all the local maximums. To simplify a sample# we just find a global one. However only a single pose at the same time# could be detected this way._, conf, _, point = cv.minMaxLoc(heatMap)x = (frameWidth * point[0]) / out.shape[3]y = (frameHeight * point[1]) / out.shape[2]# Add a point if it's confidence is higher than threshold.points.append((x, y) if conf > thr else None)for pair in POSE_PAIRS:partFrom = pair[0]partTo = pair[1]assert(partFrom in BODY_PARTS)assert(partTo in BODY_PARTS)idFrom = BODY_PARTS[partFrom]idTo = BODY_PARTS[partTo]if points[idFrom] and points[idTo]:x1, y1 = points[idFrom]x2, y2 = points[idTo]cv.line(frame, (np.int32(x1), np.int32(y1)), (np.int32(x2), np.int32(y2)), (0, 255, 0), 3)cv.ellipse(frame, (np.int32(x1), np.int32(y1)), (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)cv.ellipse(frame, (np.int32(x2), np.int32(y2)), (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)t, _ = net.getPerfProfile()freq = cv.getTickFrequency() / 1000cv.putText(frame, '%.2fms' % (t / freq), (10, 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))# video_writer.write(frame);# cv.imwrite("D:/pose.png", frame)cv.imshow('OpenPose using OpenCV', frame)

运行结果如下:

好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

教程 | OpenCV深度神经网络实现人体姿态评估相关推荐

  1. OpenCV深度神经网络实现人体姿态评估

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 OpenCV DNN模块介绍 OpenCV自从发布了DNN模块之后 ...

  2. 深度学习之人体姿态估计在医疗领域的作用

    深度学习之人体姿态估计在医疗中的应用 摘要 目前基于深度学习的人体姿态估计的方法在一定的训练集上都取得不错的效果,将人体姿态估计应用于医疗当中有利于目前医疗体系的进步和医疗手段的改进.本文将介绍人体姿 ...

  3. Azure Kinect 3深度相机开发--人体姿态估计并输出各个关节点坐标

    Azure Kinect 3深度相机开发--人体姿态估计并输出各个关节点坐标 前言 一.VS配置Azure Kinect 3开发环境(C++) 1.下载并安装Azure Kinect3 SDK 2.配 ...

  4. 基于3D深度视觉的人体姿态估计算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 人体姿态估计是当前计算机视觉领域的热点研究问 ...

  5. MediaPipe 集成人脸识别,人体姿态评估,人手检测模型

    上期文章,我们介绍了MediaPipe Holistic的基础知识,了解到MediaPipe Holistic分别利用MediaPipe Pose,MediaPipe Face Mesh和MediaP ...

  6. 卷积神经网络精确率不增反降_姿态跟踪论文研读--(1)利用卷积神经网络学习人体姿态估计特征...

    摘要 本文介绍了一种新的结构,就是利用多层卷积神经网络结构和模块化学习技术来习得低维特征和高维弱空间模型,以此来进行人体姿态估计.无约束的人体姿态估计是计算机视觉领域中最困难,最棘手的问题之一,而我们 ...

  7. 深度学习3D 人体姿态估计面临的问题和挑战

    在 3D 人体姿态估计中,学者们致力于研究基于单目 RGB 视频的 3D 人体姿态估计,这是因为目前单目 RGB 摄像头应用广泛.价格低廉,在人们日常使用的手机.电脑均配备有摄像头,因此该技术有着广大 ...

  8. 人体姿态估计-DeepPose

    基于深度神经网络的人体姿态估计算法--DeepPose 文章目录 基于深度神经网络的人体姿态估计算法--DeepPose 参考 简介 关键点坐标的表示方式 网络结构 Initial Stage Cas ...

  9. 深度学习和目标检测系列教程 22-300:关于人体姿态常见的估计方法

    @Author:Runsen 姿态估计是计算机视觉中的一项流行任务,比如真实的场景如何进行人体跌倒检测,如何对手语进行交流. 作为人工智能(AI)的一个领域,计算机视觉使机器能够以模仿人类视觉为目的来 ...

最新文章

  1. 简单粗暴的canvas图片压缩
  2. 皮一皮:所以说女生的好奇心不能太大...
  3. php导出excel2007实例,PHPExcel精简版与导入导出案例
  4. 程序员面试题精选100题(62)-C/C++/C#面试题(5)
  5. lftp压缩对方服务器文件,lftp 贴心好友 备份服务器bash脚本
  6. PL/SQL块结构和组成元素
  7. Android NDK 使用第三方静态库(转)
  8. ​做安全操作系统,这位技术老兵是认真的!
  9. 联想y470上三代cpu_AMD三代线程撕裂者首测 单核不再是问题(二)
  10. 让画面更逼真!这个强化超分辨率GAN让老游戏迎来第二春 | 代码+论文+游戏MOD...
  11. chrome webstore
  12. 这是一篇优雅的Springboot2.0使用手册 1
  13. 银河麒麟Linux系统安装谷歌浏览器
  14. 女朋友都看得懂的服务器搭建(纯小白超详细图文教程,阿里云服务器搭建)
  15. c++学习记录之多态
  16. 红孩儿编辑器的模块设计5
  17. 计算机学院优秀老师颁奖词,给老师的颁奖词
  18. 卷积神经网络demo
  19. springboot以FTP方式上传文件到远程服务器
  20. java enum compare_Java中枚举类型

热门文章

  1. “学了半年后,我要揭开Python 3宗罪!”
  2. 75道常见AI面试题,看看你的知识盲点在哪?(附解析)
  3. 十大经典排序算法动画与解析,看我就够了
  4. 帮AI摆脱“智障”之名,NLP这条路还有多远?
  5. 微软、商汤等专家纵论AI未来:三年内主要趋势及挑战是什么?
  6. 100万年薪只是起步价!跨境AI人才遭疯抢后最终去了哪儿?
  7. ElasticSearch 面试 4 连问,你顶得住么?
  8. 今晚带你真正认识Linux 系统结构
  9. 再见,Navicat!同事安利的这个IDEA的兄弟,真香!
  10. 因为这个工具,我在 GitHub 搜索源码的时间缩短了 50%!