【环境配置】YOLOX-华为Ascend-Pytorch模型离线推理【项目复盘】

本文主要是介绍【环境配置】YOLOX-华为Ascend-Pytorch模型离线推理【项目复盘】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 推理流程
        • 导出ONNX文件
        • 转换om模型
        • 测试集预处理
          • 前处理脚本
          • 生成预处理数据,得到对应的info文件
        • 离线推理
        • 精度统计
          • 后处理脚本
        • 性能对比
          • npu
          • gpu

前言
本文基于下面的参考
Ascend PyTorch模型离线推理指导

推理流程

导出ONNX文件

这一步参考官方教程

转换om模型
  1. 激活环境source env.sh
    env.sh内容见下

    # export install_path=/usr/local/Ascend/ascend-toolkit/latest
    # export install_path=/home/wgzheng/envs/Ascend/ascend-toolkit/latest
    export install_path=/home/wgzheng/packages/Ascend/ascend-toolkit/latest
    export PATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH
    export PYTHONPATH=${install_path}/atc/python/site-packages
    export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64
    export ASCEND_OPP_PATH=${install_path}/opp
    export ASCEND_AICPU_PATH=${install_path}
    export ASCEND_SLOG_PRINT_TO_STDOUT=0
    export ASCEND_GLOBAL_LOG_LEVEL=0
    # export DUMP_GE_GRAPH=2
    # export DUMP_GRAPH_LEVEL=2
    
  2. 执行下面的转换命令

    atc --framework=5 --model=yolox_x.onnx -output=yolox_x_fix --input_shape="images:1,3,640,640" --input_format=ND --soc_version=Ascend310 --keep_dtype=execeptionlist.cfg
    

    execeptionlist.cfg内容见下图请添加图片描述

测试集预处理
前处理脚本

preprocess.py

import os
import sys
import argparse
from tqdm import tqdm
import torch
from torch.utils.data import DataLoader
from yolox.data import COCODataset, ValTransform
sys.path.append('../YOLOX-main')def main():parser = argparse.ArgumentParser(description='YOLOX Preprocess')parser.add_argument('--dataroot', dest='dataroot',help='data root dirname', default='./datasets/COCO',type=str)parser.add_argument('--output', dest='output',help='output for prepared data', default='prep_data',type=str)parser.add_argument('--batch',help='validation batch size',type=int)opt = parser.parse_args()valdataset = COCODataset(data_dir=opt.dataroot,json_file='instances_val2017.json',name="val2017",img_size = (640,640),preproc=ValTransform(legacy=False),)sampler = torch.utils.data.SequentialSampler(valdataset)dataloader_kwargs = {"num_workers": 8, "pin_memory": True, "sampler": sampler, "batch_size": opt.batch}val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)for idx, data in tqdm(enumerate(val_loader)):inps = data[0].numpy()output_name = "{:0>12d}.bin".format(idx)output_path = os.path.join('/home/wxd/CODE/YOLOX/prep_data/', output_name)inps.tofile(output_path)if __name__ == "__main__":main()

执行python preprocess.py

生成预处理数据,得到对应的info文件

gen_dataset_info.py

# Copyright 2020 Huawei Technologies Co., Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.import os
import sys
import cv2
from glob import globdef get_bin_info(file_path, info_name, width, height):bin_images = glob(os.path.join(file_path, '*.bin'))with open(info_name, 'w') as file:for index, img in enumerate(bin_images):content = ' '.join([str(index), img, width, height])file.write(content)file.write('\n')def get_jpg_info(file_path, info_name):extensions = ['jpg', 'jpeg', 'JPG', 'JPEG']image_names = []for extension in extensions:image_names.append(glob(os.path.join(file_path, '*.' + extension)))  with open(info_name, 'w') as file:for image_name in image_names:if len(image_name) == 0:continueelse:for index, img in enumerate(image_name):img_cv = cv2.imread(img)shape = img_cv.shapewidth, height = shape[1], shape[0]content = ' '.join([str(index), img, str(width), str(height)])file.write(content)file.write('\n')if __name__ == '__main__':file_type = sys.argv[1]file_path = sys.argv[2]info_name = sys.argv[3]if file_type == 'bin':width = sys.argv[4]height = sys.argv[5]assert len(sys.argv) == 6, 'The number of input parameters must be equal to 5'get_bin_info(file_path, info_name, width, height)elif file_type == 'jpg':assert len(sys.argv) == 4, 'The number of input parameters must be equal to 3'get_jpg_info(file_path, info_name)

执行python gen_dataset_info.py bin ./prep_data ./prep_bin.info 640 640

离线推理
./benchmark.x86_64 -model_type=vision -device_id=0 -batch_size=1 -om_path=yolox_x_fix.om -input_text_path=../prep_bin.info -input_width=640 -input_height=640 -output_binary=True -useDvpp=False
精度统计
后处理脚本

postprocess.py

import os
import sys
import argparse
from tqdm import tqdm
import torch
from torch.utils.data import DataLoader
from yolox.data import COCODataset, ValTransform
from yolox.evaluators import COCOEvaluator
from yolox.utils.boxes import postprocessfrom yolox.utils.demo_utils import demo_postprocess,multiclass_nms
import numpy as np
sys.path.append('../YOLOX-main')def get_output_data(dump_dir,idx,dtype=np.float32):output_shape = [1,8400,85]input_file = os.path.join(dump_dir, "{:0>12d}_1.bin".format(idx))input_data = np.fromfile(input_file, dtype=dtype).reshape(output_shape)return torch.from_numpy(input_data)def main():parser = argparse.ArgumentParser(description='YOLOX Postprocess')parser.add_argument('--dataroot', dest='dataroot',help='data root dirname', default='./datasets/COCO',type=str)parser.add_argument('--dump_dir', dest='dump_dir',help='dump dir for bin files', default='./result/dumpOutput_device0/',type=str)parser.add_argument('--batch', dest='batch',help='batch for dataloader',default=1,type=int)opt = parser.parse_args()valdataset = COCODataset(data_dir=opt.dataroot,json_file='instances_val2017.json',name="val2017",img_size = (640,640),preproc=ValTransform(legacy=False),)sampler = torch.utils.data.SequentialSampler(valdataset)dataloader_kwargs = {"num_workers": 8, "pin_memory": True, "sampler": sampler, "batch_size": opt.batch}val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)data_list = []coco_evaluator = COCOEvaluator(val_loader,img_size=(640,640),confthre=0.001,nmsthre=0.65,num_classes=80)for cur_iter, (imgs, _, info_imgs, ids) in enumerate(tqdm(val_loader)):outputs = get_output_data(opt.dump_dir,cur_iter)outputs = demo_postprocess(outputs,[640,640])outputs = postprocess(outputs, num_classes=80, conf_thre=0.001, nms_thre=0.65)data_list.extend(coco_evaluator.convert_to_coco_format(outputs,info_imgs,ids))results = coco_evaluator.evaluate_prediction(data_list)print(results)if __name__ == "__main__":main()

执行python postprocess.py

性能对比

由于310上无法导出yolox在batch=16的onnx,以下是基于batch=1多脚本。

npu
/benchmark.x86_64 -round=20 -om_path=yolox_x_fix.om -device_id=0 -batch_size=1
gpu
trtexec --onnx=yolox_x.onnx --fp16 --shapes=images:1x3x640x640

这篇关于【环境配置】YOLOX-华为Ascend-Pytorch模型离线推理【项目复盘】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/260858

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

maven私服配置全过程

《maven私服配置全过程》:本文主要介绍maven私服配置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用Nexus作为 公司maven私服maven 私服setttings配置maven项目 pom配置测试效果总结使用Nexus作为 公司maven私

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地