OSNet模型-推理指导

概述

作为一个实例级的识别问题,行人再识别(ReID)依赖于具有识别能力的特征,它不仅能捕获不同的空间尺度,还能封装多个尺度的任意组合。这些同构和异构尺度的特征为全尺度特征。本文设计了一种新颖的深度CNN,称为全尺度网络(OSNet),用于ReID的全尺度特征学习。这是通过设计一个由多个卷积特征流组成的残差块来实现的,每个残差块检测一定尺度的特征。重要的是,引入了一种新的统一聚合门用输入依赖的每个通道权重进行动态多尺度特征融合。为了有效地学习空间通道相关性,避免过拟合,构建块同时使用点卷积和深度卷积。通过逐层叠加这些块,OSNet非常轻量,可以在现有的ReID基准上从零开始训练。尽管OSNet模型很小,但其在6个Reid数据集上到达了SOTA结果。

  • 参考实现:

    url=https://github.com/KaiyangZhou/deep-person-reid
    commit_id=e580b699c34b6f753a9a06223d840317546c98aa
    model_name=OSNet
    

输入输出数据

  • 输入数据

    输入数据 数据类型 大小 数据排布格式
    input RGB_FP32 batchsize x 3 x 256 x 128 NCHW
  • 输出数据

    输出数据 数据类型 大小 数据排布格式
    output1 FLOAT32 batchsize x 512 ND

推理环境准备

快速上手

获取源码

  1. 获取源码。

    git clone  https://github.com/KaiyangZhou/deep-person-reid     
    cd deep-person-reid
    git reset --hard e580b699c34b6f753a9a06223d840317546c98aa
    python setup.py develop
    cd ..
    
  2. 安装依赖。

    pip3 install -r requirements.txt
    

准备数据集

  1. 获取原始数据集。(解压命令参考tar –xvf *.tar与 unzip *.zip)

    本模型支持Market-1501数据集,基本结构目录如下:

    Market
    ├── gt_query
    ├── bounding_box_test    
    ├── query
    ├── gt_bbox 
    └── bounding_box_train
    
  2. 数据预处理,将原始数据集转换为模型输入的数据。

    执行OSNet_preprocess.py脚本,完成预处理。

    #处理gallery数据集,即bounding_box_test测试集
    mkdir gallery_prep_dataset
    python OSNet_preprocess.py Market/bounding_box_test ./gallery_prep_dataset/
    # 处理query数据集
    mkdir query_prep_dataset
    python OSNet_preprocess.py Market/query ./query_prep_dataset/ 
    

模型推理

  1. 模型转换。

    使用PyTorch将模型权重文件.pth转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。

    1. 获取权重文件。

      在该目录下获取权重文件osnet_x1_0_market_256x128_amsgrad_ep150_stp60_lr0.0015_b64_fb10_softmax_labelsmooth_flip.pth

    2. 导出onnx文件。

      1. 使用OSNet_pth2onnx.py导出onnx文件。 运行OSNet_pth2onnx.py脚本。

        python OSNet_pth2onnx.py osnet_x1_0_market_256x128_amsgrad_ep150_stp60_lr0.0015_b64_fb10_softmax_labelsmooth_flip.pth osnet_x1_0.onnx
        

        获得 osnet_x1_0.onnx文件。

      2. 优化ONNX文件。

        python -m onnxsim osnet_x1_0.onnx osnet_x1_0_bs${bs}_sim.onnx --input-shape ${bs},3,256,128
        

        获得osnet_x1_0_bs${bs}_sim.onnx文件。

    3. 使用ATC工具将ONNX模型转OM模型。

      1. 配置环境变量。

         source /usr/local/Ascend/ascend-toolkit/set_env.sh
        
      2. 执行命令查看芯片名称(${chip_name})。

        npu-smi info
        #该设备芯片名为Ascend310P3 (自行替换)
        回显如下:
        +-------------------+-----------------+------------------------------------------------------+
        | NPU     Name      | Health          | Power(W)     Temp(C)           Hugepages-Usage(page) |
        | Chip    Device    | Bus-Id          | AICore(%)    Memory-Usage(MB)                        |
        +===================+=================+======================================================+
        | 0       310P3     | OK              | 15.8         42                0    / 0              |
        | 0       0         | 0000:82:00.0    | 0            1074 / 21534                            |
        +===================+=================+======================================================+
        | 1       310P3     | OK              | 15.4         43                0    / 0              |
        | 0       1         | 0000:89:00.0    | 0            1070 / 21534                            |
        +===================+=================+======================================================+
        
      3. 执行ATC命令。

        atc --framework=5 --model=./osnet_x1_0_bs${bs}_sim.onnx --input_format=NCHW --input_shape="image:${bs},3,256,128" --output=osnet_x1_0_bs${bs} --soc_version=Ascend${chip_name} 
        
        • 参数说明:

          • --model:为ONNX模型文件。
          • --framework:5代表ONNX模型。
          • --output:输出的OM模型。
          • --input_format:输入数据的格式。
          • --input_shape:输入数据的shape。
          • --log:日志级别。
          • --soc_version:处理器型号。

          运行成功后生成osnet_x1_0_bs${bs}.om模型文件。

  2. 开始推理验证。

    1. 安装ais_bench推理工具。

      请访问ais_bench推理工具代码仓,根据readme文档进行工具安装。

    2. 执行推理。

      python -m ais_bench --model=osnet_x1_0_bs${bs}.om --input=./gallery_prep_dataset/ --output=./ --output_dirname=./result_gallery --batchsize=${batch_size} --outfmt=TXT  
      
      python -m ais_bench --model=osnet_x1_0_bs${bs}.om --input=./query_prep_dataset/ --output=./ --output_dirname=./result_query --batchsize=${batch_size}  --outfmt=TXT
      
      • 参数说明:

        • model:om模型地址
        • input:预处理数据
        • output:推理结果保存路径
        • output_dirname:推理结果保存子目录
        • outfmt:输出数据格式

      推理后的输出保存在当前目录result_query和result_gallery下。

    3. 精度验证。

      调用脚本与数据集标签val_label.txt比对,可以获得Accuracy数据,结果保存在result.json中。

      python OSNet_postprocess.py  result_query result_gallery ./ result.json
      
      • 参数说明:

        • 第一个参数为query数据的推理结果

        • 第二个参数为gallery数据的推理结果

        • 第三个参数为精度结果的保存路径

        • 第四个参数为精度结果的保存json文件

    4. 性能验证。补充参数说明

      可使用ais_bench推理工具的纯推理模式验证不同batch_size的om模型的性能,参考命令如下:

       python3.7 -m ais_bench --model=osnet_x1_0_bs${bs}.om --loop=100 --batchsize=${batch_size}
      
      • 参数说明:
        • --model:om模型路径
        • --batchsize:batchsize大小

模型推理性能&精度

调用ACL接口推理计算,性能参考下列数据。

芯片型号 Batch Size 数据集 精度 性能
300I Pro 1 Market-1501 R1:94.38% mAP:82.55% 1314
300I Pro 4 Market-1501 3529
300I Pro 8 Market-1501 4075
300I Pro 16 Market-1501 3649
300I Pro 32 Market-1501 3321
300I Pro 64 Market-1501 2821