PanoSAM:使用 Meta Segment Anything 模型对全景图像中的点云数据进行无监督分割

背景

全景图像可以通过地面激光扫描 (TLS) 获取的点云高效生成。由于 TLS 从固定静止位置捕获数据,因此与传统的俯视图相比,相应的全景投影能够提供更直观的场景分割方法。

假设全景图像是使用点云的首次离散回波构建的,那么对图像的分割实际上相当于对点云的首次回波进行分割。从全景图像中获得分割蒙版后,可以将其重新投影到原始的3D点云上。此过程允许基于机器学习对图像格式的点云进行分割,从而提供一种实用高效的初步分类方法。

https://github.com/ottoykh/PanoSAM?source=post_page-----443ee1085f30---------------------------------------

演示 1

演示 2

使用我们的代码

下载requirements.txt文件和Pano.py里面需要的包,在 python cmd 中运行下面一行:

python Pano.py -input_e57 "e57_file.e57"

相关函数

e57Pano

  1. 加载 E57 点云文件
  2. 读取扫描数据并提取传感器位置
  3. 从点中提取 x、y、z
    从点计算角度 (θ 和 ϕ)
    θ=arctan2(y/x)(方位角)
    ϕ=arccos(z/距离)
  4. 将角度归一化为像素坐标
    Pixel X = Pixel_x=(θ+π/ 2π)⋅width
    Pixel Y = Pixel_y=(phi/π)⋅height
  5. 从 3D 点云数据集生成 2D 全景图像
  6. 提取 XYZ 坐标并计算相对坐标
    relative_xyz=xyz−sensor_pos
  7. 计算距离
  8. 颜色的标准偏差缩放
    颜色=(颜色-平均值)/ std + 1e-5
  9. 使用球面投影将 3D 点投影到 2D 像素坐标
  10. 使用深度缓冲区将点绘制到全景图像上

全景SAM:

  1. 使用 transforms 管道加载 SAM(任意分段模型)
  2. 打开图像并将其转换为 RGB 格式
  3. 调整图像大小(尽管它保持其原始大小)
  4. 使用生成器获取图像的蒙版
  5. 遍历生成的掩码并在掩码数组中标记它们
  6. 为每个标记的段创建一个具有随机颜色的叠加层
  7. 使用 tifffile 将标记的掩膜保存为 TIFF 文件
  8. 创建一个包含两个子图的图形:原始图像和分段叠加图

Pano2e57:

  1. 从 TIFF 文件加载分割蒙版
  2. 从 E57 文件加载点云数据并检索传感器的位置
  3. 根据传感器位置将 3D 点投影到 2D 掩模上
  4. 计算点与传感器的相对位置
  5. 计算每个点的半径 r 并过滤点
  6. 计算球坐标
    θ=arctan2(y/x)(方位角)
    ϕ=arccos(z/r)
  7. 将球面坐标标准化并转换为像素坐标
  8. 使用像素坐标从掩码中检索相应的标签
  9. 将投影点及其标签保存到 PLY 文件

限制

这种方法的一个关键限制在于,全景图像仅捕捉扫描仪视角下的第一个可见表面。因此,任何位于遮挡物后方或场景深处的特征都可能在分割蒙版中被错误呈现或完全缺失。因此,这些背面的特征可能会被错误分类或未经处理。尽管存在此限制,该方法仍然是 TLS 数据集预分类的有力工具,尤其是在单次扫描(每次设置)工作流程中。