识别跟随示例
本示例利用 DeepStream、YOLOv8 和 TensorRT 对场景中目标人员进行识别和跟踪,然后计算目标位置并传输给运动主机,使机器人能够跟随目标人员。基于 DeepStream 的硬件解码获取 h264 编码的 720p 分辨率 rtsp 视频流,使用 TensorRT 加速 Yolov8 人体检测模型,在开放场景中识别人体,识别速度约 20fps,跟踪速度约 10fps。
本示例分为识别和跟踪两部分:
- 识别算法:对视觉进行深度学习神经网络识别,找到图片中人体的位置。当画面中出现多个人体时,先识别出当前帧中的所有人体,然后基于深度学习提取每帧视频中识别出的人体特征,逐一比较以确定同一个人在前后帧中的轨迹。
- 跟踪算法:用户可在画面中选择想要机器人跟随的目标人体,机器人可实现实时锁定和持续跟踪。识别算法可判断人与机器人的方向和距离,使机器人做出相应响应(平移或旋转),并根据机器人与被跟踪人员的距离实时调整速度:
- 太近:目标过近时,机器人停止运动以防止碰撞。
- 较近:目标较近时,机器人实时动态减速以靠近目标。
- 较远:目标较远时,机器人以最大速度运动。
本示例中使用的 yolov8 和 sdk_hub 源码分别来自 ultralytics 和 hub-sdk。
注意: 程序启动时需要初始化视频解码和深度学习推理环境,耗时约 40s。如果长时间无法启动功能,请连接控制器到机器人检查视频流是否正常工作。
- 打开终端,输入以下命令启动程序:
cd /home/ysc/lite_cog/track/src # for ROS1cd /home/ysc/lite_cog_ros2/track/src # for ROS2python3 run_tracker.py-
使用 App 使机器人起立并开启自主模式。
-
当有人出现时,系统会对所有已识别的人员编号并显示在屏幕上。使用键盘输入想要跟随的人员编号并按回车确认。
注意: 输入目标编号时,请确保视频窗口在最上层。
-
机器人将跟踪并识别目标。
-
跟踪过程中可按回车键重置目标,或当目标丢失显示 “Miss Object” 时重置。
-
按 Ctrl+C 结束程序。
本示例在 ~/lite_cog/track 和 ~/lite_cog_ros2/track 工作空间中提供了两个包,分别对应不同的 ROS 版本。两者的区别仅在 /src/RobotController 文件夹中 RobotController.py 的 kUseRos1Transfer = True 这一行,用于指定使用 ROS1 还是 ROS2 进行消息发送。值为 True 时使用 ROS1,值为 False 时使用 ROS2。
people_tracking 包结构如下:
People_tracking├── model│ ├── export_engine.sh│ ├── yolov8n_amd.engine│ ├── yolov8n_arm.engine│ ├── yolov8n.onnx│ └── yolov8n.pt└── src ├── GStreamerWrapper │ └── GStreamerWrapper.py ├── hub_sdk ├── RobotController │ ├── FpsCounter │ │ ── FpsCounter.py │ ├── RobotController.py │ ├── ROSTransfer │ │ ├── ROS1Transfer.py │ │ ├── ROS2Transfer.py │ │ └── TransferConstants.py │ └── YoloWrapper │ ├── CocoTypeId.py │ └── YoloWrapper.py ├── run_tracker.py ├── test │ ├── pull.py │ ├── pull.sh │ └── yolov8.py └── ultralytics各文件说明:
- run_tracker.py:主程序。
- GStreamerWrapper:基于 DeepStream 的 GStreamer 硬件解码器,用于获取 RTSP 视频流。
- RobotController.py:主要运行逻辑体现在其
Run()函数中,用于识别视频流获取的图像中的人体,然后发送运动指令。 - ultralytics:开源 Yolov8 程序包,用于对视频流获取的图像帧进行推理和跟踪,是 RobotController 中 YoloWrapper 的运行依赖。
ultralytics/cfg文件夹是各种 Yolov8 配置文件的存储地址,每个配置文件都有完整的注释。 - sdk_hub:开源 sdk_hub 程序包,是 Yolov8 包的运行依赖。