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

相关文章

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、