点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
编者荐语
近年来,深度学习领域关于图神经网络(Graph Neural Networks,GNN)的研究热情日益高涨,图神经网络已经成为各大深度学习顶会的研究热点。GNN处理非结构化数据时的出色能力使其在网络数据分析、推荐系统、物理建模、自然语言处理和图上的组合优化问题方面都取得了新的突破。
作者丨摸鱼家@知乎
链接丨https://zhuanlan.zhihu.com/p/427533727
写在前面
之前的工作主要是基于CNN和RNN在做,前段时间因为项目需要,相对系统的了解一下图神经网络,包括理论基础,代表性的GNN(GCN, GraphSAGE和GAT)以及它的一些应用。GNN主要是应用在一些存在复杂关系的场景中,比如推荐系统,社交网络,分子结构等,在CV中并不主流。但它在CV和医学图像分析中也有被用到,本文主要是针对GNN的原理及其在这两方面的应用简单做个分享,主要是由之前在组会上分享过的PPT内容整理而成。
01
Graph基础
先简单介绍一下graph一些基础的东西,为了衔接后续的论文,这里就以Cora数据集为例进行介绍。Cora可以简单理解成CV中的手写字符MNIST数据集,是个入门级的graph数据集。
图的构成: 图由顶点 (Vertex) 和边 (Edge) 组成。在Cora数据集中,包含了2708篇论文,每篇论文作为一个vertex,相互引用关系构成图节点的连接关系edge。
![d9462884e0bd31827f09ef84845520cc.jpeg](https://i-blog.csdnimg.cn/blog_migrate/b027bce48884095207f3a55d47de485c.jpeg)
一个有向图
图的表示:那么图如何像图像一样用矩阵来表示呢。这里涉及到两个部分:顶点特征,邻接矩阵。
顶点特征:在Cora数据集中,每个顶点有1433维的特征,表示是否包含某个单词(paper的内容)。
![cdfcc41ee5d09ae2a22d0f2100aa0835.jpeg](https://i-blog.csdnimg.cn/blog_migrate/28e27357886e9476f3ecb41bffbe4743.jpeg)
顶点特征矩阵
邻接矩阵:顶点之间的连接关系通过邻接矩阵来表示。
![06d8d6c7ac0264fc42ebc14a07d7667d.jpeg](https://i-blog.csdnimg.cn/blog_migrate/9be9649b01fb05bf949c7927149cc431.jpeg)
一个简单的无向图及其邻接矩阵
02
图神经网络GNN
2013年首次提出图上的基于频域(Spectra)和基于空域(Spatial)的卷积神经网络。2016,2017有比较大的突破,开始成为研究热点。GCN,GAT,GraphSAGE是比较经典也是最常用的几个基础算法。下面我会分别介绍这3个工作,为了方便分析比较,就以图节点分类任务为例进行介绍。
2.1. 节点分类任务
以Cora数据集为例,它包含2708篇论文,每篇论文属于8个类别中的一类。其中一部分节点有类别标签,一部分没有,现在就是要通过训练GNN,来对没有类别标签的节点进行分类。
![dd6470ad4ebfb0d2d9a2fce6c4d4f8bc.jpeg](https://i-blog.csdnimg.cn/blog_migrate/8d555f4e5cad2721fc775e235734ccf7.jpeg)
顶点分类任务,蓝色有标签,白色没标签
2.2. GCN
ICLR 2017
Paper: Semi-Supervised Classification with Graph Convolutional Networkshttps://arxiv.org/abs/1609.02907
Code: https://github.com/tkipf/gcn
GCN全称Graph Convolutional Networks [1],刚开始看论文会觉得有点不好懂,但结合这代码来看,还是比较容易理解的,代码的实现也很简单。假设输入是顶点特征X (2708,1433)和邻接矩阵A (2708,2708),下面是一个GCN layer的示意图及公式。
![8f0dcd3268ba3c1f4ff960a72366489a.jpeg](https://i-blog.csdnimg.cn/blog_migrate/5396dac92c770c2bdfa67721b6d9f747.jpeg)
Step 1: 首先进行特征变换,将每个节点的1433维特征变换为16维(可选),变换是通过权重W进行的,下面是示意图,很好理解。
![72a27fe855d31d1bf7a6c2db6cc0491c.jpeg](https://i-blog.csdnimg.cn/blog_migrate/3cc39adb4c837db17ea84fb12e111e7e.jpeg)
Step 2: 特征变换之后根据图的连接关系更新顶点特征,这一步就需要用到邻接矩阵的,当前节点的特征更新为其相连节点特征之和,同样用一个简单的示意图。
![dd19079ebf13b716645b7a168e1914d1.jpeg](https://i-blog.csdnimg.cn/blog_migrate/c6c95946d23f4ac741a8cc6893bde1a4.jpeg)
上面两步其实就是一层GCN的操作,先对每个节点单独进行特征变换,再通过聚合相连节点的特征更新每个节点特征。当多叠加几层GCN的时候,感受野会变大,也就是每个节点的特征不止与一级节点有关,还会考虑多级节点特征。
![da81cf509d325d9307a27076d815bac4.png](https://i-blog.csdnimg.cn/blog_migrate/0f358acad1ad16fcd43ecc7cf51d0676.png)
多层GCN操作
2.3. GAT
ICLR 2018
Paper: Graph Attention Networkshttps://arxiv.org/abs/1710.10903
Code: https://github.com/PetarV-/GAT
GAT [2] 和GCN其实很相似,不同点在于GCN在第二步更新节点特征时,相连节点取一样的权重,这一步没有考虑到不同节点的不同重要性。GAT主要就是根据这一点来改进的。所以最关键的一步就是获得不同相邻节点对中心节点的重要性权重。
Step 1: 第一步和GCN一样,还是进行特征变换,将节点特征从1433维变为16维, 即Wh。
![2d8681539b87501d3cb75878a9ed11bd.jpeg](https://i-blog.csdnimg.cn/blog_migrate/ced3dbd706e411edc930d51b0389da6c.jpeg)
Step 2:第二步就是最关键获取权重的过程。首先对于一个节点a,求每个其他节点和该节点的相关性,下面是具体的公式:
![e2235d670a3af7d7dfe244de374e130e.jpeg](https://i-blog.csdnimg.cn/blog_migrate/f1c5a4cea37d5ee370e8b4b7aeee7b1c.jpeg)
这个公式的意思是把经过变换后的当前节点的特征分别和其他所有节点的特征进行concat,经过一个FC层,得到的就是每个节点和当前节点的相关性。公式中的a()可以理解成是FC操作。一共2708个节点(包括自身),所以对于该节点可以得到2708个相关系数。每个节点都求和其他节点的相关系数,所以可以得到一个[2708, 2708]的矩阵,即相关性矩阵,将这个矩阵和邻接矩阵逐点相乘,相当于忽略掉不相邻节点的影响,最后将这个矩阵进行归一化得到最终的权重矩阵:
![0f4905c86b7e24086f114540d0bf539e.png](https://i-blog.csdnimg.cn/blog_migrate/26665e5720e0646fb8763237508d81db.png)
Step 3:最后就用新得到的权重矩阵更新每个节点的特征。可以看到就是比GCN多了上面这一步。
![0a3503a894a54d0862784a425d13561d.jpeg](https://i-blog.csdnimg.cn/blog_migrate/f4dc4b6c5c1d38fa006e4be6e2ba6dca.jpeg)
2.4. GraphSAGE
NIPS 2017
Paper: Inductive Representation Learning in Large Attributed Graphshttps://arxiv.org/abs/1710.09471
Code: https://github.com/KimMeen/GraphSage
GraphSAGE主打的是归纳式学习,而GCN是直推式学习,这两者的区别这里就不展开了。主要的应用场景是对于工业场景中非常大的图,GCN和GAT都是整图训练,GraphSAGE是通过采样在子图上训练,对于内存要求更小。原理上和GCN并没有太大差别,唯一的区别就是GraphSAGE里面增加了一个采样的过程。具体流程是:先进行图采样(包含一阶和二阶),然后在子图上进行特征聚合(更新中心节点的embedding),最后对中心节点进行分类。还是比较好理解的,具体的实现结合代码看会比较容易理解。
![310e92efa4200c5ccf7ed4039c8c8639.jpeg](https://i-blog.csdnimg.cn/blog_migrate/576a16e6eb3c97cc04080a3256f2e3c4.jpeg)
03
GNN在图像处理领域的应用
GNN主要是引用在一些存在复杂关系的场景中,比如推荐系统,社交网络,分子结构等,在CV中并不主流。原因在于GNN的优势是关系建模和学习,而图像这种规则的东西天然的并不适合GNN。但CV/医学图像分析中还是围绕GNN做了一些工作。就像上面提到的,在CV场景中使用GNN,关键在于graph如何构建:顶点及顶点特征是什么?顶点的连接关系怎么定义?根据图的构建方式,下面要介绍的工作大致可分为两大类:
GNN在图像分类中的应用
GNN在分割/重建中的应用
3.1. 在分类中的应用
3.1.1 用于3D医学图像的分类(UG-GAT)
MedIA 2021
Paper: Uncertainty-guided graph attention network for parapneumonic effusion diagnosis - ScienceDirecthttps://www.sciencedirect.com/science/article/abs/pii/S1361841521002620?dgcid=coauthor
Code: https://github.com/iMED-Lab/UG-GAT
这一篇是基于医学图像进行疾病分类的,和3.1.2不同的地方在于graph的构建方式。上一篇是一个病人作为一个节点,所有病人构成一张大图,这样的缺点是每次有新的数据进来都要重新训练。在这篇文章中,每个病人构成一个graph,每个节点是一个slice,算是代替3D CNN的一种方式。
![5a8514775494c7d5817c9dfcb1191457.jpeg](https://i-blog.csdnimg.cn/blog_migrate/f71d255285497ff04621d19e85b199e9.jpeg)
这篇文章的另一个创新点是在GAT中引入了不确定性,因为每个slice的信息量及其对整个volume分类的贡献度是不一样的,在GAT学习的过程中引入不确定性有助于提升分类精度。
![f59961b504ed365a9633c89ef4eaef8a.jpeg](https://i-blog.csdnimg.cn/blog_migrate/3bccc33dc2c0556d567c3361e215a201.jpeg)
文章采用(B)来构建图
3.1.2 医学图像-AD预测
MedIA 2018
Paper: Disease prediction using graph convolutional networks: Application to Autism Spectrum Disorder and Alzheimer’s disease - ScienceDirecthttps://www.sciencedirect.com/science/article/abs/pii/S1361841518303554
Code: 未公开
这篇文章是GNN在医学图像中的应用,和前面例子中提到的半监督任务很相似。每个病人是一个节点,节点特征是CNN得到的图像特征,连接关系根据非图像。
![b7db402a5653968fc939ea7f34747d31.jpeg](https://i-blog.csdnimg.cn/blog_migrate/96792659e8f58a723c0fb77b2286a8fb.jpeg)
之后利用GCN来训练图,其中一部分病人(节点)是有疾病label的,一部分没有,通过labeled data约束预测无labeled data的疾病类别。
![9be79ea6f483b93f123d09b2f62c03f5.jpeg](https://i-blog.csdnimg.cn/blog_migrate/4be1f8904d5c8e171dc87a4b1db72c44.jpeg)
3.1.3 Multi-Label Image Recognition
CVPR 2019
Paper: CVPR 2019 Open Access Repository (thecvf.com)https://openaccess.thecvf.com/content_CVPR_2019/html/Chen_Multi-Label_Image_Recognition_With_Graph_Convolutional_Networks_CVPR_2019_paper.html
Code: 未公开
这篇文章的任务是图片多标签预测,一个图片中可能含有n个类比,传统的做法是使用CNN后面接n个二分类器,预测是否含有该类。在这篇文章,作者将图卷积用到了该任务中,除了CNN之外,作者希望图的结构能够建模不同标签之间的关系,从而对分类起到辅助作用。
![4cf9a61cc0d0faafbcde55b4045c69c9.jpeg](https://i-blog.csdnimg.cn/blog_migrate/c1dd12494a993c7e26c29c25ce8cf72c.jpeg)
在这篇文章中,graph是基于label来构建的,每一类是图的一个节点,节点特征是该label的词向量embedding,类别间存在连接关系,也是这篇文章中重点介绍了的。构建好图之后,送入GCN,每个节点最终的输出是2048*1的向量。CNN用来提取图像特征,最后一层是2048*1的feature。将graph每个节点(代表一个类别)的向量和CNN特征相乘,得到该类的概率。
![13f4ca9f64034a9dbf5bcf75112ce14f.jpeg](https://i-blog.csdnimg.cn/blog_migrate/215df0a1e960fd96b6b0ebf8e84fb745.jpeg)
至于构建graph时节点的连接关系,是根据每两个label同时出现的概率得到的。
![6a56a533e2933f9ecf736f9598e665dd.jpeg](https://i-blog.csdnimg.cn/blog_migrate/34bd373ca04940a48035c7db027368c9.jpeg)
3.1.4 其他疾病分类
还有两篇医学图像分类的文章就和第一篇很相似了,就不做具体介绍了。
![a259b145f93825e0e1a1a765c142761a.jpeg](https://i-blog.csdnimg.cn/blog_migrate/71f4f2147a0af6c9a52bd30363840f35.jpeg)
3.2. 在分割/重建中的应用
3.2.1 Curve-GCN
CVPR 2019
Paper: CVPR 2019 Open Access Repository (thecvf.com)https://openaccess.thecvf.com/content_CVPR_2019/html/Ling_Fast_Interactive_Object_Annotation_With_Curve-GCN_CVPR_2019_paper.html
Code: 未公开
这篇文章的任务是基于GCN做交互式标注,将mask轮廓用边缘来表示,边缘就是graph。
![5ad4d806f910a7a412e38e5bc7b6bc03.jpeg](https://i-blog.csdnimg.cn/blog_migrate/29c1745f16cf340ce27434ceac8c2a19.jpeg)
本文的任务是使用GNN来进行交互式标注
之前也提到了,在图像中使用graph结构,关键就是graph怎么构建。这篇文章中初始化节点的连接关系就是一个椭圆形状,节点的特征由CNN提供。将构建好的初始化图给到GCN,GCN的作用是预测每个节点的坐标值,即每个node最终有两个坐标,代表其在图像中的位置,这些点连接起来的形状就是物体的轮廓。
![78d7ec84877dd85545d63075e1240bc5.jpeg](https://i-blog.csdnimg.cn/blog_migrate/973742b47e153afe89b1dffd4b512449.jpeg)
loss函数方面包含两部分,一个是每个点的坐标约束,为了避免过度平滑,还是用了一个基于mask的约束,就是将坐标转换为mask,对mask进行L1约束。
![16cb3190cd45881caeb0663faf5e552f.jpeg](https://i-blog.csdnimg.cn/blog_migrate/7b4c32bb411226a21104b105e445f33b.jpeg)
3.2.2 Pixel2Mesh
ECCV 2018
Paper: ECCV 2018 Open Access Repository (thecvf.com)https://openaccess.thecvf.com/content_ECCV_2018/html/Nanyang_Wang_Pixel2Mesh_Generating_3D_ECCV_2018_paper.html
Code: https://github.com/nywang16/Pixel2Mesh
这篇文章也是比较有名的,还有一个续作Pixel2Mesh++,思路差不多。这篇文章的思路是通过2D图像直接生成3D Mesh。
![cbea68d3a30ce708f8b511174611a8e2.jpeg](https://i-blog.csdnimg.cn/blog_migrate/c9d1d24d341f4ccf04e04c3c5a95835a.jpeg)
关键还是graph,和上一个工作思路类似,将一个椭圆作为初始化的图,CNN提取特征作为节点特征,送入GCN预测每个节点的坐标。生成的过程是coarse-to-fine,经过3次预测,每个节点的数量慢慢增加。
![0623c971bd902747d684ac27e798bc7b.jpeg](https://i-blog.csdnimg.cn/blog_migrate/474d1e3cd7ad76e8b8b6f0ad7bc189c0.jpeg)
3.2.3 分割-One shot learning
MICCAI/TMI 2020;TMI 2020
Paper: Learning to Segment Anatomical Structures Accurately from One Exemplar | SpringerLinkhttps://link.springer.com/chapter/10.1007/978-3-030-59710-8_66
Code: 未公开
这篇文章是做医学图像的分割,具体来说是One shot learning,即只有一张有标注的label。实际做法和上一篇文章很相似,先给一个初始graph, CNN提取特征作为节点特征,唯一的label作为初始轮廓。GCN来预测每个点相对初始轮廓的偏移量,本质也是坐标回归。
![eb1e2a297dbae8aaa5e37b9d1bc4173f.jpeg](https://i-blog.csdnimg.cn/blog_migrate/146cfba14eb1788be6b05cfeb73cf1cc.jpeg)
3.2.4 语义分割
IJCAI 2018
Paper: View-volume Network for Semantic Scene Completion from a Single Depth Imagehttps://arxiv.org/abs/1806.05361
Code: 未公开
这篇文章的任务是利用深度图来进行2D图像的语义分割。
![d1ba5e79ba370e951d335ee0ff03494c.jpeg](https://i-blog.csdnimg.cn/blog_migrate/7224a439448b4f434653dcccda0e5619.jpeg)
04
小结
GNN是针对graph来进行学习,所以关键的在于graph是什么来自哪里。Graph的优势是对关系的建模,在图像处理中要应用GNN,最关键的还是graph怎么构建。
图像分割因为是pixel-level的分类,CNN明显是更适合的,上面的一些工作也可以看出,用GNN做分割或重建还是一些辅助性的或对精度要求不那么高的场景,实际的实验也发现,GNN很难得到非常精确边缘,只能得到大致的轮廓。
相比而言,分类问题会更适合GNN发挥所长,特别是存在多模态输入的时候,graph对于关系的建模和GNN的学习能力会起到很好的作用。
本文仅做学术分享,如有侵权,请联系删文。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~