当前位置: 首页 > 编程日记 > 正文

举个例子,如何用GCN图卷积神经网络实现摔倒监测?

作者 | 李秋键

责编 | 寇雪芹

头图 | 下载于视觉中国

引言

近几年来深度学习的发展越来越火热,其中最为典型的就是半监督学习的新研究进展GCN。由Kipf和Welling提出的GCN被证明是一种有效的图半监督学习框架应用,如社会、医疗、商业和交通网络分析,其中典型的对象是在少数有标记数据的帮助下对无标记数据进行分类图中的样本。

图卷积网络(GCN)已被证明是一种有效的基于图的半卷积网络框架监督学习应用。GCN的核心操作块是卷积层通过融合节点属性和关系,使网络能够构造节点嵌入节点之间。不同的特性或特性的相互作用本身就具有不同的影响卷积的层。

然而,关于特征重要性影响的研究非常有限在GCN-related社区。在这项工作中,我们试图增加卷积层的GCNS通过建模特征的潜在交互作用,统计注意特征的重要性,即补充标准GCNS和只需要简单的计算与统计而不是沉重的培训。

为此,我们将每个卷积层的特征输入作为一个单独的multi-分层异构图,并提出了图统计自注意(GSSA)方法学习特征重要性的层次结构。更具体地说,我们建议在信道自注意(CSA),以捕获特征信道之间的依赖关系,和基于均值的自我注意(MSA)来重新加权特征之间的相似性。瞄准每个图形卷积层,GSSA可以以“即插即用”的方式应用于广泛的GCN变体。

据我们所知,这是优化GCNs特性的第一个实现重要的视角。大量的实验表明,GSSA可以促进现有的流行在半监督节点分类任务中,基线是非常重要的。

系统概述

本系统主要使用的是openpose提取特征,然后对特征使用GCN算法进行分类,以检验GCN的模型效果。

1.运行环境

由于需要使用到openpose工具,故需要配置以下环境。分别是:

python环境及相关库(opencv、numpy、pytorch等)环境、CUDA搭建GPU环境、C++环境、swig编译环境、以及ffmpeg环境和openpose环境;

2.openpose概述:

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

整个系统的搭建主要是依赖于openpose的姿态识别环境。Openpose的调用在这里通过调用其中设定好的主函数即可,其中包括模型加载程序、调用程序以及Estimator评估等等。

3.GCN简述:

图卷积方法主要有两大流派:基于频谱的方法和基于空间的方法。

基于频谱的方法主要有Spectral CNN (第一代 GCN)、第二代GCN、ChebyNet、 CayleyNet、一阶 ChebyNet等。在行为识别领域,ChebyNet 及一阶近似被广泛应用。基于空间的方法主要有消息传递与聚合、图采样与聚合、图结构序列化、关注卷积方式、基于注意力机制、关注感知域的方法。

随着GCN方法的发展,其方法主要分为两大类:基于频谱的方法 (spectral-based)和基于空间的方法 (spatial-based)。基于频谱的图卷积网络是将图信号与频谱信号进行转换和分析,然后再恢复图信号所在的空域,从而完成图信号的降噪与特征提取。以“降低复杂度”为主线,将常用于图像的卷积神经网络应用到图数据上。

基于频谱的图卷积通过添加自我连接单位矩阵、归一化邻接矩阵 A 的方式解决了基于空间的图卷积忽略节点自身特征、邻接矩阵过于庞大的两个问题。但由于基于频谱的图卷积方法存在灵活性不高、普适性不强、运行效率较低等问题,基于空间的图卷积方法利用邻域聚合的思想降低了复杂度,增强了泛化能力,提高了运行效率,是行为识别领域在图结构数据上进行分析的基本思想。

数据预处理

1.openpose图像数据生成

在配置好openpose环境以后,使用cut.py中的代码可以读取fall.mp4的视频,并生成数据集保存在datasets文件夹下,然后我们再手动分好类,分别为shuaidao和common这两个动作。其中文件夹数据如下:

图1  common文件夹数据图片


图2  shuaidao文件夹数据图片

分割的步骤就是读取mp4视频文件,利用循环分视频帧,然后手动分好数据集。其中分割部分的代码为cut.py,代码如下:

 1e = TfPoseEstimator(get_graph_path('mobilenet_thin'), target_size=(432, 368))2cap=cv2.VideoCapture("fall.mp4")3num=04while True:5    num+=16    ret,frame = cap.read()7    image = frame8    cv2.imwrite("datasets/"+str(num)+".jpg",image)9    cv2.imshow("1", image)
10    cv2.waitKey(1)


2.2 特征提取

在分割好数据集后分别对各自的类别图片提取特征,将特征分别保存在shuaidao.txt和common.txt文件中。但是考虑到有的时候并不是可以完整地提取到特征,对特征缺少的部分,使用均值替换。其中特征提取的代码为feature.py文件,得到的txt数据如下可见:

图3 特征提取结果显示

关键代码如下:

 1e = TfPoseEstimator(get_graph_path('mobilenet_thin'), target_size=(432, 368))2f0=open("shuaidao.txt","w")3f1=open("common.txt","w")4for file in os.listdir("datasets/shuaidao"):5    print(file)6    image = cv2.imread("datasets/shuaidao/"+file)7    cv2.imshow("test",image)8    cv2.waitKey(1)9    humans = e.inference(image, upsample_size=4.0)
10    try:
11        a = str(humans[0]).split("BodyPart:")
12        b = []
13        id = []
14        position = []
15        features=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
16        for i in a:
17            try:
18                position.append(
19                    float(str(i.split(" score")[0]).split("-")[1].replace("(", "").replace(")", "").split(", ")[0])
20            )
21                position.append(
22                    float(str(i.split(" score")[0]).split("-")[1].replace("(", "").replace(")", "").split(", ")[1])
23            )
24            except:
25                pass
26            try:
27                id.append(
28                    float(str(i.split(" score")[0]).split("-")[0]),
29            )
30            except:
31                pass
32        for t in range(len(id)):
33            features[int(2*id[t])]=position[2*t]
34            features[int(2 * id[t]+1)] =position[2*t+1]
35        avg_feat=round(sum(features)/len(features),3)
36        for i in range(len(features)):
37            if features[i]==0:
38                features[i]=avg_feat
39        f0.write(str(features)+"\n")
40        print(features)
41    except:
42        pass
43f0.close()

GCN图卷积神经网络

图神经网络常常用在对图模型的识别和训练上,这里我们通过修改使得他可以用于训练姿态识别的数据。

1.读取特征数据:

在第二步中将获取到的姿态特征保存成了txt文件中,现在分别对他们进行读入数据,代码如下:

 1#读取特征数据2x=[]3y=[]4f=open("shuaidao.txt")5text=f.read()6text=text.split("\n")7for t in text:8    try:9        t=t.replace("]", "")
10        temp=t.replace("[","").split(",")
11        temp=[float(i) for i in temp]
12        x.append(temp)
13        y.append(1)
14    except:
15        pass
16f=open("common.txt")
17text=f.read()
18text=text.split("\n")
19for t in text:
20    try:
21        t=t.replace("]", "")
22        temp=t.replace("[","").split(",")
23        temp=[float(i) for i in temp]
24        x.append(temp)
25        y.append(0)
26    except:
27        pass

2.建立图数据:

建立函数为create_graph,通过dgl库建立图,图的节点数为输入数据的长度:

1def creat_graph():
2    g = dgl.DGLGraph()
3    g.add_nodes(len(x))
4    return g

3.建立图网络中的message方法和reduce方法:

基于节点的GCN利用消息传播(messagepropagation)来交换相邻节点之间的信息。这一过程可以在图的较大相邻范围内提取特征,其作用类似于卷积网络中的卷积层和池化层。由于该过程中不会有节点消失,因此基于节点的GCN扩展了感受野,并避免了局部位置信息出现损失。代码如下:

1# 主要定义message方法和reduce方法
2def gcn_message(edges):
3    return {'msg' : edges.src['h']}
4def gcn_reduce(nodes):
5    return {'h' : torch.sum(nodes.mailbox['msg'], dim=1)}

4.建立GCN层

以图为对象的基础上,建立图网络触发信息和节点特征设置功能:

 1# 定义GCNLayer模块2class GCNLayer(nn.Module):3    def __init__(self, in_feats, out_feats):4        super(GCNLayer, self).__init__()5        self.linear = nn.Linear(in_feats, out_feats)6    def forward(self, g, inputs):7        # g 为图对象;inputs 为节点特征矩阵8        # 设置图的节点特征9        g.ndata['h'] = inputs
10        # 触发边的信息传递触发节点的聚合函数
11        g.send_and_recv(g.edges(), gcn_message, gcn_reduce)
12        # 取得节点向量
13        h = g.ndata.pop('h')
14        # 线性变换
15        return self.linear(h)

5.网络层搭建

设置一二层为GCN,激活函数使用relu激活函数。

 1class GCN(nn.Module):2    def __init__(self, in_feats, hidden_size, num_classes):3        super(GCN, self).__init__()4        self.gcn1 = GCNLayer(in_feats, hidden_size)5        self.gcn2 = GCNLayer(hidden_size, num_classes)6    def forward(self, g, inputs):7        h = self.gcn1(g, inputs)8        h = torch.relu(h)9        h = self.gcn2(g, h)
10        return h

6.模型训练

建立优化器为adam优化器,学习率使用0.01。将读入的特征数据转成tensor类型,作为输入。迭代400次,并计算其中的损失输出:

 1net = GCN(36, 8, 2)2x=np.array(x)3inputs = torch.from_numpy(x)4inputs = torch.tensor(inputs, dtype=torch.float32)5print(type(inputs))6labeled_nodes = torch.tensor([0, 2])7labels = torch.tensor([0, 1])  # 它们的标签是不同的8optimizer = torch.optim.Adam(net.parameters(), lr=0.01)9all_logits = []
10nx_G = G.to_networkx().to_undirected()
11pos = nx.kamada_kawai_layout(nx_G)
12print(inputs)
13for epoch in range(400):
14    logits = net(G, inputs)
15    #我们保存logit以便稍后进行可视化
16    all_logits.append(logits.detach())
17    logp = F.log_softmax(logits, 1)
18    # 我们只计算标记节点的损失
19    loss = F.nll_loss(logp[labeled_nodes], labels) 
20    optimizer.zero_grad()
21    loss.backward()
22    optimizer.step()
23    print('Epoch %d | Loss: %.4f' % (epoch, loss.item()))

最终模型测试精度如下图可见:

图4 损失函数实验图

图5 损失函数变换曲线

图6 参考效果图

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

更多精彩推荐
☞明年,我要用 AI 给全村写对联☞Ant Design 遭删库!☞每年节省170万美元的文档预览费用,借助机器学习的DropBox有多强?☞三年投 1000 亿,达摩院何以仗剑走天涯?
点分享点收藏点点赞点在看

相关文章:

数据中心节能大法 —— 尽在上海11月中国数据中心展

根据调研机构451Research的预测,全球数据中心托管市场2018年的市场规模将达到332亿美元。据悉,2015年我国数据中心节能改造规模已达30亿元左右,数据中心节能市场的空间是非常大的,在未来有望达到85亿元的市场空间。 根据调研机构4…

古怪的ConfigurationManager类

开始使用VS 2005,习惯性的使用ConfigurationSettings类来读取应用程序配置文件的信息时,却被编译器提示说:警告 1 “System.Configuration.ConfigurationSettings.AppSettings”已过时:“This method is obsolete, it has been replaced by …

最常用的css选择器及兼容性 +几个好用却不多见的 nth-child等

你也许已经掌握了id、class、后台选择器这些基本的css选择器。但这远远不是css的全部。下面向大家系统的解析css中30个最常用的选择器,包括我们最头痛的浏览器兼容性问题。掌握了它们,才能真正领略css的巨大灵活性。 1. * * { margin: 0; paddin…

对比四种爬虫定位元素方法,你更爱哪个?

作者 | 陈熹来源 | 早起Python头图 | 下载于视觉中国在使用Python本爬虫采集数据时,一个很重要的操作就是如何从请求到的网页中提取数据,而正确定位想要的数据又是第一步操作。本文将对比几种 Python 爬虫中比较常用的定位网页元素的方式供大家学习&…

2017年安全漏洞审查报告:安全补丁在不断增加,用户却不安装

软件漏洞难修复吗?年度FLexera漏洞审查报告显示,全部安全漏洞当中有81%已经拥有与之匹配的修复补丁,但多数常见软件项目的补丁安装率却相当低下。 作为一家面向应用程序开发商与企业客户的软件安全漏洞管理解决方案厂商,Flexera S…

Visual SourceSafe简明培训教程

名称Visual SourceSafe简明培训教程(Visual SourceSafe Training Short Course) 作者晨光(Morning) 简介对于采用Visual SourceSafe 6.0作为版本控制工具的项目及产品开发,本教程针对不同用户角色,提供有关该软件的若干使用指导…

水母智能联合蚂蚁森林、犀牛智造等,用AI助力非遗出圈,39万人开工得“福”

如今过年越来越有年味了,许多淡出已久的中国传统年俗,以更有趣、更年轻新潮、更科技的方式回到了大家身边。集五福、写福字、贴福字,挂福饰品,当然还有接“福袋”!人工智能实现智能设计已经相当成熟,已有微…

绿色信托任重道远 应建立补偿机制?

作为绿色金融的分支之一,绿色信托面临的状况不如绿色信贷、绿色债券,整体规模尚小,且监管方面的鼓励措施未有明确,甚至连概念都尚未统一。 日前,北京大学法学院非营利组织法研究中心与中航信托联合发布《2016年绿色信托…

解读C#正则表达式

多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。 此外,regexp类还能够完成一些其他的功能&am…

wpa_supplicant学习

2019独角兽企业重金招聘Python工程师标准>>> interface gtk makefile wrapper buffer methods 目录(?)[-] 本来以为这个东西只有在Atheros的平台上用的突然发现Ralink的平台也可以用甚至还看到还有老美把这个东西往android上移植看来是个好东西学习一下 官方…

一张图,看编程语言十年热度变化

作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国什么是 TIOBE 排行榜TIOBE 排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube 统计出排名数据&…

小扎的野心不止做社交 市政厅的上线说明了这一点

一个月前,扎克伯格刚在一封6千字长信里宣布了自己要做一个全球社区的理想,日前Facebook就上线了个叫“市政厅”的政务服务功能。 美国的用户在“市政厅”的功能页填写完自己的地理位置信息之后,可以看到当地政府官员的名单,包括美…

C#调用存储过程简单完整例子

CREATE PROC P_TEST Name VARCHAR(20), Rowcount INT OUTPUT AS BEGINSELECT * FROM T_Customer WHERE NAMENameSET RowcountROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: -------------…

高手的习惯:pythonic风格代码

来源 | Python大数据分析责编 | 寇雪芹头图 | 下载于视觉中国什么是pythonicpythonic是开发者们在写python代码过程中总结的编程习惯,崇尚优雅、明确、简单。就好比中文的笔画,讲究先后顺序,最符合文字书写的习惯。因为是习惯,不是…

计算机天才Aaron Swartz 名作 《如何提高效率》——纪念真正的“hacker!

如何提高效率 《HOWTO: Be more productive》(如何提高效率)作者:Aaron Swartz 肯定有人跟你说过这样的话,“你有看电视的那么长时间,都可以用来写一本书了”。不可否认写书肯定比看电视更好的利用了时间,但…

python的web压力测试工具-pylot安装使用

pylot是python编写的一款web压力测试工具。使用比较简单。而且测试结果相对稳定。 这里不得不鄙视一下apache 的ab测试,那结果真是让人蛋疼,同样的url,测试结果飘忽不定,看得人心惊肉跳,摸不着头脑。 下载 pylot官网&a…

快过HugeCTR:用OneFlow轻松实现大型推荐系统引擎

Wide & Deep Learning Wide & Deep Learning (以下简称 WDL)是解决点击率预估(CTR Prediction)问题比较重要的模型。WDL 在训练时,也面临着点击率预估领域存在的两个挑战:巨大的词表(Em…

路由的有类和无类

有类和无类路由1.通告时不以主类子网掩码通告,一条路由被通告出去的时候并没有自动汇总,而是以本身的子网掩码通告。即为无类路由。2.被通告的路由化成主类网络后和通告该路由的接口被化成主类网络后相比不是同一个网络,那么这台路由器就产生…

VS2005 常用快捷键

ShiftAltEnter: 切换全屏编辑CtrlB,T / CtrlK,K: 切换书签开关CtrlB,N / CtrlK,N: 移动到下一书签 CtrlB,P: 移动到上一书签 CtrlB,C: 清除全部标签CtrlI: 渐进式搜索 CtrlShiftI: 反向渐进式搜索CtrlF: 查找 CtrlShiftF: 在文件中查找F3: 查找下一个ShiftF3: 查找上一个CtrlH:…

2016政策与市场协同发力大数据,小公司如何搏杀BAT?

大数据这个词来到2016年,绽放出绚烂的光。 先看看最近几天的新闻:大数据分析腐败问题、大数据曝光基友的世界、大数据助交警查处多起毒驾……不仅仅是与经济相关,大数据正在渗透社会各个领域,与传统社会嫁接的大数据,正…

机器学习的第一个难点,是数据探索性分析

作者 | 陆春晖责编 | 寇雪芹头图 | 下载于视觉中国当我们在进行机器学习领域的学习和研究时,遇到的第一个难点就是数据探索性分析(Exploratory Data Analysis)。虽然从各种文献中不难了解到数据探索性分析的重要性和一般的步骤流程&#xff0…

Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结

1.Global.asax文件的处理形式不一样 转化后将出现错误,在vs2003中Global.asax具有代码后置文件,2.0下, 将代码分离文件移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。“Code-behind”属性将从 …

Robotium初探秘

2019独角兽企业重金招聘Python工程师标准>>> Getting started 如果想知道robotium是如何运行、什么样子的,就看下面的步骤。如果想自己新建一个robotium测试工程,点击 此处 要使用Robotium,需要把Robotium.jar放在测试工程的build…

初级Java程序员所面临的4大挑战

一、编码时间过长 作为入门级Java工程师,每周至少编程45小时,而且每个月会有1到2个星期工作50至60小时。从这些数字上看,过去几个月里每周工作将近50小时。80% –90%的工作时间都耗在了电脑前。这样的数字虽然表明了享…

javascript页面跳转常用代码

这东东最难记&#xff0c;每次需要时都是重新到Google上搜&#xff0c;真是烦死了&#xff0c;这回整理一下贴到这。 按钮式&#xff1a; <INPUT name"pclog" type"button" value"GO" onClick"location.hrefhttp://9ba.cn/"> 链…

frame,iframe,frameset之间的关系与区别

2019独角兽企业重金招聘Python工程师标准>>> ■ 框架概念 &#xff1a; 所谓框架便是网页画面分成几个框窗&#xff0c;同时取得多个 URL。只需要 <FRAMESET> <FRAME> 即可&#xff0c;而所有框架标记需要放在一个总起的 html 档&#xff0c;这个档案只…

最低售价17999元,华为发布新一代折叠屏手机Mate X2,将首批升级HarmonyOS

2019年&#xff0c;华为发布第一代折叠屏Mate X&#xff0c;开启了5G折叠屏手机新纪元&#xff1b;2020年&#xff0c;华为发布第二代折叠屏Mate Xs&#xff0c;实现了折叠屏手机从硬件到生态的演进。 2月22日&#xff0c;华为举行新一代折叠旗舰发布会&#xff0c;发布全新折…

「要拼就拼运维」5分钟一台?它让我爱上工作了!

高效运维轻松管理本文转自d1net&#xff08;转载&#xff09;

JavaScript去除字符串首尾空格

function trim(str) { return str.replace(//s/g,""); } javascript去除字符串空格的函数 function jtrim(s) { var i,b0,es.length; for(i0;i<s.length;i) //去左空格 if(s.charAt(i)! ){bi;break;} if(is…

server-send event object

http://jamie-wang.iteye.com/blog/1849193 event -- onmessage, onopen, onerror 不是方法&#xff0c;而是事件 http://school.youth.cn/px/lamp/2012/1130/38537.shtml http://www.ibm.com/developerworks/cn/web/1307_chengfu_serversentevent/index.html?cadrs http://bb…