NanoTrack原理与转tensorrt推理

部署运行你感兴趣的模型镜像

在这里插入图片描述


前言

NanoTrack 是一种轻量级且高效的目标跟踪算法,基于Siamese网络架构,旨在在资源受限的设备(如无人机、嵌入式系统等)上实现实时且精确的目标跟踪。随着计算机视觉领域的快速发展,传统的目标跟踪算法(如KCF等)逐渐暴露出在复杂场景中的局限性,特别是在处理目标的尺度变化、遮挡和背景复杂时,性能难以保证。
本文档将详细介绍 NanoTrack 的模型结构以帮助读者更好地理解并应用该算法,同时对比pt、onnx、tensorrt进行推理的耗时情况。
NanoTrack源码下载:https://github.com/HonglinChu/SiamTrackers/tree/master/NanoTrack


一、NanoTrack 工作原理

NanoTrackV1 Architecture
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

  1. 模型架构:NanoTrack 使用两个相同的卷积神经网络分别处理模板图像(target template)和搜索区域图像(search region)。这两个网络提取的特征随后用于相似性计算。

  2. 模板分支与搜索分支:
    模板分支:处理目标的模板图像,通常是目标的初始帧或之前帧的一个小区域。通过卷积操作,提取模板的深度特征表示。模板T的input输入为[1,3,127,127],经过backbone特征提取网络得到output1[1,48,8,8]的模板特征;
    搜索分支:处理搜索区域图像,该图像包含当前帧中可能包含目标的较大区域。这个分支也通过卷积操作提取深度特征。图像S的input输入为[1,3,255,255],经过backbone特征提取网络得到output2[1,48,16,16]的图像特征;

  3. 相关性计算:特征图上的每个位置都进行一次简单的元素级相乘,通过这种方式生成一个新的响应图。这个响应图每个像素的位置反映了该位置上的模板和搜索区域特征的相似度,表示目标在搜索区域中的可能位置。

  4. 边界框回归:在响应图生成后,跟踪器会根据该响应图来估计目标的位置和尺寸。Pointwise-Correlation 的输出会传递给回归网络,预测目标的最终边界框。

二、运行demo与转换tensorrt模型

2.1 运行pt模型demo

配置环境这些基础的步骤这里就不做赘述了。
以下讲解以V3源码为例:
NanoTrack/bin/demo.py里修改配置文件与模型路径,改成V3版本的:

parser = argparse.ArgumentParser(description='tracking demo') 

parser.add_argument('--config', default='../models/config/configv3.yaml',type=str, help='config file')

parser.add_argument('--snapshot', default='../models/pretrained/nanotrackv3.pth', type=str, help='model name')

parser.add_argument('--video_name', default='../bin/girl_dance.mp4', type=str, help='videos or image files')

parser.add_argument('--save', action='store_true', help='whether visualzie result') 

args = parser.parse_args()

然后运行:

python demo.py

2.2 转onnx模型

这里将pt模型拆成3个部分,在NanoTrack/pytorch2onnx.py中进行修改:

# backbone input-xf
 backbone_s = torch.randn([1, 3, 255, 255], device=device)
 export_onnx_file_path = './models/onnx/nanotrack_backbone_S.onnx'
 torch.onnx.export(backbone_net, backbone_s, export_onnx_file_path, input_names=['input'], output_names=['output'],
                   verbose=True, opset_version=14)

 # backbone input-xf
 backbone_x = torch.randn([1, 3, 127, 127], device=device)
 export_onnx_file_path = './models/onnx/nanotrack_backbone_T.onnx'
 torch.onnx.export(backbone_net, backbone_x, export_onnx_file_path, input_names=['input'], output_names=['output'],
                   verbose=True, opset_version=14)

 # head  change forward  /media/dell/Data/NanoTrack/nanotrack/models/model_builder.py
 head_zf, head_xf = torch.randn([1, 96, 8, 8], device=device), torch.randn([1, 96, 16, 16], device=device)
 export_onnx_file_path = './models/onnx/nanotrack_head.onnx'
 torch.onnx.export(head_net, (head_zf, head_xf), export_onnx_file_path, input_names=['input1', 'input2'],
                   output_names=['output1', 'output2'], verbose=True, opset_version=14)

这里需要注意V3模型,模板T的input输入为[1,3,127,127],经过backbone特征提取网络得到output1[1,96,8,8]的模板特征;
在这里插入图片描述
图像S的input输入为[1,3,255,255],经过backbone特征提取网络得到output2[1,96,16,16]的图像特征;
在这里插入图片描述

output1和output2会作为input1与input2被送入模型head部分,v3默认输出是output1[1,2,15,15],output2[1,4,15,15]
在这里插入图片描述
具体的可以查询NanoTrack/models/config/configv3.yaml中的:
在这里插入图片描述

2.3 转tensorrt模型

下载NanoTrack TRT项目:https://github.com/SSSSSSL/NanoTrack_TensorRT/tree/master

这里根据自己转出的onnx模型为例,进行修改路径(也可以直接运行NanoTrack_TensorRT/create_trt_engine.sh生成项目自带的模型)

BACK_EXAM_ONNX="models/nanotrack_backbone_S.onnx"
BACK_TEMP_ONNX="models/nanotrack_backbone_T.onnx"
HEAD_ONNX="models/nanotrack_head.onnx"

TRT_BIN="/usr/src/tensorrt/bin/trtexec"

BACK_EXAM_TRT="models/nanotrack_backbone_S.engine"
BACK_TEMP_TRT="models/nanotrack_backbone_T.engine"
HEAD_TRT="models/nanotrack_head.engine"

运行NanoTrack_TensorRT/create_trt_engine.sh

在这里插入图片描述
出现上图说明转模型成功

2.4 运行trt模型推理

修改NanoTrack_TensorRT/main.py中的engine文件路径:

def main():
    """ 主要功能是加载TensorRT引擎并进行推理 """
    back_exam_engine_path = "models/nanotrack_backbone_S.engine"
    back_temp_engine_path = "models/nanotrack_backbone_T.engine"
    head_engine_path = "models/nanotrack_head.engine"

    tracker = Tracker(back_exam_engine_path, back_temp_engine_path, head_engine_path)

    # webcam 开始追踪
    # trackLive(tracker)


    # video 开始追踪
    video_path = "/home/nvidia/Desktop/project/video/girl_dance.mp4"
    trackVideo(tracker, video_path, save_video=True)


    # benchmark 开始
    # vot_path = "/home/rgblab/tracking/dataset/VOT"
    # benchmarkVOT(tracker, vot_path)

因为我们输出的onnx响应图为15*15的,需要在NanoTrack_TensorRT/core/config.py进行相应修改:
在这里插入图片描述
相应的NanoTrack_TensorRT/core/process.py中的HeadProcessorpost部分也要修改:
在这里插入图片描述
完成以上运行:

python main.py

三、推理速度对比

模型平均FPS
pt70
onnx95
tensorrt132

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


总结

本文介绍了 NanoTrack 的工作原理,并通过实践展示了如何运行pt模型、转换为ONNX模型以及TensorRT模型,最终在嵌入式设备上进行推理。通过对比不同推理框架的耗时情况,展示了TensorRT模型在加速推理方面的优势(相比于pt模型,TensorRT模型平均FPS提升了约90%)。

参考文档:
https://github.com/HonglinChu/SiamTrackers/tree/master/NanoTrack
https://github.com/SSSSSSL/NanoTrack_TensorRT/tree/master
https://blog.youkuaiyun.com/X_windy/article/details/126153227
https://blog.youkuaiyun.com/qq_58248345/article/details/135825911

如果阅读本文对你有用,欢迎一键三连呀!!!
2024年10月24日08:48:03
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

TensorRT-v8.6

TensorRT-v8.6

TensorRT

TensorRT 是NVIDIA 推出的用于深度学习推理加速的高性能推理引擎。它可以将深度学习模型优化并部署到NVIDIA GPU 上,实现低延迟、高吞吐量的推理过程。

<think>嗯,用户想将NanoTrack3换为TensorRT,我需要详细说明步骤。首先,我得确认换的基本流程。通常,这类换需要先将PyTorch模型导出为ONNX格式,然后再用TensorRT换。但用户可能对具体细节不太清楚,比如环境配置或者遇到的一些常见问题。用户之前提到过NanoTrack原理TensorRT推理,可能已经有一定的背景知识。但这次是具体步骤,所以需要分步骤讲解。首先,环境准备很重要,要确保安装正确的库版本,比如PyTorch、ONNX、TensorRT等。这些依赖项如果有冲突会导致换失败,可能需要提醒用户注意版本兼容性。接下来是导出ONNX模型。这部分需要修改模型代码,确保动态维度支持,比如输入尺寸不固定。用户可能不知道如何处理动态轴,需要给出代码示例,比如在torch.onnx.export中设置dynamic_axes。此外,检查ONNX模型是否正确也是关键,可以使用Netron工具可视化,这一步可能用户会忽略,需要强调。 然后是TensorRT换。这里有两种方法,使用trtexec工具或者PythonAPI。用户可能更倾向于命令行工具,因为比较简单,但PythonAPI更灵活。需要给出两种方法的示例,并说明优缺点。比如trtexec适合快速测试,而Python API适合集成到项目中。 换后的验证也不能少,要确保推理结果一致。用户可能需要对比原始PyTorch模型和TensorRT模型的输出,避免精度损失。性能测试部分,要提到测试不同输入尺寸下的推理速度,比如延迟和吞吐量,这对实际应用很重要。 常见问题方面,用户可能会遇到ONNX导出时的算子不支持问题,需要建议替换或自定义算子。形状不匹配也可能出现,特别是动态尺寸处理不当的时候。性能调优方面,可以建议启用FP16或INT8量化,但需要硬件支持。最后,相关问题的生成要围绕用户可能进一步的需求,比如性能优化、部署到Jetson、INT8量化的步骤,以及处理动态尺度变化的方法。这些都能帮助用户深入应用TensorRT。</think>### NanoTrack3 TensorRT 的详细步骤 #### 一、环境准备 1. **安装依赖库**: ```bash pip install torch==1.9.0 onnx==1.10.0 tensorrt==8.2.1.8 pycuda==2021.1 ``` 2. **下载 NanoTrack3 源码**: ```bash git clone https://github.com/HonglinChu/SiamTrackers ``` #### 二、导出 ONNX 模型 1. **修改模型代码**(需支持动态输入): ```python import torch model = NanoTrack3() # 初始化模型 dummy_input = torch.randn(1, 3, 256, 256) # 示例输入尺寸 torch.onnx.export(model, dummy_input, "nanotrack3.onnx", input_names=["input"], output_names=["output"], dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}}) ``` 2. **验证 ONNX 模型**: ```bash python -m onnxruntime.tools.check_onnx_model nanotrack3.onnx ``` #### 三、换 ONNX 到 TensorRT 1. **使用 `trtexec` 工具**: ```bash trtexec --onnx=nanotrack3.onnx --saveEngine=nanotrack3.trt --fp16 ``` 2. **Python API 换**: ```python import tensorrt as trt logger = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(logger) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser = trt.OnnxParser(network, logger) with open("nanotrack3.onnx", "rb") as f: parser.parse(f.read()) config = builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) engine = builder.build_engine(network, config) ``` #### 四、验证 TensorRT 模型 1. **推理对比**: ```python import pycuda.autoinit import pycuda.driver as cuda with open("nanotrack3.trt", "rb") as f: runtime = trt.Runtime(logger) engine = runtime.deserialize_cuda_engine(f.read()) ``` #### 五、性能优化 - **启用 INT8 量化**(需校准数据集): ```bash trtexec --onnx=nanotrack3.onnx --int8 --saveEngine=nanotrack3_int8.trt ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值