drprojects / superpoint_transformer

Official PyTorch implementation of Superpoint Transformer introduced in [ICCV'23] "Efficient 3D Semantic Segmentation with Superpoint Transformer" and SuperCluster introduced in [3DV'24 Oral] "Scalable 3D Panoptic Segmentation As Superpoint Graph Clustering"
MIT License
527 stars 68 forks source link

What's the possible parameters that have a potential effect on superpoint preprocessing? #134

Closed Wind010321 closed 2 weeks ago

Wind010321 commented 3 weeks ago

Hi, I have some questions about the pre-processing of superpoints: The first figure is my expect figure of the superpoints(i.e. the superpoints are more bigger)

SPG

After using SPT's data preprocess, I can get P1-P3's superpoints, for P2 superpoint as below:

SPT-002

What possible parameters settings can be changed to make the superpoints larger? Are the following parameters related to superpoint enlargement:pcp_cutoff, pcp_regularization, pcp_spatial_weight? Or are there any other relevant parameters? This will help me better understanding of SPT's superpoint generation. Thank you!

MenglinQiu commented 3 weeks ago

According to my experiments, if the input scene is the same, the regularization term 'pcp_regularization' has the greatest impact, followed by the pcp_spatial_weight, and the cutoff has the least impact. But the geometric partitioning of SPT is actually a hierarchical input, that is, the output of the previous level is the input of the partitioning of the next level. It is unknown whether this rule still exists at this case. I recommend reading the author's article on cut-pursuit.

Wind010321 commented 3 weeks ago

According to my experiments, if the input scene is the same, the regularization term 'pcp_regularization' has the greatest impact, followed by the pcp_spatial_weight, and the cutoff has the least impact. But the geometric partitioning of SPT is actually a hierarchical input, that is, the output of the previous level is the input of the partitioning of the next level. It is unknown whether this rule still exists at this case. I recommend reading the author's article on cut-pursuit.

Thank you very much!

另外,你知道如何评价生成超点的质量高低吗? 我现在将这个方法用在别的框架内,但是本方法的超点生成与别的框架对应的方法相比,在最后的性能上是较差的;但是理论上应该更好,出现了矛盾。我想移植这个方法,并使得最后的性能有所提升, 你觉得在生成超点质量上,可以关注哪些方面?或者可以关注哪些参数?(例如之前问题提到的那几个参数) 另外您建议阅读的文章,是哪一篇呢?

MenglinQiu commented 3 weeks ago

超点质量的评价在作者的ssp-spg这篇文章中有提及。你可以参考。其实你可视化了不同层级的过分割结果可以大致看出,SPT的贡献不在于它的过分割有多么精确,而是其层次化的基于超点图的注意力特征提取,通过UNet结构实现特征融合。因为哪怕是spt-3,使用了三层过分割,其最主要的分类特征其实还是来自于第一层过分割。而第一层过分割实际上和体素化的效果类似,因为每个segment其实相当小,只不过相比于体素规则的切割方式,cut-pursuit可以在不规则的物体边界处根据几何特征分的更好(存疑)?但可以知道的是,在数据规模(node数量)相近时,spt的过分割结果的语义上限更高(文中的图6)。 至于更多的详细相关内容,建议了解以下这位老哥(第三位作者Loic Landrieu)的工作。超点图点云分割顺着他的做法来的(cut-pursuit for point clouds segmentation、spg、ssp-spg、spt)。另外还有荷兰TU Delft的高博士和南亮亮教授的PSSNets,这篇文章和ssp-spg的研究动机是类似的,只不过是在网格上,也有涉及过分割超点质量的评价。 Cut Pursuit: Fast Algorithms to Learn Piecewise Constant Functions on Weighted Graphs](http://epubs.siam.org/doi/abs/10.1137/17M1113436 cut-pursuit文章比较难懂,偏数学。要想了解它的超参对结果的影响,可以结合这三篇文章看(cut-pursuit for point clouds segmentation、spg、ssp-spg),和spt用的过分割方法一样,只是spt中是并行的。

Wind010321 commented 3 weeks ago

好的谢谢哥! 我有个疑问:我之前方法用的是 spg ,现在我换成spt 去过分割生成超点,到最后都是将:点云中的每个点所对应的超点的序号输入进网络,但是新方法 spt 对应的实验性能就是差(miou 差 5 个点左右); 请问以你的理解,这是我没有用到 spt 的层级结构还是需要进一步调参呢?(我觉得不是层级结构的影响,因为我用 spt level 1 超点,效果应该相当,但是依然差几个点) 请哥帮忙简单分析一下,谢谢您啦

MenglinQiu commented 3 weeks ago

如果你的后端网络(语义分割)是相同的,那么你试着先评估以下spg的过分割结果和spt的过分割结果两者的语义上界是否接近。另外,我没太理解“到最后都是将:点云中的每个点所对应的超点的序号输入进网络”这句话,是否说明,你只是用到了过分割的超点序号,特征和图结构(如果需要)是你自己单独定义的? 因为spg的超点图构建和spt默认的方式是有区别的。超边特征计算也是有区别的。

Wind010321 commented 3 weeks ago

谢谢哥

  1. 请问怎么评估过分割结果的语义上界呢?(刚刚接触过分割)
  2. 只用到了超点序号(这个是用来计算每个超点的特征的),超点特征是通过计算其所包含所有点的特征平均值获得(点特征是通过 3D unet 提取,获得超点特征后,以后的计算都是用的超点特征);图结构应该没有用到;
MenglinQiu commented 3 weeks ago

谢谢哥

1. 请问怎么评估过分割结果的语义上界呢?(刚刚接触过分割)

2. 只用到了超点序号(这个是用来计算每个超点的特征的),超点特征是通过计算其所包含所有点的特征平均值获得(点特征是通过 3D unet 提取,获得超点特征后,以后的计算都是用的超点特征);图结构应该没有用到;

过分割结果返回了每个点所属的超点索引,通过点的标签可以知道每个超点的标签(取众数就好了),超点内的所有点都视为同一类别(因为一般基于超点的网络最终预测的是超点的标签,如果超点中包含不同类别的点,那么语义上届就会受影响),再根据这两组数据(点标签gt,由超点标签得到的每个点标签),算混淆矩阵,计算一下mIoU就行了。

MenglinQiu commented 3 weeks ago

谢谢哥

1. 请问怎么评估过分割结果的语义上界呢?(刚刚接触过分割)

2. 只用到了超点序号(这个是用来计算每个超点的特征的),超点特征是通过计算其所包含所有点的特征平均值获得(点特征是通过 3D unet 提取,获得超点特征后,以后的计算都是用的超点特征);图结构应该没有用到;

过分割结果返回了每个点所属的超点索引,通过点的标签可以知道每个超点的标签(取众数就好了),超点内的所有点都视为同一类别(因为一般基于超点的网络最终预测的是超点的标签,如果超点中包含不同类别的点,那么语义上届就会受影响),再根据这两组数据(点标签gt,由超点标签得到的每个点标签),算混淆矩阵,计算一下mIoU就行了。

如果你的方法只是需要超点作为特征聚合的指导索引,最终预测的对象是每个点,而不是超点。那么你就需要考虑超点的纯净度问题。而不是语义上届。虽然两者紧密关联(超点越纯净,语义上届就越高)。

Wind010321 commented 3 weeks ago

谢谢哥

1. 请问怎么评估过分割结果的语义上界呢?(刚刚接触过分割)

2. 只用到了超点序号(这个是用来计算每个超点的特征的),超点特征是通过计算其所包含所有点的特征平均值获得(点特征是通过 3D unet 提取,获得超点特征后,以后的计算都是用的超点特征);图结构应该没有用到;

过分割结果返回了每个点所属的超点索引,通过点的标签可以知道每个超点的标签(取众数就好了),超点内的所有点都视为同一类别(因为一般基于超点的网络最终预测的是超点的标签,如果超点中包含不同类别的点,那么语义上届就会受影响),再根据这两组数据(点标签gt,由超点标签得到的每个点标签),算混淆矩阵,计算一下mIoU就行了。

如果你的方法只是需要超点作为特征聚合的指导索引,最终预测的对象是每个点,而不是超点。那么你就需要考虑超点的纯净度问题。而不是语义上届。虽然两者紧密关联(超点越纯净,语义上届就越高)。

好的感谢您! 我介绍以下几点:

  1. 我的模型最后的预测,是汇集 “通过阈值化操作的超点” -> 获得这些超点所包含的所有原始点。换句话说,最终预测对象是每个点(超点纯度会影响结果)
  2. 我之前的方法,用的是该链接所对应的方法

请问您:

  1. 这个项目(SPT)的超点提取方法,您觉得直接拿来用(只用某一层超点),最后经过一些调整,会比以上链接的方法(SPG)好吗?
  2. 您有一些更好的超点提取方法推荐吗?

再次感谢您抽取宝贵时间回答我的问题!

Wind010321 commented 3 weeks ago

谢谢哥

1. 请问怎么评估过分割结果的语义上界呢?(刚刚接触过分割)

2. 只用到了超点序号(这个是用来计算每个超点的特征的),超点特征是通过计算其所包含所有点的特征平均值获得(点特征是通过 3D unet 提取,获得超点特征后,以后的计算都是用的超点特征);图结构应该没有用到;

过分割结果返回了每个点所属的超点索引,通过点的标签可以知道每个超点的标签(取众数就好了),超点内的所有点都视为同一类别(因为一般基于超点的网络最终预测的是超点的标签,如果超点中包含不同类别的点,那么语义上届就会受影响),再根据这两组数据(点标签gt,由超点标签得到的每个点标签),算混淆矩阵,计算一下mIoU就行了。

如果你的方法只是需要超点作为特征聚合的指导索引,最终预测的对象是每个点,而不是超点。那么你就需要考虑超点的纯净度问题。而不是语义上届。虽然两者紧密关联(超点越纯净,语义上届就越高)。

好的感谢您! 我介绍以下几点:

  1. 我的模型最后的预测,是汇集 “通过阈值化操作的超点” -> 获得这些超点所包含的所有原始点。换句话说,最终预测对象是每个点(超点纯度会影响结果)
  2. 我之前的方法,用的是该链接所对应的方法

请问您:

  1. 这个项目(SPT)的超点提取方法,您觉得直接拿来用(只用某一层超点),最后经过一些调整,会比以上链接的方法(SPG)好吗?
  2. 您有一些更好的超点提取方法推荐吗?

再次感谢您抽取宝贵时间回答我的问题!

我觉得:针对第一个疑问,我的实验结果受到超点纯度的影响,那么SPT的level 1细粒度超点,对于最后是有帮助的(会比链接方法好一些)? 相比于大的超点(纯度受到影响),这种小超点比较纯净? 针对第二个疑问,我发现现在使用超点处理点云的方法,链接方法偏向于即插即用的那种,能更好的适用;像SPT最后达到的性能,也是通过类似于UNet的层级结构,叠加buff实现的。 不知道有没有更好的即插即用的方法?

MenglinQiu commented 3 weeks ago

谢谢哥

1. 请问怎么评估过分割结果的语义上界呢?(刚刚接触过分割)

2. 只用到了超点序号(这个是用来计算每个超点的特征的),超点特征是通过计算其所包含所有点的特征平均值获得(点特征是通过 3D unet 提取,获得超点特征后,以后的计算都是用的超点特征);图结构应该没有用到;

过分割结果返回了每个点所属的超点索引,通过点的标签可以知道每个超点的标签(取众数就好了),超点内的所有点都视为同一类别(因为一般基于超点的网络最终预测的是超点的标签,如果超点中包含不同类别的点,那么语义上届就会受影响),再根据这两组数据(点标签gt,由超点标签得到的每个点标签),算混淆矩阵,计算一下mIoU就行了。

如果你的方法只是需要超点作为特征聚合的指导索引,最终预测的对象是每个点,而不是超点。那么你就需要考虑超点的纯净度问题。而不是语义上届。虽然两者紧密关联(超点越纯净,语义上届就越高)。

好的感谢您! 我介绍以下几点:

1. 我的模型最后的预测,是汇集 “通过阈值化操作的超点” -> 获得这些超点所包含的所有原始点。换句话说,最终预测对象是每个点(超点纯度会影响结果)

2. 我之前的方法,用的是[该链接所对应的方法](https://github.com/Karbo123/segmentator)。

请问您:

1. 这个项目(SPT)的超点提取方法,您觉得直接拿来用(只用某一层超点),最后经过一些调整,会比以上链接的方法(SPG)好吗?

2. 您有一些更好的超点提取方法推荐吗?

再次感谢您抽取宝贵时间回答我的问题!

第一点,你说的这两个方法我都尝试过。但我没有具体比较他们的差异。如果没记错的话,两者都是图割相关,但是cut-pursuit可以根据更丰富的特征,根据能量最小化量化节点的差异,度量更精细,而后者只是坐标偏移和法向量计算边权重,最后根据阈值划分。理论上cut-pursuit效果会更好。关于第二点我也没有更好的建议。

Wind010321 commented 3 weeks ago

好的感谢哥,如您所说,理论上 SPT 更优; 针对我的预测最后是精确到点,我可以考虑哪些方面去提高超点纯净度问题呢?或者您有什么推荐的论文我去自学一下? 再次感谢您!

TaugenichtsZZY commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

MenglinQiu commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

TaugenichtsZZY commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

感谢您的回复!我尝试过修改dales_config.py中 TILES字典中的'test'项的内容,但在运行notebook的时候会在预处理时报keyerror: `KeyError Traceback (most recent call last) Cell In[5], line 7 1 # import os 2 # os.environ['CUDA_LAUNCH_BLOCKING'] = '1' 3 # os.environ['CUDA_VISIBLE_DEVICES'] = '0' 4 5 # Instantiate the datamodule 6 datamodule = hydra.utils.instantiate(cfg.datamodule) ----> 7 datamodule.prepare_data() 8 datamodule.setup() 10 # Pick among train, val, and test datasets. It is important to note that 11 # the train dataset produces augmented spherical samples of large 12 # scenes, while the val and test dataset load entire tiles at once

File ~/superpoint_transformer/src/datamodules/base.py:149, in BaseDataModule.prepare_data(self) 138 """Download and heavy preprocessing of data should be triggered 139 here. 140 141 However, do not use it to assign state (e.g. self.x = y) because 142 it will not be preserved outside this scope. 143 """ 144 self.dataset_class( 145 self.hparams.data_dir, stage=self.train_stage, 146 transform=self.train_transform, pre_transform=self.pre_transform, ... 276 If the element can't be found. 277 """ --> 278 return self._element_lookup[name]

KeyError: 'testing'`

我对点云的了解不是很多,不知道这是不是因为点云不包含强度信息导致的错误呢?我可以通过修改我的点云文件来解决这个错误吗?

TaugenichtsZZY commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

MenglinQiu commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来raw/中的“test/”文件夹和processed/中的“test/”文件夹改个名字,用你自己的数据作为测试集新建test)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。因此我的建议是重新训练。

总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

TaugenichtsZZY commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来的test文件夹改个名字,用你自己的数据作为测试集)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。

总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

明白了,我已经换过数据了,但数据里确实没有强度信息... 想再请教您一下,如果我要摒弃强度特征重新训练,我应该修改哪些配置文件呢?(问得太小白了实在不好意思..) 感谢您的回复!

MenglinQiu commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来的test文件夹改个名字,用你自己的数据作为测试集)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。 总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

明白了,我已经换过数据了,但数据里确实没有强度信息... 感谢您的回复!

@TaugenichtsZZY 另外,你这个错误应该是dales数据集的读取函数需要对应修改,因为你的ply数据的格式中没有属性testing. dales的ply格式中xyz等信息是在属性“testing”中的。因此,如果你按照我的建议,修改配置文件,并使用dales数据(仅xyz)来重新训练并用自己的数据测试。那么你依然要面临这个问题(修改代码中从ply读取内容的函数)。

MenglinQiu commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来的test文件夹改个名字,用你自己的数据作为测试集)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。 总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

明白了,我已经换过数据了,但数据里确实没有强度信息... 想再请教您一下,如果我要摒弃强度特征重新训练,我应该修改哪些配置文件呢?(问得太小白了实在不好意思..) 感谢您的回复!

所有的配置文件都在config/文件夹,关于数据的在datamodule/dales.yaml 里面有 point_hf:(这个关键字下面是告诉我们点云的手工特征有哪些),去掉其中的intensity即可。另外,你需要注意的是,你的点云和dales是否相近,比如密度(均匀密集或稀疏)和内容形式(室内外/郊区/田野?)上。这可能会对训练和测试的分割结果有很大影响。

TaugenichtsZZY commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来的test文件夹改个名字,用你自己的数据作为测试集)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。 总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

明白了,我已经换过数据了,但数据里确实没有强度信息... 想再请教您一下,如果我要摒弃强度特征重新训练,我应该修改哪些配置文件呢?(问得太小白了实在不好意思..) 感谢您的回复!

所有的配置文件都在config/文件夹,关于数据的在datamodule/dales.yaml 里面有 point_hf:(这个关键字下面是告诉我们点云的手工特征有哪些),去掉其中的intensity即可。另外,你需要注意的是,你的点云和dales是否相近,比如密度(均匀密集或稀疏)和内容形式(室内外/郊区/田野?)上。这可能会对训练和测试的分割结果有很大影响。

好的,我会去尝试一下!我的数据来自果园,和DALES还是比较接近的。这个dales.yaml除了影响训练,是不是也会影响推理时的预处理过程(因为我是在预处理时报的错)?

MenglinQiu commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来的test文件夹改个名字,用你自己的数据作为测试集)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。 总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

明白了,我已经换过数据了,但数据里确实没有强度信息... 想再请教您一下,如果我要摒弃强度特征重新训练,我应该修改哪些配置文件呢?(问得太小白了实在不好意思..) 感谢您的回复!

所有的配置文件都在config/文件夹,关于数据的在datamodule/dales.yaml 里面有 point_hf:(这个关键字下面是告诉我们点云的手工特征有哪些),去掉其中的intensity即可。另外,你需要注意的是,你的点云和dales是否相近,比如密度(均匀密集或稀疏)和内容形式(室内外/郊区/田野?)上。这可能会对训练和测试的分割结果有很大影响。

好的,我会去尝试一下!我的数据来自果园,和DALES还是比较接近的。这个dales.yaml除了影响训练,是不是也会影响推理时的预处理过程(因为我是在预处理时报的错)?

@TaugenichtsZZY 是的,datamodule/dales.yaml是一个总配置文件,关于整个数据的处理参数设置都在其中,包括训练集/测试集,预处理/二次处理(训练时和验证、测试时的处理有略微差异)。

TaugenichtsZZY commented 3 weeks ago

您好。我想问一下您是在训练好了模型后应用在自己的点云上了吗?我在DALES数据集上训练了模型,但我找不到方法把模型应用在我想分割的、还没有标注的点云上。请问您有什么好的方法吗?感谢!

如果你是希望使用dales数据集训练的模型,那么你得为模型提供相同的输入,即点云中应该包含强度信息。并通过相同的预处理过程。最简单的方法,就是保证你的点云格式内容和dales一致。然后将dales_config.py中 TILES字典中的'test'项的内容,改成你自己的点云数据文件名。

DALES的数据集中,ply文件应该含六个数据类别:x、y、z、强度、语义类别和实例类别,而我的ply文件应该只有x,y,z三个类别,可以通过直接修改ply来让我在DLAES上训练的模型可用吗?非常感谢!

@TaugenichtsZZY 相对应的,你也需要在项目根目录下的data/dales/raw/test/文件夹中提供你的点云文件(最好把原来的test文件夹改个名字,用你自己的数据作为测试集)。dales的点云虽然包含六个属性,但是你只做测试应该只需要xyz和强度,语义类别应该作为GT,预处理过程不可能将它作为已知条件吧,只在计算loss和metrics时用到,而测试过程应该没有这一步。另一个问题,你的ply文件没有强度信息,那么你就无法使用dales训练的模型,除非你修改配置文件,在训练时不使用强度特征重新训练。否则输入都不匹配,不会有好结果的。 总而言之,你训练好的模型和代码就是一个黑盒子,找到数据入口,给它所需要的数据就行了。

明白了,我已经换过数据了,但数据里确实没有强度信息... 想再请教您一下,如果我要摒弃强度特征重新训练,我应该修改哪些配置文件呢?(问得太小白了实在不好意思..) 感谢您的回复!

所有的配置文件都在config/文件夹,关于数据的在datamodule/dales.yaml 里面有 point_hf:(这个关键字下面是告诉我们点云的手工特征有哪些),去掉其中的intensity即可。另外,你需要注意的是,你的点云和dales是否相近,比如密度(均匀密集或稀疏)和内容形式(室内外/郊区/田野?)上。这可能会对训练和测试的分割结果有很大影响。

好的,我会去尝试一下!我的数据来自果园,和DALES还是比较接近的。这个dales.yaml除了影响训练,是不是也会影响推理时的预处理过程(因为我是在预处理时报的错)?

@TaugenichtsZZY 是的,datamodule/dales.yaml是一个总配置文件,关于整个数据的处理参数设置都在其中,包括训练集/测试集,预处理/二次处理(训练时和验证、测试时的处理有略微差异)。

了解了,感谢大佬!Vielen Danke!

drprojects commented 2 weeks ago

I would like to give big thanks to @MenglinQiu for dedicating time and sharing great, on-the-point insights :pray: :heart:

drprojects commented 2 weeks ago

@Wind010321

What possible parameters settings can be changed to make the superpoints larger ?

pcp_regularization, pcp_spatial_weight, pcp_cutoff are the primary knobs you should play with, see CutPursuitPartition docstring for details on how these impact the partition. For further control over cut-pursuit, you can also consider adjusting partition_hf (the point features based on which superpoints will be built) pcp_w_adjacency (how "hard" it is to cut an edge based on its length), knn (the number of neighbors used for computing local geometric features).

According to your understanding, is this because I did not use the hierarchical structure of spt or do I need to further adjust the parameters?

SPG and SPT both use cut-pursuit, but different versions of the algorithm (cf our SPT paper). SPT uses a faster parallel implementation. It is likely the API has changed between the two versions and you might want to adjust your parameters.

What aspects can I consider to improve the purity of the super point?

As already suggested above, read the papers and code to understand what the parameters do, adjust them, and assess the partition oracle purity on your data (see next).

How do I evaluate the semantic upper bound of the over-segmentation result?

@Wind010321 from discussions in issues you previously opened, I already suggested you give a closer look at our recent tutorial. Your present questions clearly shows you have not. @MenglinQiu has been kind enough to take the time to help you here, but please be considerate of people's time and make sure you thoroughly go through the already-available resources. That is: our papers, notebooks, commented code, past issues.

That being said, I consider this issue closed.