CARLA教程-05-目标检测(rf-DETR TensorRT)
05 目标检测 (rf-DETR TensorRT)
检测节点订阅 CARLA 相机话题,用 rf-DETR 的 TensorRT 引擎做目标检测,发布画框图像和检测结果。节点放在 ROS2 工作空间 perception_camera 包里,用系统 python 跑(rclpy + tensorrt + torch + cv_bridge,不碰 conda)。
5.1 rf-DETR TensorRT 引擎
确认 rf-DETR 仓库里有引擎文件:
1 | ~/models/rf-detr/weights/onnx/rfdetr-medium.engine |
引擎规格(写节点时要用):
- 输入:
(1, 3, 576, 576)float32,RGB,ImageNet 归一化(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]),缩放到 576×576。 - 输出:
dets(1,300,4) 归一化 cxcywh +labels(1,300,91) logits。 - 后处理:sigmoid → 阈值 0.5 → cxcywh 转像素 xyxy(乘原图宽高)。
5.2 ⚠️ COCO 类别映射(关键)
labels 是 91 通道(90 类 + 1 no-object),后处理 logits = labels[0,:,:-1] 丢掉 no-object,argmax 得 0~89。
模型 argmax 直接就是 COCO ID(1~90),查 COCO 类名表即可,不要 +1:
- argmax=3 → car
- argmax=1 → person
- argmax=4 → motorcycle
⚠️ rf-DETR 自带的
inference_trt.py用了argmax+1,会导致 car 错标成 motorcycle。本教程节点的正确做法是coco_id = argmax(不加 1)。
5.3 创建 perception_camera 包
在 ROS2 工作空间建一个 ament_cmake 包(空骨架即可):
1 | ~/carla_project/ros2_ws/src/perception_camera/ |
package.xml 加 Python 依赖:
1 | <exec_depend>rclpy</exec_depend> |
CMakeLists.txt 安装脚本:
1 | install(PROGRAMS |
5.4 检测节点说明
节点 carla_detector.py(完整代码在 scripts/carla_detector.py)做这些事:
- 加载 TRT 引擎(一次),分配输入/输出 binding。
- 订阅
/carla/hero/rgb/image(best-effort QoS,适配传感器流)。 - 每帧回调:
- cv_bridge 把 Image 转 numpy(RGB)。
- 预处理 → TRT 推理 → 后处理(得到 boxes/scores/class_ids)。
- 类别过滤:只保留道路车辆 + 行人。
- 发布画框图像和 Detection2DArray。
5.5 ⚠️ 类别过滤的坑:np.isin 不能用 set
只检测 {person, bicycle, car, motorcycle, bus, truck}(COCO ID = {1,2,3,4,6,8})。过滤代码:
1 | ALLOWED_CLASSES = [1, 2, 3, 4, 6, 8] # ⚠️ 必须用 list! |
⚠️
np.isin(arr, {1,2,3})传 Pythonset会返回全False! 必须用list或np.array。这个坑会导致所有检测被过滤掉、画面一个框都没有。
5.6 构建与运行
1 | # 构建 |
节点发布:
/carla/hero/rgb/detection_image(sensor_msgs/Image,画框图)/carla/hero/detections(vision_msgs/Detection2DArray)
改了
carla_detector.py后要colcon build --packages-select perception_camera重编,并重启节点才生效(Python 不会自动重载)。
