轻量级实时跟踪算法NanoTrack在瑞芯微RK3588上的部署以及使用


前言

github: https://github.com/Try2ChangeX/NanoTrack_RK3588_python: python版本基于rk3588的NanoTrack,每秒可达120FPS

主要参考:

SiamTrackers/NanoTrack at master · HonglinChu/SiamTrackers · GitHub

GitHub - rockchip-linux/rknn-toolkit2

        本文主要记录了在rk3588开发板上开发并运行nanotack跟踪算法,主要参考上面大佬的SiamTrackers,然后将模型转为rk3588能使用的.rknn模型并成功运行。主要记录该算法在板子上运行需要注意的一些坑和细节点。


一、模型转换

1.环境配置

rk3588对应的python版本的开发库是:GitHub - rockchip-linux/rknn-toolkit2,模型转换需要在linux-x86机器上进行转换,可以参考官方提供的packages去配置相关环境,目前rknn_toolkit2就两个版本,如下。可以选择在ubuntu18.04的机器上python3.6环境下安装第一个package,最好联网安装,会有很多依赖包。

rknn_toolkit2的使用文档可参考./rknn-toolkit2-1.3/doc/下开发文档

由于rk3588板子系统为aarch64架构,需在板子上安装对应的rknn_toolkit_lite2,同样,环境可根据其packages进行配置,这里注意,只支持python3.7和python3.9,需提前配置好板子上的python版本,可选择使用虚拟环境。

 rknn_toolkit_lite2的使用文档可参考./rknn_toolkit_lite2/docs/下开发文档

2.模型解构

关于模型的前处理,后处理等部分,可参考代码,本文不对算法做过多描述。

模型的输入分为两部分:

模板T的input输入为[1,3,127,127],经过backbone特征提取网络得到output1[1,48,8,8]的模板特征;

图像X的input输入为[1,3,255,255],经过backbone特征提取网络得到output2[1,48,16,16]的图像特征;

output1和output2会被送入模型head部分,得到两部分输出,输出尺寸分别为[1,48,8,8]和[1,48,16,16]。

考虑到rknn在转换时需提前设置好输出节点,所以这里我将模型拆成了3个部分,分别为:

input输入数量modeloutput输出数量备注
模板T输入[1,3,127,127]1backbone[1,48,8,8]1仅在init时进行推理
图像X输入[1,3,255,255]1backbone[1,48,16,16]1update时一直推理
[1,48,8,8],[1,48,16,16]2head

[1,2,16,16]

[1,4,16,16]

2双输入双输出

提前将训练好的模型分别导出为.pt格式,方便后续转.rknn

# backbone 模板特征提取模型
trace_model = torch.jit.trace(backbone_net, torch.Tensor(1, 3, 127, 127))
trace_model.save('./models/pt/backbone_127.pt')

# backbone 图像特征提取模型
trace_model = torch.jit.trace(backbone_net, torch.Tensor(1, 3, 255, 255))
trace_model.save('./models/pt/backbone_255.pt')

# head 模型
trace_model = torch.jit.trace(model, (torch.Tensor(1, 48, 8, 8), torch.Tensor(1, 48, 16, 16)))
trace_model.save('./models/pt/head.pt')

然后通过rknn_toolkit2转为.rknn模型,转换时注意是否需要归一化,以及target_platform,为防止出错,最好直接指定目标平台。如:模板特征提取的模型部分转换如下

model = './pt/nanotrack_backbone_T127.pt'
        
input_size_list = [[1, 3, 127, 127]]

# Create RKNN object
rknn = RKNN(verbose=True)

# Pre-process config
print('--> Config model')
# 注意要将target_platform指定清楚
rknn.config(mean_values=[0, 0, 0], std_values=[1, 1, 1], target_platform='rk3588')
print('done')

# Load model
print('--> Loading model')
ret = rknn.load_pytorch(model=model, input_size_list=input_size_list)
if ret != 0:
    print('Load model failed!')
    exit(ret)
print('done')

# Build model
print('--> Building model')
ret = rknn.build(do_quantization=False)
if ret != 0:
    print('Build model failed!')
    exit(ret)
print('done')

# Export rknn model
print('--> Export rknn model')
ret = rknn.export_rknn('./rknn/backbone_127.rknn')
if ret != 0:
     print('Export rknn model failed!')
     exit(ret)
print('done')

到此,模型转换完成。

可以提前在linux-x86的机器上用用模拟环境运行,测试模型是否转换正常,输出是否符合预期。

模拟环境使用可直接参考./rknn-toolkit2-1.3/examples/下的程序示例。

二、rk3588平台使用

1.模型初始化

仅仅只做模型初始化

self.rknn_Tback = RKNNLite()

# load RKNN model
print('--> Load RKNN model')
ret = self.rknn_Tback.load_rknn(Tback_weight)
if ret != 0:
    print('Load RKNN model failed')
    exit(ret)
print('done')

# init runtime environment
print('--> Init runtime environment')

ret = self.rknn_Tback.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
if ret != 0:
    print('Init runtime environment failed')
    exit(ret)
print('done')
 

2.推理

需要注意的是,在rknn_lite里面,inference时,数据的输入都是需按照NHWC格式储存,所以,在送进模型之前需要将数据进行换轴操作。(与模拟环境运行不同,模拟环境可以指定data_format='nchw'),这里在rknn_toolkit_lit2的开发文档中说明了。(还是要多看文档,rknn很多组件没有开发完全,使用起来有很多限制)

inference时候的参考代码如下:

back_T_in = z_crop.transpose((0,2,3,1)) //提前换成‘nhwc’格式
self.Toutput = self.rknn_Tback.inference(inputs=[back_T_in])

预测得到的数据都是一个list类型,只有一个输出则list长度为1,有两个输出则list长度为2。

附:

有C++部署需求的小伙伴可参考:

https://github.com/Try2ChangeX/NanoTrack_Libtorch: C++版本基于libtorch的NanoTrack跟踪算法

基于libtorch部署的Nanotrack跟踪算法,已验证跑通。

  • 12
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
【优质项目推荐】 1、品质保证:项目代码均经过严格测试,确保功能稳定且运行ok。您可以放心下载并立即投入使用,若遇到任何问题,随时欢迎您的反馈与交流。 2、适用广泛:无论您是计算机相关专业(如计算机科学、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业老师,还是企业员工,都适用。 3、多用途价值:该项目不仅具有很高的学习借鉴价值,对于初学者来说,是入门进阶的绝佳选择;当然也可以直接用于 毕业设计、课程设计、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,那该项目代码更是您发挥创意、实现新功能的起点。可以基于此代码进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎交流学习,欢迎借鉴引用,共同探索编程的无穷魅力! Centernet算法移植部署瑞芯微rk3588开发板c++源码含使用说明+rknn模型.zip centernet 瑞芯微 rknn 板端 C++部署。 编译和运行 1)编译 ``` cd examples/rknn_rknn_centernet_demo_open bash build-linux_RK3588.sh ``` 2)运行 ``` cd install/rknn_centernet_demo_Linux ./rknn_centernet_demo ``` 注意:修改模型、测试图像、保存图像的路径,修改文件为src下的main.cc ``` int main(int argc, char **argv) { char model_path[256] = "/home/zhangqian/rknn/examples/rknn_centernet/model/RK3588/yolov8nseg_relu_80class_dfl.rknn"; char image_path[256] = "/home/zhangqian/rknn/examples/rknn_centernet/test.png"; char save_image_path[256] = "/home/zhangqian/rknn/examples/rknn_centernet/test_result.jpg"; detect(model_path, image_path, save_image_path); return 0; } ``` # 板端测试效果 冒号“:”前的数子是coco的80类对应的类别,后面的浮点数是目标得分。(类别:得分)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值