ST-GCN 实现人体姿态行为分类
作者 | 李秋键
出品 | AI科技大本营(ID:rgznai100)
引用
人体行为识别是计算机视觉及机器学习方面的热门研究领域。它在对视频中的人类行为进行运动分析、行为识别乃至延伸至人机交互领域都有着非常广泛的应用。研究初期,人体行为识别主要是以基于静态图像为研究对象。通过提取静态图像中的人体动作特征并对动作进行分类。然而仅基于静态图像来进行识别人体行为的局限性在于人体行为是连续、动态的,单凭一张静态图像无法进行判断识别。而基于视频为研究对象,可以将视频看作连续静态图像的时间序列。近两年,很多基于视频为对象的人体行为识别取得了不错的成果,例如,Gao等人以多视角的视频为基础开发出了一种自适应融合和类别级词典学习模型。
在通常情况下,人体行为识别有着例如外观、光流、身体骨骼和深度等多种模态,人们可以通过这些模态建模并传达重要信息进而实现人体行为识别。近几年,比较热门的深度领域有着很多的成果,Kamel等人利用使用卷积神经网络从深度图和姿势数据中进行人体行为识别。Ji等人利用深度图来将骨骼信息嵌入从而达到对人体进行分区的目的,以及Zhao等人提出了一种贝叶斯分层动态模型用于人类动作识别也取得了不错的效果。而在这些模态当中,人类身体骨骼通常能与其他模态相辅相成并传达重要信息。同时也因为骨骼信息的清晰直观且不易受到人体外观等其他因素的影响,具有良好的鲁棒性。
基于骨架的人体行为识别方法因对复杂场景具有较强的鲁棒性,因此近些年涌现很多基于骨架的动作识别方法。一般分为两种方法:
(1)基于人工特征选择的方法,通过人工设定的特性来捕捉关节运动动态。例如关节的相对位置、关节轨迹的协方差矩阵或是身体部分之间的平移旋转等特性。
(2)深度学习方法,基于深度学习进行骨架建模,端到端的动作识别模型通过使用递归神经网络和临时CNNs来学习。ST-GCN不同于这些方法,虽然强调了人体关节建模的重要性,但这些部分一般使用领域知识明确分配指定。ST-GCN将GCN应用于基于骨架的人体行为识别系统中,在此基础上加入了对识别人体行为非常重要的关节之间的空间关系这一因素,以人体关节为节点,同时连接关节之间的自然联系和相同关节的跨连续时间联系,然后以此为基础构造多个时空图卷积层,沿时空维度进行集成信息。
故本项目通过搭建ST-GCN实现对视频时空流进行姿态估计和行为分类。最终可实现效果如下:
1、ST-GCN 介绍
ST-GCN是香港中文大学提出一种时空图卷积网络,可以用它进行人类行为识别。这种算法基于人类关节位置的时间序列表示而对动态骨骼建模,并将图卷积扩展为时空图卷积网络而捕捉这种时空的变化关系。
1.1 模型通道
基于骨架的数据可以从动作捕捉设备中获得,也可以从视频中获得姿态估计算法。通常数据是一个坐标系序列,每个坐标系都有一组关节坐标。ST-GCN就是构建一个以关节为图节点,以人体结构和时间为图边的自然连接为图节点的时空图。ST-GCN的输入是图节点上的关节坐标向量。这可以看作是对基于图像的cnn的模拟,其中输入是由驻留在2D图像网格上的像素强度向量构成的。对输入数据进行多层次的时空图卷积运算,在图上生成更高层次的特征图。然后它将被标准的SoftMax分类器分类到相应的动作类别。
1.2 骨骼图结构
骨骼序列通常由每一帧中每个人体关节的2D或3D坐标表示。使用卷积进行骨骼动作识别,将所有关节的坐标向量连接起来,形成每帧的单一特征向量。
1.3 时空模型
针对空间时间建模。在构建了空间图之后,需要在骨骼序列中建模时空动态。在构建图的时候,图的时间方面是通过在连续的框架中连接相同的关节来构建的。从而能够定义一个非常简单的策略,将空间图CNN扩展到空间时域。
2、模型实验
2.1 环境搭建
1、首先下载好完整无误配置好的代码(包括模型等等,见文末)。
2、搭建最新版的openpose环境,并使用cmake编译。
3、配置好python的cuda环境,以及opencv等基础环境。
4、使用命令
“python main.py demo --openpose E:/cmake/environment/x64/Release --video 2.mp4”进行测试生成结果。
其中“E:/cmake/environment/x64/Release”需要改成自己的openpose环境。
2.2 主函数调用
其中主函数通过使用processors管理的设定好的分类识别、输入输出管理等程序内部函数进行整个程序的布置。
代码如下:
import argparse
import sys
import torchlight
from torchlight import import_class
if __name__ == '__main__':parser = argparse.ArgumentParser(description='Processor collection')processors = dict()processors['recognition'] = import_class('processor.recognition.REC_Processor')processors['demo'] = import_class('processor.demo.Demo')subparsers = parser.add_subparsers(dest='processor')for k, p in processors.items():subparsers.add_parser(k, parents=[p.get_parser()])arg = parser.parse_args()Processor = processors[arg.processor]p = Processor(sys.argv[2:])p.start()
2.3 模型网络
通过调用空间-时间图卷积网络建立这个网络模型。其中参数in_channels (int)为输入数据中的通道数;
num_class (int)表示用于分类任务的类的数量;
graph_args (dict)表示构建图的参数;
edge_importance_weighting (bool)表示如果“True”,添加一个可学习的对图的边进行重要性加权。代码如下:
def __init__(self, in_channels, num_class, graph_args,edge_importance_weighting, **kwargs):super().__init__()self.graph = Graph(**graph_args)A = torch.tensor(self.graph.A, dtype=torch.float32, requires_grad=False)self.register_buffer('A', A)spatial_kernel_size = A.size(0)temporal_kernel_size = 9kernel_size = (temporal_kernel_size, spatial_kernel_size)self.data_bn = nn.BatchNorm1d(in_channels * A.size(1))kwargs0 = {k: v for k, v in kwargs.items() if k != 'dropout'}self.st_gcn_networks = nn.ModuleList((st_gcn(in_channels, 64, kernel_size, 1, residual=False, **kwargs0),st_gcn(64, 64, kernel_size, 1, **kwargs),st_gcn(64, 64, kernel_size, 1, **kwargs),st_gcn(64, 64, kernel_size, 1, **kwargs),st_gcn(64, 128, kernel_size, 2, **kwargs),st_gcn(128, 128, kernel_size, 1, **kwargs),st_gcn(128, 128, kernel_size, 1, **kwargs),st_gcn(128, 256, kernel_size, 2, **kwargs),st_gcn(256, 256, kernel_size, 1, **kwargs),st_gcn(256, 256, kernel_size, 1, **kwargs),))
2.4 ST-GCN网络建立
建立ST-GCN网络模型,其中in_channels (int)表示输入序列数据中的通道数;
out_channels (int)表示卷积产生的通道数;
kernel_size (tuple)为时态卷积核和图卷积核的大小;
stride (int,可选)为时间卷积的步幅。默认值:1;
dropout (int,可选)为最终输出的辍学率。默认值:0;
residual (bool,可选)表示如果”True “,应用残留机制。默认值:“True”。
代码如下:
def __init__(self,in_channels,out_channels,kernel_size,stride=1,dropout=0,residual=True):super().__init__()assert len(kernel_size) == 2assert kernel_size[0] % 2 == 1padding = ((kernel_size[0] - 1) // 2, 0)self.gcn = ConvTemporalGraphical(in_channels, out_channels,kernel_size[1])self.tcn = nn.Sequential(nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),nn.Conv2d(out_channels,out_channels,(kernel_size[0], 1),(stride, 1),padding,),nn.BatchNorm2d(out_channels),nn.Dropout(dropout, inplace=True),)if not residual:self.residual = lambda x: 0elif (in_channels == out_channels) and (stride == 1):self.residual = lambda x: x
运行过程如下可见,在这里通过双击“test.bat”即可直接运行:
完整代码:
链接:
https://pan.baidu.com/s/1Ht7Mr6hJMt5oUKu6ue05fw
提取码:0nqh
李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。
相关文章:

【原创】Kakfa utils源代码分析(三)
Kafka utils包最后一篇~~~ 十五、ShutdownableThread.scala可关闭的线程抽象类! 继承自Thread同时还接收一个boolean变量isInterruptible表明是否允许中断。既然是可关闭的,因此一定不是守护线程,而是一个用户线程(不会阻塞JVM关闭)。提供的方…

Oracle的分页查询
为什么80%的码农都做不了架构师?>>> 因为Oracle不像MySQL一样有limit函数来实现分页查找,oracle要实现分页查询可使用关键字rownum来处理。使用rownum有以下几点需要注意: 1、ROWNUM存在使用规则,在单个子查询中&…

微软成功抵御峰值高达 2.4Tbps 的 DDoS 攻击
整理 | 祝涛 出品 | CSDN(ID:CSDNnews)微软表示,他们成功抵御了一场发生于8月份的2.4Tbps分布式拒绝服务(DDoS)攻击,这次攻击超过了去年针对亚马逊Web服务的2.3Tbps最大攻击。这场攻击持续…

百度吴甜:首席AI架构师培养计划持续为行业输送高端复合型AI人才
CSDN 导语: 随着 AI 技术的发展,关注 AI 的开发者与日俱增:据 CSDN 发布的《中国 AI 应用开发者报告》显示,在 CSDN 的注册开发者中,689 万开发者有阅读、撰写和研究 AI 技术行为,其中精准聚焦 AI 学习和应…

Htaccess文件是什么以及Windows下自由创建.htaccess文件的N种方法
.htaccess是什么 概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。 通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访…

Linux grep,egrep及相应的正则表达式用法详解
linux在进行文本处理过程中的文本搜索工具称为正则表达式。文本搜索工具有grep、egrep、fgrep,egrep为正则表达式的扩展正则表达式,fgrep用于搜索文本字符串,与 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。grep的含…

Java GC 日志解析
JVM 在Java应用程序优化中是不可缺少的一大重项,如何合理配置Java参数,如果验证配置参数的有效性,从GC日志中可以获得很重要的提示,以下是笔者对GC垃圾收集器默认开启的组合日志的部分的解析,希望能帮到想学习的同学O(…

MySQL 备份和恢复策略
在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。 备份策略一:直接拷贝数据库文件(不推荐ÿ…

zookeeper学习记录
2019独角兽企业重金招聘Python工程师标准>>> 背景 前段时间看了S4流计算引擎,里面使用到了zookeeper进行集群管理,所以也就花了点时间研究了下zookeeper,不求看懂所有源码,但求了解其实现机制和原理,清楚其…
Ubuntu的apt-get使用国内的源
1、复制原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2、打开清华大学TUNA官网发布的Ubuntu 镜像使用帮助。 3、复制下面框中的内容,打开自己的Ubuntu系统。 4、 将框中的内容替换掉原来的所有内容 sudo gedit /etc/apt/sources.list 5、 进…

51单片机实现对24C02进行页写、顺序读取并显示验证
源:51单片机实现对24C02进行页写、顺序读取并显示验证 //************************************************************************************* //**程序名称:51单片机实现对24C02进行页写、顺序读取并显示验证 //**编写人:**** //**修…

配置MySQL主从复制
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从…
PHP 单元测试
本文首发于 https://jaychen.cc/article/34作者 Jaychen朋友,你听说过安。。。不是,写过单元测试吗。 单元测试是开发过程中必不可少的一环,一个项目有良好的单元测试代码,重构的勇气都大很多。这次写一篇小文来介绍一下 PHP 的单…

CI框架如何删除地址栏的 index.php
默认 CI 框架显示地址是 http://localhost/ci/index.php/test/ 去掉index.php这样会更好些。1.修改Http.conf的 LoadModule rewrite_module modules/mod_rewrite.so 去掉注释2.ci根目录增加.htaccess文件 <IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /ci#Remov…

网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置)
2019独角兽企业重金招聘Python工程师标准>>> 网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路。找几百个电脑(肉鸡),控制这些电脑同时访问你的网站,超过你网站的最大承载能力&…

除了 AI,这些技术为 IIoT 插上飞向“4.0”的翅膀
“中国制造2025、德国工业4.0、美国先进制造”——在21世纪的工业领域,“制造强国”开启新一轮角逐。尽管实现路径各有侧重,但题中之义均是通过互联网和智能技术实现企业生产和管理的降本增效。正因此,IIoT被视为助推智能制造转型升级的“催化…

[20171225]查看并行执行计划注意的问题.txt
[20171225]查看并行执行计划注意的问题.txt--//如果使用dbms_xplan.display_cursor查看并行执行计划注意一些问题,通过例子说明:1.环境:SCOTTbook> &r/ver1PORT_STRING VERSION BANNER------------------------------ -------------- ------…

expires与etag控制页面缓存的优先级
expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。time值还控制"Cache-Control"的值:负数表示no-cac…

API 大赛决赛名单出炉,速来围观!
创新云转型,智慧云服务2021年移动云API应用创新开发大赛正在火热进行中各个赛道激烈PK优秀开发者同台切磋彰显实力!10月14日,2021年移动云API应用创新开发大赛复赛在中移软件园双创路演大厅圆满举办。本次复赛分为移动赛道和企业赛道分别进行…

将日期yyyy-MM-dd转为数字大写的形式
/*** 将日期转大写* 例如:2013-05-13转为 二0一三年五月十三日* param date* return */public static String getDxDate(String date){String dateArr[] date.split("-");String year dateArr[0];String month dateArr[1];String day dateArr[2];Str…

DevExpress v17.2新版亮点—WPF篇(四)
2019独角兽企业重金招聘Python工程师标准>>> DevExpress年终击穿底价,单套授权低至67折!仅剩最后6天!查看详情>>> 用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容。本…

CI框架验证码CAPTCHA 辅助函数的使用
使用CAPTCHA 辅助函数很方便生成验证码,但是图片是存储在文件夹下,不是输出流,感觉不够完美,可以拿来用用。 说明:产生4位的随机数,CI根目录下建立captcha文件夹。 <?php $this->load->helper(ca…

GitLab 上市,市值高达 149 亿美元!GitHub 的头号劲敌来了
整理 | 祝涛 出品 | CSDN当地时间周四,知名代码和资源托管服务平台 GitLab(股票代码GTLB)完成了IPO(首次公开募股),在纳斯达克成功上市。GitLab在本次 IPO 中筹集了约 6.5 亿美元。GitLab此前曾计划I…

将ubuntu系统设置静态ip及ssh
2019独角兽企业重金招聘Python工程师标准>>> sudo vim /etc/network/interfaces 输入以下:auto lo iface lo inet loopback auto eno1 iface eno1 inet static address 192.168.1.197 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameserver 192.168…

ECMAScript 5 —— 单体内置对象之Math对象
ECMAScript 还为保存数学公式和信息提供了一个公共位置,即 Math 对象。与我们在 JavaScript 直接编写的计算功能相比,Math 对象提供的计算功能执行起来要快得多。Math 对象中还提供了辅助完成这些计算的属性和方法。 一. Math 对象的属性 Math 对象包含的…

织梦内容管理系统修改
1.如何去掉互动中心 修改根目录下templates——default——index.htm文件,删除以下内容 <div id"rightAD1" style:margin:10px auto"></div> <div class"usercenter">.....到</div> <!-- /usercenter --&…

斯坦福大学 AI100 报告发布:AI 发展速度惊人,但风险也正走进现实
作者 | 阳光来源 | 学术头条语言处理、计算机视觉和模式识别的巨大进步,意味着人工智能(Artificial Intelligence,AI)每天都在与人们的生活进行交互,从帮助人们选择电影,到帮助人们解决医疗诊断难题方面…

linux===Ubuntu 上安装 Node.js
https://www.cnblogs.com/andfly/p/6681487.html转载于:https://www.cnblogs.com/botoo/p/8118903.html

非计算机专业的学生,从事编程工作的上升壁垒是什么?
很多同学自己的专业并不是计算机,但是看到如今IT行业发展的这么好,也想转行学习编码。但是自己非科班出身,又到了快毕业的年纪,开始学习编程来得及吗?这些年来,很多培训机构都借鉴了少儿编程培训的经验&…

HTTP头信息中的参数Etag
服务器如果是集群,不同服务器返回的 Http Header 中的 Etag 参数不一样。如果是图片是程序生成的,我们可以用 no-cache 这些 header 来控制,但如果这些图片是 apache 或 nginx 等呢?下面开始介绍 Etag:Etag在HTTP1.1中…