摘要:在做基于Ascend CL模型推理时,通常使用的有OpenCV、AIPP、DVPP这三种方式,或者是它们的混合方式,本文比较了这三种方式的特点,并以Resnet50的pytorch模型为例,结合训练营提供的sample,说明了分别是如何实现预处理的。

本文分享自华为云社区《【2023 · CANN训练营第一季】——模型推理时数据预处理方法及归一化参数计算》,作者: dayao。

前言:

对待推理图片执行模型推理前,需要对图片进行预处理,以满足模型的输入要求。我们可以通过阅读模型训练代码,查看预处理的方法。在做基于Ascend CL模型推理时,通常使用的有OpenCV、AIPP、DVPP这三种方式,或者是它们的混合方式,本文比较了这三种方式的特点,并以Resnet50的pytorch模型为例,结合训练营提供的sample,说明了分别是如何实现预处理的。本文还介绍了AIPP做减均值/乘系数的参数是如何计算的。

一、查找模型训练时的预处理方式

这一步对我这样的新手有些难度,在训练营可以直接问授课老师,或者是无所不晓的老班(帅高),亦或是无所不能的小助手

以Resnet50的pytorch模型为例,这里模型需要的数据预处理方法,再讲述两种查找方法。

Resnet50模型,需要对待推理图片的数据预处理是:缩放到224*224;以RGB的顺序存放;对像素/255.0,变换到[0.0,1.0]范围内;再按三个通道,分别做减均值,乘系数的运算,三个通道的均值是[0.485, 0.456, 0.406],对应系数分别是:[0.229, 0.224, 0.225]。

1、方法一:在昇腾官方的modelzoo去查。https://gitee.com/ascend/modelzoo

然后选择用于训练的模型PyTorch目录

在搜索框中,输入Resnet50,找到对应的模型文件

然后在modelarts / train_start.py里查到的处理代码如下:

2、方法二:到pytorch官网去查

https://pytorch.org/vision/stable/models/generated/torchvision.models.resnet50.html#torchvision.models.resnet50

二、数据预处理的方式

确定好了输入图片需要做哪些预处理,接下来就需要选择合适的实现方式。Ascend CL常用的有三种:Opencv、AIPP、DVPP。这三种方式的特点如下表所示:

本次训练营,勤劳的小虎老师贴心的给大家准备了三种方式,供大家学习和掌握。代码在:https://gitee.com/ascend/samples/tree/master/inference/modelInference。分别是:纯open CV;CV+AIPP;DVPP+AIPP。如下表所示:

1、CV方式:sampleResnetQuickStart

2、cv+AIPP方式:sampleResnetAIPP.cpp​

3、DVPP+AIPP方式:sampleResnetDVPP

三、减均值/乘系数 用AIPP实现的计算

Pytorch官方的计算方法:

1、将图像数据调整到[0.0, 1.0]之间,相当于(/255.0)——torchvision.transforms.ToTensor

2、将数据x = (x - mean(x))/std(x)——torchvision.transforms.Normalize

用数学公式表达:

pixel_out_chx(i)=[pixel_in_chx(i)/255 - mean_i]/std_i

=[pixel_in_ch(i) - mean_i*255]/(255*std_i) (公式一)

注:pixel_out_chx(i):计算输出值;

pixel_in_chx(i):原始像素值,取值范围[0, 255];

mean_i:均值,3个颜色通道分别取:[0.485, 0.456, 0.406]

std_i:系数,3个颜色通道分别取:[0.229, 0.224, 0.225]

AIPP减均值乘系数的计算公式:

pixel_out_chx(i)=[pixel_in_chx(i)-mean_chn_i-min_chn_i]*var_reci_chn (公式二)

注:pixel_out_chx(i):计算输出值;

pixel_in_chx(i):原始像素值,取值范围[0, 255];

mean_chn_i表示每个通道的均值;

min_chn_i表示每个通道的最小值;

var_reci_chn表示每个通道方差的倒数

mean_chn_i和min_chn_i可以任意使用1个,另一个为0。令mean_chn_i=0,

公式一和公式二的像素经过计算后的值相等,所以公式的右边也相等,计算可得出:

min_chn_i = mean_i*255

var_reci_chn = 1/(255*std_i)

三个通道的计算如下:

点击关注,第一时间了解华为云新鲜技术~

CANN训练:模型推理时数据预处理方法及归一化参数计算的更多相关文章

  1. python中常用的九种数据预处理方法分享

    Spyder   Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...

  2. 1、JVM 内存模型+运行时数据区+JVM参数

    JMM(内存模型)  1.’主内存+每个线程有自己的内存 JVM运行时数据区 包含:1.程序计算器(每个线程自带):2.JAVA-STACK(每个线程自带):3.本地方法stack:4.堆:5.方法区 ...

  3. jvm内存模型(运行时数据区)

    运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...

  4. JVM运行时数据区--方法区

    运行时数据区结构图(温习): 堆.栈.方法区的交互关系 方法区的理解 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存 ...

  5. JVM详解(五)——运行时数据区-方法区

    一.概述 1.介绍 <Java虚拟机规范>中明确说明:尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩.但对于HotSpot JVM而言,方法 ...

  6. Python数据预处理(sklearn.preprocessing)—归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer, normalize)

      关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常 ...

  7. sklearn中常用数据预处理方法

    1. 标准化(Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值,单位方差.也叫z-score规范化(零均值规范化).计 ...

  8. 神经网络中的数据预处理方法 Data Preprocessing

    0.Principal component analysis (PCA) Principal component analysis (PCA) is a statistical procedure t ...

  9. sklearn中的数据预处理----good!! 标准化 归一化 在何时使用

    RESCALING attribute data to values to scale the range in [0, 1] or [−1, 1] is useful for the optimiz ...

  10. 编程写一个方法时,注意方法中传参数的数量最好不要超过5个,超过5个怎么办?可以用struct或class,或一个字典类

    图  1 一.从图1发现了什么问题呢? 答案:1.参数传的的太多了:2.另外注释也没写好. 说明:一个方法中,传参数的数量最好不要超过5个. 应该采用:struct或class,或一个字典类都行.其中 ...

随机推荐

  1. P2P网络

    P2P 网络是什么 点对点技术(peer-to-peer, 简称 P2P )又称对等互联网络技术,是一种网络技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上. 即不是传统 ...

  2. 关于ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x87\xA8\xF0\x9F...'报错的解决心得

    昨天发现MySQL数据库执行发生了报错 ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x87\xA8\xF0\x9F...' 马上意识到应 ...

  3. spring-boot-starter-webflux 与spring-cloud-starter-openfeign冲突

    Thu Oct 22 17:16:01 CST 2020 [3be84a1c-14] There was an unexpected error (type=Internal Server Error ...

  4. android studio 隐式Internet跳转

    直接setAction方法 Intent intent = new Intent(); intent.setAction("com.hly.view.fling"); startA ...

  5. api接口基础Day1

    精华笔记: String: String的常用方法: length():获取字符串的长度(字符个数) trim():去除当前字符串两边的空白字符 toUpperCase()/toLowerCase() ...

  6. 使用idea从零编写SpringCloud项目-zuul

    带着问题学习是最好的,什么是网关?使用网关的好处是什么?怎么使用网关 网关:是系统对外的唯一入口,是介于客户端和服务端的中间层,处理非业务功能,提供路由的请求,鉴权,监控,缓存,限流等 网关的好处:可 ...

  7. Sublime Text3汉化好的绿色免安装版使用和破解教程+下载链接

    这个资源是我从官网上面下载好的Sublime Text3绿色版,然后通过网上的教程汉化之后再压缩的.理论上下载完之后,解压就可以用了,不过由于是绿色版,可能需要调一下默认打开方式.才好直接双击打开.绿 ...

  8. ant build 报 warning modified in the future

    错误原因:在测试项目时,修改了系统时间,之后保存了文件,再将系统时间改回来,会报这个错误 解决方法:复制改过的文件到记事本,然后回退下文件,再将记事本的内容覆盖下文件,重新build下就可以了.

  9. Spring日志与SpringBoot日志

    本篇意为说明Spring默认日志实现与SpringBoot默认日志实现. 1.日志 在这之前,我们应该先了解一些日志框架. 具体可以看我这篇随笔:https://www.cnblogs.com/dai ...

  10. vue input有值但还是验证不通过

    验证失败原因: 因为input自动把输入的值转换为string类型,导致验证失败. 解决方案: 一. Input中的v-model改为v-model.number: 二.rules里面需要加type: ...