
RDK X3 (旭日X3派) 使用TROS快速部署YOLOv5刷爆 30 fps !

本文使用TROS.B的手册提供的方法部署YOLOv5s tag2.0的模型,在1080p分辨率输入,672*672输入,3类别达到30fps。得益于ROS2话题通讯的特性,推理部分是官方使用C++写的,而我们只需要简单的替换模型文件,写一个简单的Python订阅者节点,即可快速的将TROS的推理结果嵌入到自己的代码中。
注意:
- 无需修改官方代码,而是通过ROS2的订阅者节点将推理结果嵌入到自己的Python代码中。
- 无需ROS基础,只需要copy运行即可。如果想要更深入的理解,可以参考古月居《ROS2入门21讲》的视频学习:https://www.bilibili.com/video/BV16B4y1Q7jQ
- 无需安装ROS2,无需安装TROS,只需要使用RDK X3板卡烧录最新的稳定版(release)镜像即可!
- 模型转化备注:编译参数组compiler_parameters的模型运行核心数参数设置为:core_num: 2,这样编译成功的模型就是双核运行,推理时间比单核心快一些,可以降低单帧的延迟。但是和TROS工程师靠哥交流后得知,TROS的算法内部自带双核心负载均衡,使用单核心编译的模型能交替使用两个BPU核心,能有更高的帧数。各位开发者可以自行选择,当模型输入分辨率不大(<640),nc目标数量不大(<40)时,两种方式都可以刷满30fps,这时可以考虑使用双核模型获得更低的帧延迟,当模型较大或nc数量较大时,单核编译获得更高的fps。
如何训练出TROS部署需要的YOLO模型?
参考:
- https://developer.horizon.cc/forumDetail/198686198578007656 (强强烈推荐👍)
- https://developer.horizon.cc/forumDetail/163807123501918330 (强强烈推荐👍)
只要您训练和转化的模型能够成功在 /app/pydev_demo/07_yolov5_sample 的 demo下运行,那么就可以使用TROS快速部署。
TROS介绍:TogetheROS.Bot是地平线面向机器人厂商和生态开发者推出的机器人操作系统,旨在释放机器人场景的智能潜能,助力生态开发者和商业客户能够高效、便捷的进行机器人开发,打造具有竞争力的智能机器人产品。https://developer.horizon.cc/documents_tros
通过Perfoemance Node可以观察到,利用TROS部署的YOLOv5较好的利用了CPU和BPU性能,CPU占用约200%(最大400%),BPU占用约180%(最大200%)。
(Perfoemance Node详见https://blog.csdn.net/SA2672873269/article/details/136834451)
Step 1:使用root账户,在工作目录下,运行TROS的YOLO章节的部分,mipi相机输入和USB相机输入均可
TROS手册:https://developer.horizon.cc/documents_tros/boxs/detection/yolo
这里以mipi相机输入为例:
source /opt/tros/setup.bash # 配置tros.b环境
export CAM_TYPE=mipi # 配置MIPI摄像头
# 启动launch文件
ros2 launch dnn_node_example dnn_node_example.launch.py dnn_example_config_file:=config/yolov2workconfig.json dnn_example_image_width:=480 dnn_example_image_height:=272
运行结束后,工作目录下就生成了一个config文件夹,我们拷贝其中yolov5workconfig.json
, coco
文件到工作目录下。拷贝到其他位置也可,主要是方便索引。
注意不能直接修改config里面的文件,原因是每次运行时会被覆盖掉,我们必须拷贝出来修改。
Step 2:替换配置文件
通过WinSCP等工具将量化完成的模型文件拷贝到工作目录下(其他位置也可,主要是方便索引)。修改配置文件如下:
coco
是类别名称,从0开始递增索引。
person
bicycle
car
motorcycle
···
yolov5workconfig.json
是TROS的YOLO推理节点配置文件。
其中:
“model_file”:bin模型文件的路径,绝对路径和相对路径均可,相对路径是相对运行的Termianl所在的路径;
“dnn_Parser”:模型的类型,TROS支持yolov2、yolov3、yolov5、yolov5x四个版本;
“model_output_count”:模型的输出层个数,这里取3;
“class_num”:YOLO识别类型的数量;
“cls_names_list”:YOLO识别类别的名称文件,也就是上文的coco
。
{
"model_file": "/root/00_yolov5_test/yolo.bin",
"dnn_Parser": "yolov5",
"model_output_count": 3,
"class_num": 1,
"cls_names_list": "gef_best.list",
"strides": [8, 16, 32],
"anchors_table": [[[10, 13], [16, 30], [33, 23]], [[30, 61], [62, 45], [59, 119]], [[116, 90], [156, 198], [373, 326]]],
"score_threshold": 0.2,
"nms_threshold": 0.3,
"nms_top_k": 5000
}
改完后使用以下命令运行TROS的推理节点:
source /opt/tros/setup.bash # 配置tros.b环境
export CAM_TYPE=mipi # 配置MIPI摄像头
ros2 launch
命令需要修改相关参数:
dnn_example_config_file:=yolov5workconfig.json
修改为TROS的YOLO推理节点配置文件路径,这个相对路径是相对Terminal终端运行时的相对路径,也可修改为绝对路径。
dnn_example_image_width:=1920
修改为画面输入的宽度,这个分辨率与resize前的画面有关,也与Web端渲染的分辨率有关,1080p完全带的动。注意,与模型推理尺寸无关。
dnn_example_image_height:=1080
修改为画面输入的高度,同上。
# 启动launch文件
ros2 launch dnn_node_example dnn_node_example.launch.py dnn_example_config_file:=xxx改成自己的xxx.json dnn_example_image_width:=1920 dnn_example_image_height:=1080
Step 3:Web端查看推理结果(可选)
在同一局域网内访问如下地址即可查看Web推流结果,其中IP为RDK X3的IP地址,也就是ssh时使用的IP地址。
Web端在较高的分辨率下需要消耗较大的内网带宽,注意Web端渲染卡顿极大可能是网络原因导致,而不是推理的帧率低,这点可以在Terminal终端中查看打印信息验证。
IP:8000
Step 4:写一个Python的ROS节点订阅推理结果
在TROS的YOLO推理节点成功运行后,另开一个Python终端,使用如下Python代码即可获得YOLOv5的推理结果到自己的代码中。
运行前需要在终端运行如下命令,再运行Python脚本,无需使用colcon build命令编译。
source /opt/tros/setup.bash
import rclpy
from rclpy.node import Node
from ai_msgs.msg import PerceptionTargets
class MinimalSubscriber(Node):
def __init__(self):
super().__init__('minimal_subscriber')
self.subscription = self.create_subscription(
PerceptionTargets,
'hobot_dnn_detection',
self.listener_callback,
10)
self.subscription # prevent unused variable warning
self.count = 0
def listener_callback(self, msg):
# 回调函数,每帧推理结果产生后就会运行这个函数
# 这里给出解析的方法
print("\n \033[31m---\033[0m This Frame: FPS = %d \033[31m---\033[0m"%msg.fps)
for num, target in enumerate(msg.targets):
print("Traget \033[0;32;40m%d\033[0m: "%num, end="")
print("Type: %s, x_offset=%d, y_offset=%d, height=%d, width=%d, conf=%.2f"%(target.rois[0].type,
target.rois[0].rect.x_offset,
target.rois[0].rect.y_offset,
target.rois[0].rect.height,
target.rois[0].rect.width,
target.rois[0].confidence))
def main(args=None):
rclpy.init(args=args)
minimal_subscriber = MinimalSubscriber()
rclpy.spin(minimal_subscriber)
minimal_subscriber.destroy_node()
rclpy.shutdown()
# 给main函数一个入口,省得colcon build编译
if __name__ == '__main__':
main()
订阅推理结果的节点运行效果如下,30fps妥妥的:
使用官方80类别的模型,帧率会下降一些,原因是更多的类别后处理会消耗更多的时间,但是FPS依旧不低,有23fps左右:
RDK X3: Horizon Robotics Developer Kit X3 Serials,包括RDK X3、RDK X3 Module两款产品,共同搭载了地平线旭日3系列高性能的智能芯片,具有5Tops端侧推理算力,同时尺寸、接口保持对树莓派4B、CM4等产品的兼容性,方便开发者快速集成。
https://developer.horizon.cc/rdkx3




更多推荐








所有评论(0)