作者|李秋键

出品|AI科技大本营(ID:rgznai100)

引言

伴随着计算机视觉的发展和在生活实践中的广泛应用,基于各种算法的行为检测和动作识别项目在实践中得到了越来越多的应用,并在相关领域得到了广泛的研究。在行为监测方面,不仅仅有通过图形、温湿度、声音等信息进行蜂群行为的监测,同时更多的应用是集中在人类行为监测上。而人体姿态识别作为行为监测重要参考依据在视频捕捉、计算机图形学等领域得到了广泛应用。其中传统的人体姿态识别方法有RMPE模型和Mask R-CNN模型,它们都是采用自顶向下的检测方法,而Openpose作为姿态识别的经典项目是采用的自底向上的检测方法,主要应用于行为监测、姿态纠正、动作分类,在智能家居、自动驾驶、智能监控等领域局具有重要的研究意义和应用价值。

在多人目标姿态识别方面,历史上常见的方法有通过自顶而下的候选关键点查找并结合空间联系优化算法匹配人物以及通过建立部分亲和字段的方法实现关键点检测到人体骨架连接等等。

本项目针对当前行为监测中的精度不足、效率较低等问题,结合了openpose的姿态识别技术通过不同肢体之间的协调关系来搭建分类算法,并通过不同的分类算法比较,选择出最优模型搭建多目标的分类方法,最终可以实现多个目标的姿态显示、目标检测和分类的实时显示。在此次的模型中通过调用轻量级的openpose模型进行人体姿态识别,其主要的方法是通过openpose获取人体各个骨骼关键点位置,然后通过欧氏距离进行匹配两个骨骼来具体检测到每一个人,对于常见检测中骨骼关键点的缺失可以通过上一帧的骨骼信息进行填充。

其最终实现效果如下图可见:

系统组成

系统运行的基本流程:

1、利用openpose遍历数据集下不同分类下的人物的姿态信息进行提取作为动作特征并保存为对应的TXT文档。

2、将提取的特征信息和对应的图片对应起来整合在一个TXT文件中。

3、整合TXT信息分别为输入和输出标签csv文件。

4、模型训练部分分别使用不同分类算法达到训练的效果。

1.1 Openpose环境的构建

openpose是依赖于卷积神经网络和监督学习实现人体姿态评估算法,其主要的优点在于适用于多人二维且较为精准和迅速的识别开源模型。

整个多目标动作监测系统的搭建主要是依赖于openpose的姿态识别环境。而openpose的基本环境依赖于python,CUDA和swig的支持,其中python是作为openpose的代码编写和运行工具,CUDA作为调用显卡训练测试的必须软件需要和python版本有一定的关系,swig目的在于给openpose编译环境。根据openpose官方提供的cmu模型、mobilenet_thin模型、mobilenet_v2_large模型和mobilenet_v2_small模型的评价,我们选择了cmu模型作为姿态识别的调用模型,主要原因在于cmu具有更高一些的识别精度。

Openpose的调用在这里通过调用其中设定好的主函数即可,其中包括模型加载程序、调用程序以及Estimator评估等等。

本文共设定站立、行走、奔跑、跳动、坐下、下蹲、踢腿、出拳、挥手等行为标签,每类行为通过摄像头采集相关视频,并将视频分帧成多张图片,由不同的照片组合形成了不同动作,将其中的姿态特征利用openpose提取作为完整动作的基本识别特征,并将其中的信息整合到txt文件中。其中提取的部分分别包括鼻子、脖子、左右肩、左右手腕、左右膝盖等等。

1.2 数据和特征的处理

数据处理的第一步是将采集到的图片放入openpose骨架提取网络进行提取行人的关键点坐标数据,并将不同分类下的人物的姿态信息进行提取作为动作特征并保存为对应的TXT文档。然后进行特征的整合:将提取的特征信息和对应的图片对应起来整合在一个TXT文件中,同时去除无用的多余数据集。最后整合TXT信息分别作为输入和输出标签csv文件。

其中输入的特征既包含关键点的特征,同时也包括不同骨骼点连接的线特征,以及不同线之间组合形成的面特征。而这些提取的特征将通过下述设定好的分类算法进行提取和学习。

1.3 机器算法设计(简易版本)

首先是特征的提取,利用openpose遍历数据集下不同分类下的人物的姿态信息进行提取作为动作特征并保存为对应的TXT文档。然后进行特征的整合:将提取的特征信息和对应的图片对应起来整合在一个TXT文件中,同时去除无用的多余数据集。最后整合TXT信息分别作为输入和输出标签csv文件。

将从输入端csv读取的人体骨骼信息作为输入,Y标签的csv文件作为输出,按照0.3的比例划分训练集和验证集,并转为numpy矩阵参与运算。其中模型分类器的选择主要按照决策树、随机森林、神经网络和支持向量机进行测试模型效果。模型的评估则主要根据混淆矩阵、精准率、召回率和F1得分进行评估。

1、支持向量机SVM分类器:

SVM是机器学习领域常用的有监督学习模型,常用来进行分类和回归。它是基于结构风险最小化理论建立模型,而达到学习器的全局最优化结果,主要是被用来分析线性可分的情况。参数选择问题作为支持向量机中的一个复杂优化问题,主要目的是求解超参数的最优解,即计算出最佳超平面,这个超平面是将平面分成两部分,其中每一级都位于两侧,在这里通过设定核函数来达到优化参数的目的。

在这里直接调用sklearn框架中搭建好的分类器进行训练,其中设置核函数为线性核函数。惩罚系数C为10,这个惩罚系数的设定一般来说这个系数设置的越大,容错性也就相对小一些,分隔空间的硬度也就更强。

2、决策树Decision Tree分类器:

决策树作为监督学习算法中的常见算法,是属于非参数学习的算法,常常被应用于多分类和回归问题中。它主要是通过计算各种不同情况的概率,在已知概率的基础上,来求解净现值大于等于零的情况。与传统回归模型相比。决策树在识别决策方面更具有优势,同时可以检验变量之间的交互效应以解决多重共线性问题。

这里通过调用sklearn模块下的DecisionTreeClassifier函数进行搭建决策树分类模型,并设置一定的树的深度以进行模型的训练。

3、随机森林RandomForestClassifier分类器:

随机森林是由多个决策树组成的分类器,通过分裂训练数据集进行加载入多个决策树的训练。其随机性主要体现在数据选择的随机性和特征选择的随机性,它使用随机维度选择和抽样,使得决策树更具有随机性,从而保证了算法的准确度和鲁棒性。

这里设置树的数目为100,深度为10,max_features取值为“auto”,即取为n_features的平方根值。

4、神经网络MLPClassifier分类器:

MLPClassifier分类器又被称为多层感知器和人工神经网络。其是输入的特征输入到隐层的神经元,然后隐藏层通过全连接的方式连接输入层,相邻的两层通过RELU激活函数对上一层进行非线性变换,通过反向传播进行调整不同神经元之间的w和b参数来达到训练的目的。而在反向传播的过程中通过随机梯度下降的方法进行模型的收敛。

在这里通过从X端CSV文件数据读入作为输入层,设置隐藏层节点数分别为20,30和40,Y标签数作为输出进行分类建立分类器模型。

2.1 深度算法设计(GUI附加二次检测)

利用keras搭建RNN网络模型,并加入了二次检测,以防止对坐下、摔倒误判。二次检测主要对人体高度和宽度的比例进行对比以判断是否为跌倒动作。

部分代码如下:

myfont = ImageFont.truetype(r'C:/Windows/SIMLI.TTF', 20)
parser = argparse.ArgumentParser(description='tf-pose-estimation run')
parser.add_argument('--image', type=str, default='Standard/1.jpg')
parser.add_argument('--model', type=str, default='cmu',help='cmu / mobilenet_thin / mobilenet_v2_large / mobilenet_v2_small')
parser.add_argument('--resize', type=str, default='0x0',help='if provided, resize images before they are processed. ''default=0x0, Recommends : 432x368 or 656x368 or 1312x736 ')
parser.add_argument('--resize-out-ratio', type=float, default=4.0,help='if provided, resize heatmaps before they are post-processed. default=1.0')
args = parser.parse_args()
update_a = ["", "", "", "", "", "", "", "", "", ""]
w, h = model_wh(args.resize)
if w == 0 or h == 0:e = TfPoseEstimator(get_graph_path(args.model), target_size=(432, 368))
else:e = TfPoseEstimator(get_graph_path(args.model), target_size=(w, h))
cap=cv2.VideoCapture("shuaidao.mp4")
conditions=[5,6]
num=0
image3 = np.zeros([600, 480, 3])
image3.fill(255)
cv2.imwrite("iimg3.jpg", image3)
image3 = cv2.imread("iimg3.jpg")
image_web4=cv2.resize(image3,(800,480))
image3 = Image.fromarray(cv2.cvtColor(image3, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(image3)
dates = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
draw.text((10, 10), "系统日志:" + dates, font=myfont, fill=(255, 0, 0))
image3 = cv2.cvtColor(np.asarray(image3), cv2.COLOR_RGB2BGR)

简易版本代码:

链接:https://pan.baidu.com/s/172z3YOvpQkMFZANhP3yDJg

提取码:imtw

GUI二次检测代码:

https://download.csdn.net/download/qq_42279468/22009054

作者简介:

李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

基于 Openpose 实现人体动作识别相关推荐

  1. 基于kinect的人体动作识别系统

    基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...

  2. 基于kinect的人体动作识别系统(算法和代码都放出)

    基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...

  3. java kinect 人体识别_基于kinect的人体动作识别系统

    [实例简介] 基于kinect v2的人体动作识别,配套博客(http://blog.csdn.net/baolinq/article/),基于mfc,可以识别左移右移.上蹦下跳等,也可以自己自定义其 ...

  4. 基于3D关节点的人体动作识别综述(转)

    原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人 ...

  5. 基于Detectron2和LSTM的人体动作识别

    人体动作识别通过分析视频来预测或分类视频中人物的各种动作.它被广泛应用于监测.体育.健身.防御等各个领域. 假设你想创建一个在线教授瑜伽的应用程序.它应该提供一个预先录制的瑜伽视频列表供用户观看.用户 ...

  6. 空间注意力机制sam_一种基于注意力机制的神经网络的人体动作识别方法与流程...

    本发明属于计算机视觉领域,具体来说是一种基于注意力机制的神经网络的人体动作识别的方法. 背景技术: 人体动作识别,具有着非常广阔的应用前景,如人机交互,视频监控.视频理解等方面.按目前的主流方法,可主 ...

  7. 基于动态骨骼的动作识别方法ST-GCN

    解读:基于动态骨骼的动作识别方法ST-GCN(时空图卷积网络模型) 2018年04月09日 01:14:14 我是婉君的 阅读数 16076更多 分类专栏: 计算机视觉 论文 版权声明:本文为博主原创 ...

  8. 人体动作识别与评价——区别、联系及研究进展

    摘要 人体动作识别与动作评价是近年来的热点研究问题.两者在数据类型.数据处理.特征描述等方面有许多相通之处.近年来,随着应用需求的显著增长,出现了大量有关动作识别与评价的研究工作,但两者间的区别与联系 ...

  9. 使用OpenVINO实现人体动作识别

    Paula Ramos著   张晶 译 目录 1.1 人体动作识别背景简介 1.2 OpenVINOTM Notebook简介 1.3 动作识别模型简介 1.4 实现实时动作识别 1.4.1 下载模型 ...

  10. 简单的机器学习程序_人体动作识别小程序【机器学习 人工智能】

    人体动作识别(Human activity recognition)是健康领域一个热点问题,它通过加速度计,陀螺仪等传感器记录人体运动数据,对人体动作进行识别.最近用微信小程序做了一个动作识别的项目, ...

最新文章

  1. C#微信开发小白成长教程二(新手接入指南,附视频)
  2. Spring--SPeL
  3. linux 删除文件_Linux删除文件夹命令有哪些
  4. pil对图像加透明 python_使用Python图像处理库Pillow处理图像文件
  5. java 圆心_JAVA程序帮忙看下把
  6. VC编程-预编译头文件(precompiled header)
  7. QFIL的烧录、读写
  8. python 钉钉导出Excel考勤统计
  9. 360站长工具-免费360链接提交主动推送收录工具自带收录排名蜘蛛查询
  10. MySQL–ROW_NUMBER
  11. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机
  12. 学计算机专业可以做施工员吗,大龄转行做工程施工员,学起吃力吗?
  13. 一路向北(电影《头文字D》主题曲)铃声 一路向北(电影《头文字...
  14. dB(分贝)定义及其应用
  15. Linux lseek函数
  16. 知识点滴 - 项目阶段的定义
  17. JavaWeb学习心得总结
  18. 【 Visual C++】游戏开发笔记之二——最简单的DirectX,vc窗口的编写
  19. 基于Gabor滤波器的指纹图像增强处理算法matlab仿真
  20. python可以应用lbm_格子玻尔兹曼方法(LBM)Python 程序提速

热门文章

  1. 全民营销,只看这篇文章就够了
  2. Learning Instagram 学习Instagram Lynda课程中文字幕
  3. 进入地图后分别进行放大缩小操作
  4. ECharts快速上手 入门教学
  5. VMware Ubuntu 18.04 搭建个人Hustoj教程
  6. 《完全写作指南》随笔
  7. 推荐几个好用的 html5 游戏源码下载网站
  8. CentOS8.4搭建PXE启动Ubuntu-server20.04(UEFI)
  9. NVivo 12 Mac的大规模部署
  10. 图片压缩大小的3种方法,简单快捷实用!