共计 2099 个字符,预计需要花费 6 分钟才能阅读完成。
为什么 3D 点云标注是自动驾驶的基石
刚接触自动驾驶时,最容易低估的就是数据标注的工作量。在真实路测中,一辆搭载 64 线激光雷达的车辆每秒产生超过 200 万个点云 (Point Cloud) 数据点。这些密密麻麻的 3D 空间坐标,需要人工标注出车辆、行人、障碍物等信息,才能让 AI 模型学会识别和理解环境。

新手常见三大痛点:
- 工具迷惑:商业工具年费动辄上万美元,开源工具又缺乏文档支持
- 规范混乱:不同厂商对同一物体的标注标准可能完全不同
- 效率低下:手工标注一帧数据可能需要 20 分钟,而一个训练集往往需要数万帧
工具选型:从个人开发到企业级方案
Labelbox
- 优势:企业级协作功能完善,支持版本控制和审计追踪
- 劣势:按数据量计费,小型团队成本压力大
- 适用场景:中大型企业的合规性要求高的项目
Supervisely
- 优势:内置 AutoML 功能,支持智能预标注
- 劣势:社区版功能受限,GPU 服务器需自备
- 适用场景:需要 AI 辅助标注的中型团队
CVAT
- 优势:完全开源,支持本地化部署
- 劣势:3D 标注功能较基础,需要二次开发
- 适用场景:预算有限的技术团队
建议搭配:个人学习用 CVAT+CloudCompare 组合,企业项目推荐 Supervisely
手把手点云处理实战
先安装必要工具库:
pip install open3d numpy
基础预处理
import open3d as o3d
# 读取点云文件
pcd = o3d.io.read_point_cloud("sample.pcd")
# 降采样(体素滤波)
voxel_size = 0.05 # 5 厘米立方体
down_pcd = pcd.voxel_down_sample(voxel_size)
# 坐标系转换示例:Velodyne 到车辆坐标系
# 假设已有转换矩阵 T_velo_to_vehicle
transformed_pcd = down_pcd.transform(T_velo_to_vehicle)
旋转框标注核心逻辑
# 定义 3D 边界框类
class BoundingBox3D:
def __init__(self, center, size, rotation):
"""
:param center: [x,y,z] 中心坐标
:param size: [l,w,h] 长宽高
:param rotation: 绕 Z 轴旋转角度(弧度)
"""
self.center = np.array(center)
self.size = np.array(size)
self.rotation = rotation
# 计算 8 个角点坐标
def get_corners(self):
l, w, h = self.size
# 生成局部坐标系角点
corners_local = np.array([[l/2, w/2, h/2], [l/2, -w/2, h/2],
[-l/2, -w/2, h/2], [-l/2, w/2, h/2],
[l/2, w/2, -h/2], [l/2, -w/2, -h/2],
[-l/2, -w/2, -h/2], [-l/2, w/2, -h/2]
])
# 应用旋转
rot_mat = np.array([[np.cos(self.rotation), -np.sin(self.rotation), 0],
[np.sin(self.rotation), np.cos(self.rotation), 0],
[0, 0, 1]
])
corners_rotated = np.dot(corners_local, rot_mat.T)
# 平移至全局坐标
return corners_rotated + self.center
质量检验:避免标注变「脏数据」
一致性检查脚本
def check_iou(box1, box2):
"""计算两个 3D 框的交并比"""
from scipy.spatial import ConvexHull
# 获取两个框的所有角点
corners1 = box1.get_corners()
corners2 = box2.get_corners()
# 计算各自体积
vol1 = ConvexHull(corners1).volume
vol2 = ConvexHull(corners2).volume
# 计算交集体积(简化版,实际需要三维布尔运算)intersection = ... # 实现省略
return intersection / (vol1 + vol2 - intersection)
激光雷达特有陷阱
- 反射强度陷阱:雨雪天气的反射值可能被误标为障碍物
- 遮挡补偿:被遮挡物体不应标注完整形状(如图中卡车后的轿车)
- 动态补偿:对于移动物体,应标注其在当前帧的实际位置而非预测位置
五个血泪教训
- 运动补偿过头:给自行车加运动补偿导致框体变形,反而降低识别率
- 地面点误标:未过滤地面点导致模型把地面起伏识别为障碍物
- 尺寸标准化:不同标注员对「轿车」的长度定义偏差达 0.5 米
- 忽略点云特性:在稀疏区域(30 米外)仍用相同密度标准标注
- 标签过度细化:把「货车」细分为箱式 / 平板 / 冷藏等子类,但实际业务无需区分
延伸思考
当你的标注团队完成 1 万帧数据后,可以尝试:
1. 用已标注数据训练一个初版检测模型
2. 用该模型对新数据做预标注
3. 人工仅需修正错误标注
这样形成的「人机协作」流程可提升 3 倍效率,但如何设计质量监控机制?
正文完
发表至: 未分类
近三天内
