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

1次阅读
没有评论

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

image.webp

背景与痛点

自动驾驶技术的快速发展离不开大量高质量的标注数据。然而,真实世界的数据采集面临诸多挑战:

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

  • 成本高昂:需要专业车辆、传感器设备和人力标注,成本动辄数百万。
  • 场景覆盖有限:难以收集极端天气、危险场景等长尾数据。
  • 标注效率低:人工标注一帧 3D 点云可能需要 30 分钟,而自动驾驶模型训练通常需要数十万帧数据。

CARLA 仿真平台提供了完美的解决方案:

  • 场景可控:可自由切换天气、时间、交通状况,甚至模拟传感器故障。
  • 标注零成本:所有物体的 3D 位置、语义标签等信息自动生成。
  • 无限复用:同一场景可反复采集不同视角、传感器的数据。

CARLA 环境配置

基础环境

  1. 硬件建议:至少 4 核 CPU、16GB 内存、NVIDIA 显卡(支持 CUDA)
  2. 下载 CARLA:从官网获取对应版本的预编译包(如 0.9.13)
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/CARLA_0.9.13.tar.gz
tar -xzvf CARLA_0.9.13.tar.gz

传感器配置

CARLA 支持多种传感器组合,典型配置示例:

  • 主摄像头:1920×1080 RGB,FOV 90°,安装在前挡风玻璃位置
  • 激光雷达:32 线,10Hz,范围 100 米(模拟 Velodyne HDL-32E)
  • 语义分割相机:与主摄像头同位置,输出像素级类别标签

通过 Python API 配置传感器的核心参数:

blueprint_library = world.get_blueprint_library()

# 创建 RGB 相机
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '1920')
camera_bp.set_attribute('image_size_y', '1080')
camera_bp.set_attribute('fov', '90')

# 创建激光雷达
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('channels', '32')
lidar_bp.set_attribute('range', '100')
lidar_bp.set_attribute('points_per_second', '560000')

数据采集实战

同步采集流程

  1. 初始化 CARLA 客户端和世界对象
  2. 设置天气、光照等环境参数
  3. 生成车辆和传感器
  4. 注册传感器数据回调函数
  5. 开始连续采集并保存数据

完整示例代码:

import carla
import random
import os
import numpy as np

# 初始化客户端
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()

# 创建保存目录
output_dir = 'carla_data'
os.makedirs(output_dir, exist_ok=True)

# 设置天气
weather = carla.WeatherParameters(cloudiness=random.uniform(0, 50),
    precipitation=0,
    sun_altitude_angle=70)
world.set_weather(weather)

# 生成车辆
vehicle_bp = random.choice(world.get_blueprint_library().filter('vehicle.*'))
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(vehicle_bp, spawn_point)

# 传感器回调函数
def sensor_callback(data, sensor_type):
    if sensor_type == 'rgb':
        data.save_to_disk(f'{output_dir}/{data.frame}.png')
    elif sensor_type == 'lidar':
        points = np.frombuffer(data.raw_data, dtype=np.float32)
        points = np.reshape(points, (-1, 4))
        np.save(f'{output_dir}/{data.frame}_lidar.npy', points)

# 创建并安装传感器
camera = world.spawn_actor(camera_bp, ...)
camera.listen(lambda data: sensor_callback(data, 'rgb'))

lidar = world.spawn_actor(lidar_bp, ...)
lidar.listen(lambda data: sensor_callback(data, 'lidar'))

# 主循环
try:
    while True:
        world.tick()
finally:
    # 清理资源
    camera.destroy()
    lidar.destroy()
    vehicle.destroy()

关键点说明:

  • world.tick() 确保所有传感器数据同步到同一时间戳
  • 帧号(frame)作为唯一标识,保证多传感器数据对齐
  • 原始数据建议保存为无损格式(如 PNG、NPY)

自动化标注

CARLA 原生标注类型

  • 语义分割:每个像素包含物体类别(道路、车辆、行人等)
  • 深度图:精确的深度信息(单位:米)
  • 3D 边界框:物体的精确位置、尺寸和朝向
  • 实例分割:区分同类物体的不同实例

格式转换示例(CARLA→KITTI)

KITTI 格式要求每帧包含:

  1. 图像文件(000001.png)
  2. 点云文件(000001.bin)
  3. 标注文件(000001.txt)

转换代码片段:

def convert_to_kitti(carla_bboxes, frame_id):
    """将 CARLA 3D 框转为 KITTI 格式"""
    with open(f'{output_dir}/{frame_id:06d}.txt', 'w') as f:
        for bbox in carla_bboxes:
            # 计算 KITTI 格式的旋转角
            rotation_y = -bbox.rotation.yaw * np.pi / 180

            # 写入: 类型 截断 遮挡 alpha 2D 框 3D 尺寸 3D 位置 旋转
            line = f"Car 0 0 0 0 0 0 0" \
                   f"{bbox.extent.x*2} {bbox.extent.y*2} {bbox.extent.z*2}" \
                   f"{bbox.location.x} {bbox.location.y} {bbox.location.z}" \
                   f"{rotation_y}\n"
            f.write(line)

避坑指南

数据同步问题

现象:不同传感器的时间戳不完全对齐
解决方案:

  • 使用 world.tick() 而非 time.sleep() 控制帧率
  • 检查传感器配置中的 sensor_tick 参数(秒 / 帧)
  • 后处理时根据帧号匹配数据

传感器噪声模拟

CARLA 默认提供理想传感器数据,可通过以下方式增加真实感:

  1. 摄像头:添加运动模糊、镜头畸变

    camera_bp.set_attribute('motion_blur_intensity', '0.5')
    camera_bp.set_attribute('lens_circle_multiplier', '3.0')

  2. 激光雷达:模拟雨雾衰减

    lidar_bp.set_attribute('dropoff_general_rate', '0.45')
    lidar_bp.set_attribute('atmosphere_attenuation_rate', '0.004')

性能优化

大规模采集技巧

  1. 并行采集:
  2. 使用多个 CARLA 服务实例(不同端口)
  3. 每个实例运行独立的 Python 客户端

  4. 数据压缩:

  5. 将点云存储为二进制格式(而非 ASCII)
  6. 对图像使用 PNG 而非 JPEG(避免压缩伪影)

  7. 内存管理:

  8. 定期清理不再需要的 Actor 对象
  9. 避免在回调函数中进行复杂计算

结语

通过 CARLA 仿真平台,我们能够以极低成本构建高质量的自动驾驶训练数据集。建议读者尝试:

  1. 设计特定场景(如夜间暴雨)的数据采集方案
  2. 比较仿真数据训练模型与真实数据模型的性能差异
  3. 探索域适应技术,缩小仿真与现实的差距

仿真数据不会完全替代真实数据,但两者结合将大幅加速自动驾驶系统的开发迭代。期待看到更多创新性的数据生成方案在 CARLA 上实现!

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