DGCNN网络学习

啊,学完PointNet和PointNet++入门,学点新网络,打个基础。DGCNN这个网络现在感觉好简单,但是效果又很不错,能发一篇不错的论文,真羡慕啊,要是我当时也搞这个,能发一篇这种文章,应该也很爽吧,奖学金我高低也能有点。

1.前言

DGCNN(Dynamic graph CNN)动态图卷积网络,这个用PointNet++网络对比的话,会比较容易理解,他的独到之处。

根据我之前的文章啊,PointNet++网络学习-CSDN博客,PointNe++这个是每一个SA模块中,会对当前输入的所有点,划分成N个区域,每个区域由采样点和其附近的点组成。N个区域内的点、点对应的特征进行组合计算。

DGCNN呢,简单粗暴的一,直接对所有点找附近距离最近的K个点进行组合,第一层的EdgeConv还是对点xyz进行组合计算,后续的是直接对高维特征进行相似度最近的K个进行组合计算。这样有啥区别呢,见小D的释义:

也就是说DGCNN的领域是动态的,PointNet++设定是点空间上附近的领域,而DGCNN是特征近似度最高的领域,它在空间上的位置是随机的、动态的。

2 Graph Feature

理解了Graph Feature这个部分,DGCNN的关键也就清楚了,后面就是老一套的卷积神经网络了,详见实现代码。

第一步,先计算所有点和本点之间的欧式距离排序,从小到大,得到每个点对应距离最近的K个点的索引位置:

python 复制代码
    #距离矩阵用平方欧氏距离 ||x_i - x_j||^2 = ||x_i||^2 + ||x_j||^2 - 2 x_i·x_j    
    B, C, N = x.shape
    # 内积矩阵: (B, N, N)
    inner = -2 * torch.matmul(x.transpose(1, 2), x)                # -2 x_i · x_j
    # ||x_i||^2, ||x_j||^2
    xx = torch.sum(x ** 2, dim=1, keepdim=True)                     # (B, 1, N)
    pairwise_distance = -xx - inner - xx.transpose(1, 2)             # (B, N, N) 负平方距离 (topk 找最大等价于找最小距离)
    # 取距离最小的 k 个 -> (B, N, k), 返回索引
    idx = pairwise_distance.topk(k=k, dim=-1)[1]                    # (B, N, k)

第二步,将每个点的领域K个点组合起来,得到(B,N,K,C),之后再计算每个点和领域内K个点之间的特征差值,并进行拼接得到(B,N,K,2C):

python 复制代码
    #  gather 出所有邻居
    neighbors = x_flat[idx, :].view(B, N, k, C)                     # (B, N, k, C)

    # 自身特征广播到 (B, N, k, C), 与邻居差分拼接

    feature = torch.cat((neighbors - x_expanded, x_expanded), dim=3)  # (B, N, k, 2C)

3. EdgeConv

EdgeConv刚开始看到这个名字的时候,再想是啥高级卷积,Edge在哪,后面看代码实现和AI解释确实非常简单,就是计算组合了特征计算边向量了。

4.结语

简单粗暴又有效,厉害。但也有点弊端吧,显而易见的容易显存爆炸。后面针对这个问题改进加了个FPS就能发CVPR?哇哦,应该没有AI说的这么简单吧,羡慕啊~

相关推荐
晓梦林7 小时前
BUUCTF findKey-学习笔记
笔记·学习
0566468 小时前
agent学习Day15——SQLAlchemy 查询过滤、分页与历史列表接口
python·学习·fastapi
炎武丶航10 小时前
汽车功能测试学习(1):FCW前方碰撞预警
功能测试·学习·汽车
qq_1851986916 小时前
SpingBoot3入门学习一
学习
噗噗夹的TA之旅16 小时前
Shader 学习 21:自定义 Render Feature
学习·游戏·unity·c#·游戏引擎·图形渲染
码农小韩17 小时前
AIAgent应用开发——大模型理论基础与应用(七)
python·学习·ai·大模型·agent
流云鹤18 小时前
05Java学习day(5)
java·学习
only-lucky18 小时前
QML深入学习五(Controls模块)
前端·javascript·学习
Yolanda_202218 小时前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习