CARLA 数据采集与标注实战:从仿真环境到高质量数据集

1次阅读
没有评论

共计 2907 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

背景与痛点

自动驾驶开发中最关键的环节之一就是获取高质量的训练数据。真实世界的数据采集不仅成本高昂(需要专业车辆、传感器和驾驶员),还面临天气、交通法规和隐私等限制。此外,人工标注这些数据更是耗时费力,尤其是 3D 物体检测和语义分割等任务。

CARLA 数据采集与标注实战:从仿真环境到高质量数据集

CARLA 仿真平台完美解决了这些痛点:

  • 可 7×24 小时不间断生成数据
  • 支持多传感器同步采集
  • 自动生成像素级标注
  • 能模拟各种极端天气和交通场景

CARLA 环境配置

基础环境搭建

  1. 硬件建议:至少 16GB 内存的 GPU 工作站(如 NVIDIA RTX 3060 及以上)
  2. 从 CARLA 官网下载预编译包(推荐 0.9.13 版本)
  3. 安装 Python 依赖:
pip install pygame numpy opencv-python

传感器配置方案

典型自动驾驶传感器套件配置示例:

# 传感器参数配置示例
camera_config = {
    'type': 'sensor.camera.rgb',
    'x': 1.5, 'y': 0, 'z': 2.4,  # 安装位置(米)
    'roll': 0, 'pitch': 0, 'yaw': 0,  # 旋转角度
    'width': 1920, 'height': 1080,  # 分辨率
    'fov': 90  # 视场角
}

lidar_config = {
    'type': 'sensor.lidar.ray_cast',
    'x': 1.5, 'y': 0, 'z': 2.4,
    'rotation_frequency': 20,  # 转速(Hz)
    'points_per_second': 100000,
    'range': 100  # 探测距离(米)
}

数据采集实战

基础采集脚本

以下代码展示如何同步采集 RGB 图像和激光雷达数据:

import carla
import time

# 连接 CARLA 服务端
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)

# 获取世界对象
world = client.get_world()

# 创建车辆蓝图
blueprint_library = world.get_blueprint_library()
vehicle_bp = blueprint_library.filter('model3')[0]

# 生成车辆
spawn_point = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(vehicle_bp, spawn_point)

# 创建传感器回调函数
def sensor_callback(data, path):
    data.save_to_disk(path)

# 添加摄像头
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera = world.spawn_actor(camera_bp, carla.Transform(), attach_to=vehicle)
camera.listen(lambda image: sensor_callback(image, 'output/rgb/%06d.png' % image.frame))

# 添加激光雷达
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar = world.spawn_actor(lidar_bp, carla.Transform(), attach_to=vehicle)
lidar.listen(lambda point_cloud: sensor_callback(point_cloud, 'output/lidar/%06d.ply' % point_cloud.frame))

# 运行采集
try:
    while True:
        world.tick()
        time.sleep(0.05)
except KeyboardInterrupt:
    pass
finally:
    # 销毁对象
    camera.destroy()
    lidar.destroy()
    vehicle.destroy()

自动化标注

CARLA 原生标注类型

CARLA 支持自动生成以下标注数据:

  • 语义分割(像素级类别标签)
  • 实例分割(区分同类物体)
  • 3D 边界框(带物体类别和运动状态)
  • 深度图
  • 表面法线

格式转换示例

将 CARLA 的 3D 边界框转换为 KITTI 格式:

def carla_to_kitti(carla_bbox):
    """
    参数:
        carla_bbox: carla.BoundingBox 对象
    """
    # 坐标系转换:CARLA 左前上 → KITTI 右前下
    location = carla_bbox.location
    rotation = carla_bbox.rotation
    extent = carla_bbox.extent

    kitti_bbox = {
        'type': 'Car',
        'truncated': 0.0,
        'occluded': 0,
        'alpha': -np.arctan2(location.y, location.x) - rotation.yaw,
        'bbox': [0, 0, 100, 100],  # 2D 框需单独计算
        'dimensions': [extent.z*2, extent.y*2, extent.x*2],  # 高, 宽, 长
        'location': [location.x, location.y - extent.y, location.z - extent.z],
        'rotation_y': np.deg2rad(rotation.yaw)
    }
    return kitti_bbox

避坑指南

数据同步问题

现象:不同传感器时间戳不一致
解决方案:

  1. 使用 world.tick() 统一时间步
  2. 检查传感器配置中的 sensor_tick 参数
  3. 后期通过帧号对齐数据

传感器噪声模拟

CARLA 默认提供理想传感器数据,可通过以下方式添加噪声:

# 为摄像头添加噪声
camera_bp.set_attribute('enable_postprocess_effects', 'True')
camera_bp.set_attribute('motion_blur_intensity', '0.5')

# 为激光雷达添加噪声
lidar_bp.set_attribute('dropoff_general_rate', '0.1')

性能优化

大规模采集技巧

  1. 使用 set_async_mode(True) 启用异步模式
  2. 多车并行采集:在 Town07 等大场景中部署多辆采集车
  3. 数据压缩存储:
  4. 图像保存为.jpg
  5. 点云使用.las 压缩格式
  6. 关闭不必要的渲染:
    settings = world.get_settings()
    settings.no_rendering_mode = True
    world.apply_settings(settings)

结语

通过本文介绍的方法,我在一周内就构建了包含 10 万帧的多模态数据集。建议读者先尝试在 CARLA 的 Town01 简单场景中验证流程,再扩展到复杂场景。虽然仿真数据不能完全替代真实数据,但通过领域自适应等技术,可以显著减少对真实数据的依赖。下一步我将探索如何将 CARLA 数据与 nuScenes 等真实数据集混合训练,欢迎在评论区交流你的实践经验。

正文完
 0
评论(没有评论)