文章目录

  • ST-GCN
  • 骨架的图结构
  • 空间图卷积网络
  • 划分子集
  • 注意力机制
  • TCN
  • 训练
  • 参考

本文抛砖引玉为大家提供一个行为识别的案例,大家也可以根据该方法实现更多任务,也可以提供一些改进的方法。

本项目主要检测7类行为:StandingWalkingSittingLying DownStand upSit downFall Down。算法主要分三部分:

  • YOLOv3-tiny用于行人检测
  • DeepSort用于行人跟踪
  • ST-GCN用于行为检测

YOLO系列在笔者之前博客有讲解,DeepSort也比较常见(如有需要笔者另择时间讲解),本文主要讲一下ST-GCN方法。

ST-GCN

ST-GCN结构图

给出一个动作视频的骨架序列信息,首先构造出表示该骨架序列信息的图结构,ST-GCN的输入就是图节点上的关节坐标向量,然后是一系列时空图卷积操作来提取高层的特征,最后用SofMax分类器得到对应的动作分类。整个过程实现了端到端的训练。

骨架的图结构

设一个有N个节点和T帧的骨架序列的时空图为G=(V,E),其节点集合为V={vti|t=1,…,T,i=1,…,N},第t帧的第i个节点的特征向量F(vti)由该节点的坐标向量和估计置信度组成。

图结构由两个部分组成:

  • 根据人体结构,将每一帧的节点连接成边,这些边形成spatial edges ES={vtivtj|(i,j)∈H}。H是一组自然连接的人体关节。
  • 将连续两帧中相同的节点连接成边,这些边形成temporal edges EF={vtiv(t+1)i}。

骨架结构

蓝色圆点表示身体关节。人体关节间的体内边缘是根据人体的自然联系来定义的。帧间边缘连接连续帧之间的相同关节。关节坐标用作ST-GCN的输入。

空间图卷积网络

以常见的图像的二维卷积为例,针对某一位置x的卷积输出可以写成如下形式:
fout(x)=∑h=1K∑w=1Kfin(P(x,h,w))⋅W(h,w)(1)f_{out}(x)=\sum_{h=1}^K\sum_{w=1}^Kf_{in}(P(x,h,w))·W(h,w) \tag{1} fout​(x)=h=1∑K​w=1∑K​fin​(P(x,h,w))⋅W(h,w)(1)
输入通道数为c的特征图fin,卷积核大小K×Ksampling function采样函数P(x,h,w)=x+P′(h,w)weight function通道数为c的权重函数。

(1)sampling function
在图像中,采样函数P(h,w)指的是以x像素为中心的周围邻居像素,在图中,邻居像素集合被定义为:
B(vti)={vtj∣d(vtj,vti)≤D}(2)B(v_{ti})=\{v_{tj}|d(v_{tj},v_{ti})≤D\} \tag{2} B(vti​)={vtj​∣d(vtj​,vti​)≤D}(2)
d(vtj,vti)指的是从vtj到vti的最短距离,因此采样函数可以写成:
P(vti,vtj)=vtj(3)P(v_{ti},v_{tj})=v_{tj} \tag{3} P(vti​,vtj​)=vtj​(3)
(2)weight function
在2D卷积中,邻居像素规则地排列在中心像素周围,因此可以根据空间顺序用规则的卷积核对其进行卷积操作。类比2D卷积,在图中,将sampling function得到的邻居像素划分成不同的子集,每一个子集有一个数字标签,因此有lti : B(vti)→{0,…,K−1}。将一个邻居节点映射到对应的子集标签,权重方程为:
W(vti,vtj)=W′(lti(vtj))(4)W(v_{ti},v_{tj})=W^{'}(l_{ti}(v_{tj})) \tag{4} W(vti​,vtj​)=W′(lti​(vtj​))(4)
(3)空间图卷积

fout(vti)=∑vtj∈B(vti)1Zti(vtj)fin(P(vti,vtj))⋅W(vti,vtj)(5)f_{out}(v_{ti})=\sum_{v_{tj}\in B(v_{ti})}\frac{1}{Z_{ti}(v_{tj})}f_{in}(P(v_{ti},v_{tj}))·W(v_{ti},v_{tj}) \tag{5} fout​(vti​)=vtj​∈B(vti​)∑​Zti​(vtj​)1​fin​(P(vti​,vtj​))⋅W(vti​,vtj​)(5)
其中,归一化项
Zti(vtj)=∣{vtk∣lti(vtk)=lti(vvtj)}∣(6)Z_{ti}(v_{tj})=|\{v_{tk}|l_{ti}(v_{tk})=l_{ti}(v_{vtj})\}| \tag{6} Zti​(vtj​)=∣{vtk​∣lti​(vtk​)=lti​(vvtj​)}∣(6)
等价于对应子集的基。将式(3)(4)代入式(5)得到:
fout(vti)=∑vtj∈B(vti)1Zti(vtj)fin(vtj)⋅W(lti(vtj))(7)f_{out}(v_{ti})=\sum_{v_{tj}\in B(v_{ti})}\frac{1}{Z_{ti}(v_{tj})}f_{in}(v_{tj})·W(l_{ti}(v_{tj})) \tag{7} fout​(vti​)=vtj​∈B(vti​)∑​Zti​(vtj​)1​fin​(vtj​)⋅W(lti​(vtj​))(7)
(4)时空模型

将空间域模型扩展到时间域,得到采样函数:
B(vti)={vqj∣d(vtj,vti)≤K,∣q−t∣≤⌊Γ/2⌋}(8)B(v_{ti})=\{v_{qj}|d(v_{tj},v_{ti})\leq K,|q-t|\leq\lfloor\Gamma/2\rfloor \} \tag{8} B(vti​)={vqj​∣d(vtj​,vti​)≤K,∣q−t∣≤⌊Γ/2⌋}(8)
参数Γ\GammaΓ控制时间域卷积核大小,weight function为
lST(vqj)=lti(vtj)+(q−t+⌊Γ/2⌋)×K(9)l_{ST}(v_{qj})=l_{ti}(v_{tj})+(q-t+\lfloor\Gamma/2\rfloor)\times K \tag{9} lST​(vqj​)=lti​(vtj​)+(q−t+⌊Γ/2⌋)×K(9)
其中,lti(vtj)l_{ti}(v_{tj})lti​(vtj​)是vti处单帧情况的标签映射。这样,就对构造的时空图定义了卷积运算。

划分子集


(a)输入骨架的示例帧,身体关节用蓝点绘制。D=1的滤波器的接收域用红色虚线圆圈表示。

(b)唯一划分 Uni-labeling:将节点的1邻域划分为一个子集。

(c)基于距离的划分 Distance partitioning:将节点的1邻域划分为两个子集,节点本身子集与邻节点子集。

(d)空间构型划分 Spatial configuration partitioning:将节点的1邻域划分为3个子集,第一个子集连接了空间位置上比根节点更远离整个骨架的邻居节点,第二个子集连接了更靠近中心的邻居节点,第三个子集为根节点本身,分别表示了离心运动、向心运动和静止的运动特征。

注意力机制

在运动过程中,不同的躯干重要性是不同的。例如腿的动作可能比脖子重要,通过腿部我们甚至能判断出跑步、走路和跳跃,但是脖子的动作中可能并不包含多少有效信息。

因此,ST-GCN 对不同躯干进行了加权(每个 ST-GCN单元都有自己的权重参数用于训练)。

TCN

GCN 帮助我们学习了到空间中相邻关节的局部特征。在此基础上,我们需要学习时间中关节变化的局部特征。如何为 Graph 叠加时序特征,是图卷积网络面临的问题之一。这方面的研究主要有两个思路:时间卷积(TCN)和序列模型(LSTM)。

ST-GCN 使用的是 TCN,由于形状固定,可以使用传统的卷积层完成时间卷积操作。为了便于理解,可以类比图像的卷积操作。ST-GCN 的 feature map最后三个维度的形状为(C,V,T),与图像 feature map的形状(C,W,H)相对应。

  • 图像的通道数C对应关节的特征数C。
  • 图像的宽W对应关键帧数V。
  • 图像的高H对应关节数T。

在图像卷积中,卷积核的大小为w×1,则每次完成 w 行像素,1 列像素的卷积。stride为 s,则每次移动 s 像素,完成 1 行后进行下 1 行像素的卷积。

在时间卷积中,卷积核的大小为temporal_kernel_size×1,则每次完成 1 个节点,temporal_kernel_size个关键帧的卷积。stride为 1,则每次移动1帧,完成1个节点后进行下1个节点的卷积。

训练


输入的数据首先进行batch normalization,然后在经过9个ST-GCN单元,接着是一个global pooling得到每个序列的256维特征向量,最后用SoftMax函数进行分类,得到最后的标签。

每一个ST-GCN采用Resnet的结构,前三层的输出有64个通道,中间三层有128个通道,最后三层有256个通道,在每次经过ST-CGN结构后,以0.5的概率随机将特征dropout,第4和第7个时域卷积层的strides设置为2。用SGD训练,学习率为0.01,每10个epochs学习率下降0.1。

ST-GCN 最末卷积层的响应可视化结果图如下:

源码
Models
笔者Gitee主页

参考

[1].ST-GCN论文

[2].ST-GCN笔记

[3].ST-GCN官方代码

补:基于几何判断的跌倒检测算法

行为识别:行人跌倒检测(含源码)相关推荐

  1. 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测)

    跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测) 目录 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测) 1. 前言 2. 跌倒检测数据集说明 3. 基于Y ...

  2. 行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)

    行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测) 目录 行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测) 1. 前言 2. 人体检测数据集说明 ...

  3. 【YOLOv7】Python基于YOLOv7的人员跌倒检测系统(源码&部署教程&数据集)

    1.项目背景: 世界老龄化趋势日益严重,现代化的生活习惯又使得大多数老人独居,统计数据表明,跌倒是老年人的主要致伤原因.利用先进的计算机技术.传感器技术和图像信息处理技术实现人体跌倒自动检测,不仅可以 ...

  4. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  5. 基于OpenCV的图像形状检测(含源码)

    导读 本文给大家分享一个用OpenCV传统方法实现形状检测的小案例. 背景介绍 实例来源:https://github.com/akshaybhatia10/ComputerVision-Projec ...

  6. 面部表情识别3:Android实现表情识别(含源码,可实时检测)

    面部表情识别3:Android实现表情识别(含源码,可实时检测) 目录 面部表情识别3:Android实现表情识别(含源码,可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型训 ...

  7. 戴眼镜检测和识别3:Android实现戴眼镜检测和识别(含源码,可实时检测)

    Android实现戴眼镜检测和识别(含源码,可实时检测) 目录 Android实现戴眼镜检测和识别(含源码,可实时检测) 1.戴眼镜检测和识别方法 2.戴眼镜人脸检测 3.戴眼镜识别模型训练 4.戴眼 ...

  8. 人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载)

    人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载) 目录 人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载) 1. ...

  9. 人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码)

    人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码) 目录 1. 前言 2. 项目安装 (1)项目结构 (2)配置开发环境(OpenCV+OpenCL+ ...

  10. 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码)

    人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 目录 人脸识别4:Android InsightFace实现人脸识别Face Recognit ...

最新文章

  1. DOCKER OVERLAY NETWORK consul 注册
  2. VC++调用UpdateLayeredWindow实现半透明窗体【转】
  3. SAP Spartacus 启动时 Chrome 里观察到的 product.js
  4. 信息学奥赛C++语言:判断正负
  5. golang 项目设置后台运行
  6. 柴犬为什么总是被卡住狗头?
  7. html5音乐播放时间监测,【HTML5】HTML5中video元素事件详解(实时监测当前播放时间)...
  8. 关于android LinearLayout的比例布局(转载)
  9. 网络近端串扰测试软件,干货 如何使用DSP技术进行网线近端串扰测试
  10. 我们分析了5万多场英雄联盟比赛,教你如何轻松用Python预测胜负
  11. Multisim14仿真基本模拟电路之 10. 3. 2比例放大电路的仿真实验与分析
  12. python爬虫数据(中国人口信息)存入MYSQL数据库
  13. Auto Tile 自动拼接地图和墙壁
  14. UVA 11137 Ingenuous Cubrency (背包水题)
  15. 红帽Linux多点触摸,Linux系统实现多点触摸
  16. MTK USB软件框架
  17. CVF转IVF可能遇到的问题
  18. 事件的独立和事件互不相容两个概念的区别
  19. android三星定位闪退,三星手机闪退问题7种修复方法
  20. 据说很多程序员下班后都不关电脑,入职开机,离职关机,是真的吗?

热门文章

  1. [转贴]色彩调和的原理
  2. Combination
  3. 樊登读书会掌控读后感_樊登读后感悟,樊登读书会《爆款》读后感
  4. 什么是DNS,FTP,HTTP,DHCP及用途
  5. 乘坐民航客机能带多大容量充电宝
  6. 视频2-视频文件解析和格式说明
  7. 一、14.猜码游戏:每一轮里,程序随机生成两个数字,一个是码数,0到5,一个是猜数,码数到10。用户也输入码数和猜数。若这一轮程序的猜数等于两个码数之和,输出“电脑胜”,若都没猜对或都猜对了,公布双方
  8. CentOS6.5服务器端口捆绑
  9. Exception in thread “main“ java.nio.file.NoSuchFileException: 123.txt
  10. AI 作画《NBA球星动漫头像》| 用stable diffusion生成