专栏感知reid/osnet算法模型量化转换实践

reid/osnet算法模型量化转换实践

DR_KAN2025-06-16
165
0
ReID算法,全称是“行人再识别(Person Re-Identification)”算法,可应用于智能驾驶或智能机器人陪伴等领域。它的目标是在不同摄像头或不同时间拍摄的多张图像中,准确识别出是否为同一个人。本文以 ReID 中比较有名的 OSNet 模型为例,讲解如何在地平线计算平台量化该模型。
OSNet(Omni-Scale Network)是 行人再识别 任务中非常流行的一种深度学习架构,旨在高效提取行人图像中不同尺度的判别特征。

🧠 核心思想:Omni-Scale Feature Learning

OSNet 的核心思想是:在一个卷积块中同时捕捉多种尺度的信息,而不是像传统方法那样堆叠多个尺度层。

传统 ReID 网络可能在不同层捕捉不同尺度(如局部细节 vs 整体结构),但 OSNet 尝试在每一层同时捕捉小尺度和大尺度的信息。

 

osnet_ain_x1_0 是 OSNet 系列中性能较强的一个变体,其全称是:
OSNet-AIN-x1.0:Omni-Scale Network with Adaptive Instance Normalization(自适应实例归一化)

特点解析

1. ✅ 多尺度特征学习(OSNet 核心)

  • OSBlock 模块引入多个不同感受野的卷积分支。
  • 实现:局部细节与全局上下文同时建模。

  • 相比传统 ResNet,有更强的判别性和更少的参数。

2. 🔄 AIN:自适应实例归一化

  • Adaptive Instance Normalization 是一种可以调节风格的归一化方法,常用于领域自适应。
  • 在 ReID 中,行人图像来自不同摄像头或环境,AIN 可以自适应不同图像风格,减轻 域偏移(domain shift) 的影响。
  • 提升跨摄像头、跨数据集的识别能力。

 

源码导出ONNX

克隆代码仓库

克隆代码仓库的master分支。

之后按照官方指导搭建好环境。

 

下载预训练权重

使用Multi-source domain generalization章节osnet_ain_x1_0的MS+D+C->M权重osnet_ain_ms_d_c.pth.tar。

 

导出onnx

将osnet_ain_ms_d_c.pth.tar权重文件存放到项目根目录,编写并运行onnx导出脚本。

检查onnx和pytorch一致性

如果多次运行,相似度打印均为1,且最大差值均在e-5以内,则可认为onnx和pytorch的输出保持一致。

PTQ量化

生成校准数据

可以从官方数据集(Market-1501-v15.09.15)中选择数百张jpg图片用来生成校准数据。

在生成校准数据前,需要明确预处理参数,在源码deep-person-reid-master/torchreid/data/transforms.py中,可以得知训练时会将图片直接resize成模型输入尺寸,并使用imagenet数据集的标准归一化参数,即:

且由归一化参数可知,模型训练时使用的色彩通道顺序是rgb。

此时可以基于horizon_model_convert_sample提供的脚本生成校准数据,只需基于02_preprocess.sh和preprocess.py脚本做如下改动:

由于归一化计算会集成到PTQ生成模型的预处理节点中,因此校准数据无需做归一化处理。

 

量化编译

推荐使用如下YAML配置:

这里使用nv12作为板端模型的输入,mean_value和scale_value由归一化参数计算得到。同时,考虑到InstanceNormalization算子的量化风险较高,因此为模型中的前两个InstanceNormalization配置浮点计算精度,YAML中run_on_cpu配置的算子较多是因为InstanceNormalization会被PTQ拆分成多个算子。

可以使用以下命令编译:

编译完成后,日志打印的相似度如下(quantized.onnx对比optimized.onnx):

余弦相似度>0.99,可初步认为量化精度满足需求。

 

验证PTQ生成onnx的输出相似度

在编译流程结束后,可以手动验证各PTQ生成物和原始onnx的输出相似度,及时发现可能的精度问题。

*请根据不同的计算平台修改代码。

PTQ各阶段生成的onnx和原始onnx的相似度打印结果如下:

余弦相似度均>0.99,可进一步认为量化精度满足需求。

 

精度评测

评测结果

测试数据集:Market-1501-v15.09.15

  1. 距离度量方式:cosine

测试模型

mAP

Rank-1

Rank-5

Rank-10

预训练权重

osnet_ain_ms_d_c.pth.tar

45.8%

73.1%

86.5%

90.4%

导出的onnx

osnet_ain_x1_0.onnx

45.8%

73.0%

86.6%

90.5%

PTQ量化onnx

reid_quantized_model.onnx

45.5%

73.3%

86.3%

90.3%

量化精度损失

0.6%

-0.4%

0.3%

0.2%

  1. 距离度量方式:euclidean

测试模型

mAP

Rank-1

Rank-5

Rank-10

预训练权重

osnet_ain_ms_d_c.pth.tar

43.8%

72.4%

85.8%

89.7%

导出的onnx

osnet_ain_x1_0.onnx

43.8%

72.4%

85.9%

89.7%

PTQ量化onnx

reid_quantized_model.onnx

43.4%

72.1%

86.0%

89.9%

量化精度损失

0.8%

0.4%

-0.1%

-0.3%

 

评测方法

预训练权重

在第一章配置好的官方运行环境中,使用代码仓库的现有方法对预训练权重做精度评测。

导出的onnx

需要基于第一章配置好的官方运行环境,额外安装onnxruntime和tqdm模块。

测试时,datamanager参数需要和configs/im_osnet_ain_x1_0_softmax_256x128_amsgrad_cosine.yaml对齐。

 

PTQ量化onnx

需要基于第一章配置好的官方运行环境,额外安装onnxruntime和tqdm模块,并安装horizon-nn/hmct和horizon-tc-ui。

测试时,datamanager参数需要和configs/im_osnet_ain_x1_0_softmax_256x128_amsgrad_cosine.yaml对齐,且需要把输入数据处理成yuv444类型。

 

性能评测

评测结果

以X5为例,该模型的单线程推理延时为51.4ms,对应FPS为19.4

Latency是指单流程推理模型所耗费的平均时间,重在表示在资源充足的情况下推理一帧的平均耗时,体现在上板运行是单核单线程统计。

FPS是指多流程同时进行模型推理平均一秒推理的帧数,重在表示充分使用资源情况下模型的吞吐,体现在上板运行为单核多线程;统计方法是同时起多个线程进行模型推理,计算平均1s推理的总帧数。

Latency与FPS的统计情景不同,Latency为单流程(单核单线程)推理,FPS为多流程(单核多线程)推理,因此推算不一致;若统计FPS时将流程(线程)数量设置为 1 ,则通过Latency推算FPS和测出的一致。

评测方法

可板端使用hrt_model_exec工具获取模型的实测性能数据,测试命令如下:

 

 

 

感知
社区征文技术深度解析
评论0
0/1000