【环境配置】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

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni