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
2
3
4
5
~/carla_project/ros2_ws/src/perception_camera/
├── package.xml
├── CMakeLists.txt
└── scripts/
└── carla_detector.py # 检测节点(见 scripts/ 目录)

package.xml 加 Python 依赖:

1
2
3
<exec_depend>rclpy</exec_depend>
<exec_depend>cv_bridge</exec_depend>
<exec_depend>vision_msgs</exec_depend>

CMakeLists.txt 安装脚本:

1
2
3
4
install(PROGRAMS
scripts/carla_detector.py
DESTINATION lib/perception_camera
)

5.4 检测节点说明

节点 carla_detector.py(完整代码在 scripts/carla_detector.py)做这些事:

  1. 加载 TRT 引擎(一次),分配输入/输出 binding。
  2. 订阅 /carla/hero/rgb/image(best-effort QoS,适配传感器流)。
  3. 每帧回调:
    • 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
2
ALLOWED_CLASSES = [1, 2, 3, 4, 6, 8]   # ⚠️ 必须用 list!
keep = np.logical_and(keep, np.isin(class_ids, ALLOWED_CLASSES))

⚠️ np.isin(arr, {1,2,3}) 传 Python set 会返回全 False 必须用 listnp.array。这个坑会导致所有检测被过滤掉、画面一个框都没有。

5.6 构建与运行

1
2
3
4
5
6
7
8
# 构建
cd ~/carla_project/ros2_ws
colcon build --packages-select perception_camera

# 运行(系统 python + ROS2 + 包环境,不要用 conda)
source /opt/ros/humble/setup.zsh
source ~/carla_project/ros2_ws/install/setup.zsh
ros2 run perception_camera carla_detector.py

节点发布:

  • /carla/hero/rgb/detection_image(sensor_msgs/Image,画框图)
  • /carla/hero/detections(vision_msgs/Detection2DArray)

改了 carla_detector.py 后要 colcon build --packages-select perception_camera 重编,并重启节点才生效(Python 不会自动重载)。