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

本文使用TROS.B的手册提供的方法部署YOLOv5s tag2.0的模型,在1080p分辨率输入,672*672输入,3类别达到30fps。得益于ROS2话题通讯的特性,推理部分是官方使用C++写的,而我们只需要简单的替换模型文件,写一个简单的Python订阅者节点,即可快速的将TROS的推理结果嵌入到自己的代码中。

注意:

  1. 无需修改官方代码,而是通过ROS2的订阅者节点将推理结果嵌入到自己的Python代码中。
  2. 无需ROS基础,只需要copy运行即可。如果想要更深入的理解,可以参考古月居《ROS2入门21讲》的视频学习:https://www.bilibili.com/video/BV16B4y1Q7jQ
  3. 无需安装ROS2,无需安装TROS,只需要使用RDK X3板卡烧录最新的稳定版(release)镜像即可!
  4. 模型转化备注:编译参数组compiler_parameters的模型运行核心数参数设置为:core_num: 2,这样编译成功的模型就是双核运行,推理时间比单核心快一些,可以降低单帧的延迟。但是和TROS工程师靠哥交流后得知,TROS的算法内部自带双核心负载均衡,使用单核心编译的模型能交替使用两个BPU核心,能有更高的帧数。各位开发者可以自行选择,当模型输入分辨率不大(<640),nc目标数量不大(<40)时,两种方式都可以刷满30fps,这时可以考虑使用双核模型获得更低的帧延迟,当模型较大或nc数量较大时,单核编译获得更高的fps。

如何训练出TROS部署需要的YOLO模型?

参考:

  1. https://developer.horizon.cc/forumDetail/198686198578007656 (强强烈推荐👍)
  2. 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.list文件到工作目录下。拷贝到其他位置也可,主要是方便索引。
注意不能直接修改config里面的文件,原因是每次运行时会被覆盖掉,我们必须拷贝出来修改。

Step 2:替换配置文件

通过WinSCP等工具将量化完成的模型文件拷贝到工作目录下(其他位置也可,主要是方便索引)。修改配置文件如下:

coco.list是类别名称,从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.list

{
	"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
在这里插入图片描述

  • 56
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值