点云语义分割需要大量带标签的训练数据,但人工在三维空间中逐点标记类别非常耗时。Label Studio 作为开源数据标注平台,不仅支持图像和文本,也提供点云数据的可视化与分割标注功能。对于使用 Point-E 生成的物体点云,可以将其导出为 PLY 文件,再通过 Label Studio 配置分割标签模板,完成逐点语义标注。标注结果能导出为 JSON,转换为模型训练所需的标签文件。

一、Label Studio 点云标注环境准备
Label Studio 的安装方式比较简单,推荐使用 pip 把核心包安装到独立的 Python 虚拟环境中。执行以下命令即可完成基础安装:
pip install label-studio
安装完成后,在终端运行 label-studio start 命令,默认会在本机 8080 端口启动 Web 服务。首次启动时需要创建一个管理员账号,随后就可以进入项目管理界面。如果点云文件体积较大,建议把 Label Studio 部署在带有 GPU 的服务器上,并配合本地文件存储或对象存储使用,避免频繁上传带来的网络开销。
创建新项目后,需要先完成标注配置。Label Studio 使用 XML 格式的标签模板定义标注工具,点云语义分割通常需要 <PointCloud> 标签来声明点云数据源,再配合 <BrushLabels> 和 <PolygonLabels> 提供画笔与多边形标注能力。下面是一份基础配置示例:
<View>
<PointCloud name="pointcloud" value="$pointcloud" />
<BrushLabels name="brush_labels" toName="pointcloud">
<Label value="汽车" background="#FF0000" />
<Label value="地面" background="#00FF00" />
<Label value="行人" background="#0000FF" />
</BrushLabels>
<PolygonLabels name="polygon_labels" toName="pointcloud">
<Label value="建筑物" background="#FFFF00" />
<Label value="植被" background="#FF00FF" />
</PolygonLabels>
</View>
在 <BrushLabels> 中定义的标签会以画笔形式出现,适合精细地逐点涂刷;而 <PolygonLabels> 则用于多边形框选某一区域内的所有点。两类工具可以同时存在,标注人员可以根据物体的边界复杂度灵活切换。配置保存后,Label Studio 会自动生成对应的三维标注界面。
二、导入 Point-E 点云并配置标注界面
Point-E 生成的点云通常保存为 PLY 格式,其中包含每个顶点的坐标和颜色信息。Label Studio 本身不直接读取本机文件,而是通过任务数据中的 pointcloud 字段加载点云 URL 或服务器路径。因此需要先把 PLY 文件放到 Label Studio 可以访问的位置,例如项目目录下的 data 文件夹或一个静态文件服务中。
导入任务可以使用 JSON 文件批量完成。每个任务的 data 对象中通过 pointcloud 字段指定文件路径,示例结构如下:
[
{
"data": {
"pointcloud": "/data/point_e_car.ply"
}
},
{
"data": {
"pointcloud": "/data/point_e_chair.ply"
}
}
]
如果文件数量较多,可以通过 Python 脚本遍历目录自动生成这个 JSON 文件。需要注意的是,路径应当是 Label Studio 后端能够访问的绝对路径或相对路径,如果使用 Docker 部署,要确保路径已挂载到容器内部。此外,Label Studio 支持 PLY、PCD、LAS 等常见点云格式,Point-E 输出的 PLY 直接可用,无需额外转换。
完成导入后,进入标注任务,界面中会显示三维点云视图。左侧标签面板中的不同颜色对应不同语义类别,标注人员可以旋转、缩放点云,从多个角度观察物体结构。对于边界清晰的大块区域,先用多边形工具圈选可以快速完成;对于边缘细小的部分,再切换为画笔工具进行修正。这种组合方式能显著提升标注效率。
三、点云语义分割标注操作与结果导出
在标注过程中,画笔工具会根据鼠标轨迹选中视锥范围内的点,并在这些点上记录当前选中的标签索引。多边形工具则通过闭合多边形投影到点云上,选中多边形内部的点。两种操作的结果都会写入标注结果的 result 数组中,每个元素记录工具类型、选中的点索引列表以及标签值。标注人员可以反复修改,最终形成的标注文件包含了完整的逐点语义信息。
点击项目右上角的 Export 按钮,选择 JSON 格式即可导出标注结果。导出的文件结构与任务数据相对应,其中 annotations 数组的每个元素代表一个任务的标注结果。为了将标注数据用于分割模型训练,通常需要把 JSON 中的点索引和标签转换为 numpy 数组,与原始点云坐标对齐。下面是一段 Python 转换示例:
import json
import numpy as np
import open3d as o3d
def load_labels(annotation_path, pcd_path):
# 读取点云和标注结果
pcd = o3d.io.read_point_cloud(pcd_path)
points = np.asarray(pcd.points)
labels = np.zeros(len(points), dtype=np.int32)
with open(annotation_path, 'r', encoding='utf-8') as f:
annotations = json.load(f)
# 根据实际导出的结构遍历标注结果
for ann in annotations:
results = ann.get('annotations', [{}])[0].get('result', [])
for item in results:
if item.get('type') == 'brushlabels':
idxs = item['value'].get('points', [])
label_name = item['value'].get('brushlabels', [''])[0]
label_id = 1 # 可按类别名称映射成整数
labels[idxs] = label_id
elif item.get('type') == 'polygonlabels':
idxs = item['value'].get('points', [])
label_name = item['value'].get('polygonlabels', [''])[0]
label_id = 2
labels[idxs] = label_id
np.save('semantic_labels.npy', labels)
return labels
实际项目中建议维护一个标签名称到整数 ID 的映射字典,并处理同一批任务中多次标注的合并逻辑。转换后的标签数组可以直接作为 PointNet++、RandLA-Net 等分割模型的监督信号。如果模型需要颜色信息,也可以将 RGB 通道与标签一并保存为 HDF5 文件,方便训练时随机采样。
四、结合预标注模型提升标注效率
当点云规模较大时,完全依赖人工标注会非常低效。Label Studio 支持通过 ML backend 接入预标注模型,模型可以对导入的点云进行初步分割,标注人员只需要修正错误区域。搭建 ML backend 的基本思路是创建一个 HTTP 服务,实现 /predict 接口,接收 Label Studio 发送的点云任务数据,返回预测的标注结果。
以轻量级分割模型为例,可以在 Flask 服务中加载预训练权重,对传入的点云文件进行推理,生成每个点的类别索引,再按照 Label Studio 要求的格式封装成 brushlabels 或 polygonlabels 结果。下面是一个简化版的 Flask 服务框架:
from flask import Flask, request, jsonify
import open3d as o3d
import numpy as np
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
task = request.json
pcd_path = task['data']['pointcloud']
pcd = o3d.io.read_point_cloud(pcd_path)
points = np.asarray(pcd.points)
# 调用预训练分割模型,得到每个点的预测标签 id
pred_labels = model_predict(points)
# 构造 Label Studio 可识别的标注结果
result = []
for label_id in np.unique(pred_labels):
idxs = np.where(pred_labels == label_id)[0].tolist()
result.append({
'type': 'brushlabels',
'value': {
'format': 'rle',
'points': idxs,
'brushlabels': [str(label_id)]
}
})
return jsonify({'result': result})
def model_predict(points):
# 此处接入真实模型推理逻辑
return np.zeros(len(points), dtype=np.int32)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9090)
服务启动后,在 Label Studio 项目的机器学习设置中填写 ML backend 地址,系统会自动调用预测接口生成预标注。人员只需要处理模型置信度较低的区域,可以节省超过一半的标注时间。对于 Point-E 生成的单物体点云,如果任务相对固定,甚至可以直接用聚类或平面拟合等传统方法生成粗标签,再由人工精修。
点云语义分割Label StudioPoint-E修改时间:2026-09-27 15:40:58