网格分割

原文链接

网格分割是什么

网格由顶点和面组成,我们对网格顶点或者面的进行分类,就是网格分割。它是一个分类问题,而分类问题是机器学习里的经典问题。

分割需要对数据进行特征建模,这个建模方法可以是人工的,比如各种几何相关的特征构建;建模方法也可以是自动的,比如深度学习的特征学习方法。

分类的方法,可以是自动分类,比如无监督学习里的各种分类方法;也可以是监督学习,因为分类是一个很主观的问题,我们可以从学习集里学习到分类的标准;还有最近用的比较多的深度学习。下面这张图很好的给网格分割方法做了个分类。

Segmentation_Class

常见的几何特征

  • 曲率
  • 测地距离
  • 形状直径函数
  • 法线
  • 对称性
  • 凹凸性
  • 滑动分析
  • 图元属性
    mesh_attribute

监督学习的方法

网格分割是一个分类问题,有时候分类结果是很主观的。比如这个图形,我们可以有不同的分割结果,每个结果都有道理。具体选择哪一个结果,可能要根据具体的应用来决定。而监督学习的训练集,就可以很好体现出这种主观性。

segment_difres
常见的几何特征有非常多的种类,到底选择哪一种或者哪几种来进行分类,是个很头疼的问题。监督学习的方法,可以从训练集里学习出这种特征选择。比如下面这个学习方法(Learning 3D Mesh Segmentation and Labeling - Siggraph2010),不同的物体的分类,其几何特征的选择是不同的,并且几何特征在分类过程中的权重也是不同的。

segmentation_feature_selection
这类方法的讨论:

  • 虽然监督学习可以对特征进行选择,但是特征集合的创建对学习结果影响还是很大的。特征的创建需要有丰富领域知识经验的专家来创建。
  • 训练集的数量对训练结果影响很大。我们知道,三维数据集的数量级别是不大的。
  • 每次学习只能针对特定类型的模型进行分割,对于一般的模型分割,还是不行的。

交互式的分割方法

用户的分割意图,也可以通过交互来体现。比如这个例子,用户想分割出兔子的头,在兔头上画了一条蓝色的线,在兔子身上画了一条红色的线,得到了一个分割结果。这个结果不是很理想,于是用户再用红色的线标记了兔子身体,得到了期望的分割结果。

segmentation_interactive
交互的方法,需要尽量的简单,并且分割结果要进来的准确。这类分割问题一般采用图割的方法来分出前景和背景区域。比如下面是一些不同的交互方式。

segmentation_interactive_method

深度学习的方法

网格特征的建模,需要丰富的有经验的领域专家来设计。这其实是有一定的局限性的。深度学习可以直接进行端到端的学习,跨过领域特征建模这个模块。

end2endlearning
深度学习在图像分割领域发展了很多年了,已经很成熟了。一个直观的想法是直接应用图像分割的方法来对网格进行分割。图像和网格的信息结构是有差异的,图像是规则的二维矩阵,网格是不规则的图结构。那么最简单的可以把网格转化未规则的信息结构,比如把网格映射到二维图像,或者网格体素化。早些时候的网格深度学习方法就是采用的这些方法。最近几年,开始有直接把深度学习应用到不规则的信息结构上,比如三维点云,三维网格。

下面这个方法(MeshCNN: A Network with an Edge – Siggraph2019),就是直接在不规则的网格上进行深度学习:

  • 网格的边类比图像的像素。这样边有稳定的四邻域结构,可以定义卷积算子和Pooling算子。
    edgeaspixel
  • 边的特征信息为边的二面角+两个对角+两个边长比。这个特征信息类似图像像素的RGB值。
    edgefeature
  • Pooling算子采用了网格简化的方法,边简化的顺序跟学习目标相关。比如下面这个例子,上面一排的简化顺序用于识别花瓶是否有把手;下面一排的简化顺序用于识别花瓶是否有瓶颈。
    edge_pooling_target
  • 下面是一个人体分割的例子
    segmentation_human_result
    有兴趣的读者,欢迎参考视频版本
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在QGraphicsView中添加网格,可以通过以下步骤实现: 1.在QGraphicsView中添加一个QGraphicsScene,设置好场景的大小和背景颜色。 2.设置QGraphicsView的网格样式和线条颜色,可以使用QPen类来设置。 3.在QGraphicsScene中添加一个QGraphicsItemGroup,将网格线添加到该组中。 4.使用QGraphicsScene的addItem()函数将该组添加到场景中。 下面是一个简单的示例代码,用于在QGraphicsView中添加一个点阵网格: ``` QGraphicsScene *scene = new QGraphicsScene(this); scene->setSceneRect(0, 0, 800, 600); // 设置场景大小 scene->setBackgroundBrush(QColor(240, 240, 240)); // 设置背景颜色 QGraphicsItemGroup *gridGroup = new QGraphicsItemGroup(); QPen gridPen(Qt::lightGray, 1, Qt::DotLine); for (int i = 0; i < scene->width(); i += 10) { QGraphicsLineItem *line = new QGraphicsLineItem(i, 0, i, scene->height()); line->setPen(gridPen); gridGroup->addToGroup(line); } for (int j = 0; j < scene->height(); j += 10) { QGraphicsLineItem *line = new QGraphicsLineItem(0, j, scene->width(), j); line->setPen(gridPen); gridGroup->addToGroup(line); } scene->addItem(gridGroup); ui->graphicsView->setScene(scene); ``` 该代码创建了一个800x600的场景,并设置了浅灰色的背景。然后,使用QPen类创建了一个灰色的点线网格样式,并在场景中添加了一个QGraphicsItemGroup,将所有网格线添加到该组中。最后,将该组添加到场景中,并将场景设置为QGraphicsView的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值