[深度学习 – 实战项目] 行为识别——基于骨架提取/人体关键点估计的行为识别

[深度学习 – 实战项目] 行为识别——基于骨架提取/人体关键点估计的行为识别行为识别——骨架提取/人体关键点估计我们可以通过深度学习,检测到一个人,但是那个人在做什么我们不知道。所以我们就想让神经网络既检测到人,又知道他在做什么。也就是对这个人的行为进行识别。一个人的行为可以有很多种,可以跑、跳、走、跌倒、打架……有一些我们可以看第一眼就知道他在干嘛,有些我们必须看一段才知道他在干嘛。所以我们要用神经网络来识别行为,就可以分成单帧图片的识别和连续帧图片的识别。如果是单帧图片的识别,例如举手、摆个姿势……等简单的动作,我们可以直接用卷积网络、或者直接用yolo进行训练。在数据集

大家好,又见面了,我是你们的朋友全栈君。

行为识别——骨架提取/人体关键点估计

我们可以通过深度学习,检测到一个人,但是那个人在做什么我们不知道。所以我们就想让神经网络既检测到人,又知道他在做什么。也就是对这个人的行为进行识别。

一个人的行为可以有很多种,可以跑、跳、走、跌倒、打架……有一些我们可以看第一眼就知道他在干嘛,有些我们必须看一段才知道他在干嘛。所以我们要用神经网络来识别行为,就可以分成单帧图片的识别和连续帧图片的识别。

如果是单帧图片的识别,例如举手、摆个姿势……等简单的动作,我们可以直接用卷积网络、或者直接用yolo进行训练。在数据集足够的情况下就能够达到很好的效果。但是生活中动作往往是连续的,因此yolo就无法对多帧图片进行训练。例如,躺下和跌倒、打架和拥抱……

其次,我们要训练一个人的行为,实际在图片上,人的体型、人的衣着、背景的复杂性……都会使训练加大困难。但是实际上能够表示一个人的动作只需要他的骨架信息就够了。那我们要怎么得到人体的骨架呢。

人体姿态估计的算法已经出了好几年了,现在都已经在研究3D姿态了。
我这里就找了几个2D人体关键点估计的算法,然后讲讲他们在做行为识别会出现的一些问题。

1. openpose

openpose官方源码
openpose是自下而上的人体姿态估计算法,也就是先得到关键点位置,再获得骨架。因此计算量不会因为图片上人物的增加而显著增加,能保证时间基本不变。

代码能够实现二维多人关键点检测:15或18或25个关键点的身体/脚关键点估计。运行时间不依赖于检测到的人数。

官方源码是用C++编写的,但是我喜欢用python并且方便我对代码的拼装。因此我也没去跑通。

openpose是自下而上的人体姿态估计算法,因此就会出现当人群密集,或者两个人靠的太近,就容易检测错误。

原始的openpose需要很好的显卡参与计算,也就是说需要很好的硬件支持才能够跑起来,因此就有了个轻量级版本的openpose(基于mobileNetV2)
轻量级版本 lightweight openpose。它可以在CPU上运行,而且速度非常的快,但是准确性就比较差。但是能够在移动设备上运行,算是一个比较好的选择。下面是源码跑出来的效果图。
lw

2. Alphapose

Alphapose是自上而下的算法,也就是先检测倒人体,再得到关键点和骨架。因此他的准确率、Ap值要比openpose高。但是缺点就是随着图片上的人数增加,他的计算量增大,速度变慢。
但是有个好处就是它被遮挡部分的关键点不会任意获取。即可以只显示看得到的部分。准确度方面也比openpose好。
官方源码:AlphaPose-Pytorch:https://github.com/MVIG-SJTU/AlphaPose/tree/pytorch

网络模型基于resnet50、resnet101,因此计算量比较大,运算速度也比较慢。
Alphapose

3. Mobilepose

mobilePose就是用轻量级网络来识别人体关键点,而且大部分都是单人姿态估计。因此可以先加上人体的侦测,如用yolo侦测到人的位置,然后在接上mobilepose,这样速度可以非常的快,而且准确性也比较好。
但是缺点就是,不管人体部分是不是被遮挡,都会生成所有关键点。

Mobile Pose单人姿态估计:https://github.com/YuliangXiu/MobilePose-pytorch

这个源码里面包括ResNet18、MobileNetV2、ShuffleNetV2、SqueezeNet1.1…几个轻量级的网络。
然后官方是直接对摄像头进行裁剪,只有中间一部分,(放得下一个人的位置)。而且即使没有框住人,也会生成骨架信息。例如下图,直到窗口有人出现才把骨架和人对上。
无人有人
然后我自己加上yoloV5侦测到人的位置,然后在识别骨架。就可以实现多人姿态识别。但是多个人叠在一起还是会影响准确率。
pose
单人

4. 总结

骨架提取如果要在移动端部署,那么就得用轻量级版本。受限于复杂背景,人物可能被遮挡,或者多人重叠的情况就无法很准确的识别骨架。因此在移动端可以实现的只有单人的时候,做单人的行为识别、动作匹配等作用。

对于大场景的行为识别,就要用到比较大的模型,才能有较高的精确度。例如监控下的场景,如果是人稀少的地方,那么轻量级的也可以使用。

关键的问题还是,所需要的场景应用下,我们需要多大的精确度,去做什么类似的动作识别。所以这就得根据所应用得场景来选择模型了。具体我也说不清。

之前在做项目的时候,行为识别大概的思路也是先检测到人,并且要对人进行跟踪(可以用简单的IOU例如上面的lightweight openpose这个代码写的;还有部分的行为识别用的deepsort),然后再提取骨架,最后对连续帧或者单帧的骨架进行行为识别。

以下面这个代码为例,他就是用yoloV3进行人的侦测,再用SPPE(Alphapose)进行骨架提取,再用连续30帧的ST-GCN进行行为识别。站立、走路、跌倒行为识别https://github.com/GajuuzZ/Human-Falling-Detect-Tracks (这里直接右键打开,或者把链接复制到网站上打开,CSDN会跳转到自家的下载资源链接上。。。)
代码的效果还不错,但是准确度还不够。而且在我电脑上1050Ti上跑,单人要10FPS,多人就3FPS以下。(受限于Alphapose自上而下的模式。)然后在2070Ti的电脑上跑,单人能够达到20FPS。(基本上能够达到实时,但是流畅性差了点)

所以后面要根据场景修改模型,重新训练模型。然后根据不同场景部署的方式和应用的方式进行优化选型。

然后说下提取骨架后,行为识别的方法。以前做的时候想了很多方法,当然也研究了很多论文和博客,能够做个总结。

基于单帧图像的骨架:

  1. 人体骨架的数据,(坐标点或者向量)进行训练。如果是简单的二分类模型,也可以用机器学习的方式如SVM,也可以写个小网络如全连接。难点在于,如果收集数据的问题,而且要对检测到的骨架信息做归一化(量纲)。
  2. 人体骨架提取出来,单独做一张掩码图。做个简单的卷积网络训练。(就跟手写数字识别一样)

基于连续帧图像的骨架:

  1. ST-GCN:解读:基于动态骨骼的动作识别方法ST-GCN(时空图卷积网络模型),也可以直接去看官方论文啊,因为我之前没用这个,暂时也没去了解。等以后有用到,在做了解。?
  2. LSTM :参考这篇,人体骨架检测+LSTM。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152037.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • List去重工具类

    List去重工具类publicclassListUtil{Setset=newHashSet();List<T>newList=List.newArrayList();Iterator<?>iterator=list.iterator();where(iterator.next()){Tobject=…

  • MessageBox()功能

    MessageBox()功能

  • Oracle触发器trigger详解

    Oracle触发器trigger详解触发器相关概念及语法概述本篇博文中主要探讨以下内容:什么是触发器触发器的应用场景触发器的语法触发器的类型案例数据:触发器的概念和第一个触发器数据库触发器是一个与表相关联的,存储的PL/SQL语句。每当一个特定的数据操作语句(insertupdatedelete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。举个简单的例子:当员…

  • Linux下netstat命令详解

    Linux下netstat命令详解一、介绍Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。 二、输出信息描述执行netstat后输出如下:[root@sy-suz-srv51~]#netstatActiv…

  • 睿智的目标检测29——Keras搭建YoloV4目标检测平台

    睿智的目标检测29——Keras搭建YoloV4目标检测平台睿智的目标检测29——Keras搭建YoloV4目标检测平台学习前言什么是YOLOV4YOLOV4改进的部分(不完全)改进点解析1、主干特征提取网络Backbone2、主干特征提取网络Backbone学习前言哈哈哈我最喜欢的YOLO更新了!什么是YOLOV4YOLOV4是YOLOV3的改进版,在YOLOV3的基础上结合了非常多的小Tricks。尽管没有目标检测上革命性的改变,但是YOLOV4依然很好的结合了速度与精度。根据上图也可以看出来,YOLOV4在YOLOV3的基础上,在FPS不下降的

  • 帮助函数

    帮助函数

    2021年10月20日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号