NHWC和NCHW数据排布及转换(模型部署)

news2024/10/5 14:07:22

1.概念

首先这是两种批量图片的数据存储方式,定义了一批图片在计算机存储空间内的数据存储layout。N表示这批图片的数量,C表示每张图片所包含的通道数,H表示这批图片的像素高度,W表示这批图片的像素宽度。其中C表示的通道数可能有多种情况,例如,RGB图片格式的通道为3通道,R(红色)、G(绿色)、B(蓝色)各占一个通道,表示图片中每个像素点都有三个通道值,每个通道值范围是[0~255],三个通道的叠加呈现出一个像素的颜色。RGB图像还有四通道的表示,除了RGB三通道之外,还有一个alpha通道,表示透明度。如果是灰度图,则只有一个通道。YUV图片也包含了三个通道,与RGB不同的是YUV的数据表现方式有多样组合。

2. 数据layout理解

以RGB数据格式的图像为例,一张RGB图片可以由H、W、C三个参数来描述,图像的高度和宽度分别对应H和W这两个维度,而图像中每一个像素点都有3个值来表示,便是表示红色的R、绿色的G和蓝色的B,每个值的取值范围是[0~255],如下图所示:

在这里插入图片描述

2. 1 NCHW和NHWC在模型推理中的应用

在实际部署时,比如采用部署框架如NCNN、TensorRT、Caffe等,模型推理后会返回类型基本都是float* 的结果数据data,即存储为一维数据。此时如果知道返回data的数据排布是NCHW还是NHWC,就很容易对结果进行解析。两种格式的数据的排布如下:

在这里插入图片描述

(1) NCHW排布

NCHW类似于python 中numpy.array 4维数组的排布:最内层为H,W,外层是C,最外层是N 。由于返回的data是float*类型,因此将4维数据从内层向外层逐渐拆分出来(先排HW数据),排布为一维数组。
[R11,R12,R13....R21,R22,R23,R24...G11,G12,G13....G21,G22,G23,G24...B11,B12,B13....B21,B22,B23,B24...] , 每个通道的元素会紧挨在一起 。假设RGB图像的大小为HxWx3, 对于NCHW排布的数据,[0:HxW]存储的都是R通道的像素值[HxW:2*HxW]存储的都是G通道的像素值,[HxW*2:3*HxW]存储的是B通道的像素值

在这里插入图片描述

(1) NHWC排布

NHWC类似于python 中numpy.array 4维数组的排布:最内层为C,W最外层是H,N。由于返回的data是float*类型,因此将4维数据从内层向外层逐渐拆分出来(先排C数据),排布为一维数组。

[R11,G11,B11,R12,G12,B12,R13,G13,B13...R21,G21,B21,R22,G22,B22....Rij,Gij,Bij], 像素点ij位置上多个通道中的数值连续存储。

在这里插入图片描述
最后是多张图片的存储N,表示一共有N张图片。NHWC和NCHW表示两种图片数据存储方式,应用于不同的硬件加速场景之下。在intel GPU加速的情况下,希望在访问同一个channel的像素是连续的,一般存储选用NCHW也就是输入数据格式为NCHW,这样在做CNN的时候,在访问内存的时候就是连续的了,比较方便。

最佳实践: 设计网络时充分考虑两种格式,最好能灵活切换。在GPU上训练时输入数据格式采用NCHW格式,在推理结果输出时,返回的数据为NHWC格式。

3. NHWC与NCHW之间转化

两种存储方式展示了图片数据在储存器中的存储方式,这两种存储方式之间可以相互转换,以NHWC转NCHW为例,可以做如下转换:

3.1 NHWC 转 NCHW

int nhwc_to_nchw(float *out_data, float *in_data, int img_h, int img_w) {
  auto *hw1 = out_data;
  auto *hw2 = hw1 + img_h * img_w;
  auto *hw3 = hw2 + img_h * img_w;
  for (int hh = 0; hh < img_h; ++hh) {
    for (int ww = 0; ww < img_w; ++ww) {
      *hw1++ = *(in_data++);    // B
      *hw2++ = *(in_data++);    // G
      *hw3++ = *(in_data++);    // R
    }
  }
  return 0;
}
  • in_data 为输入的NHWC 排布的数据, out_data为转换后的NCHW数据

3.2 NCHW 转 NHWC

int nchw_to_nhwc(float* out_data, float* in_data, int img_h, int img_w) {
  auto *res = out_data;

  for (int i = 0; i < img_h * img_w*3 ;) {
      res[i] = *(in_data);    
      res[i+1] = *(in_data + img_h * img_w); 
      res[i+2] = *(in_data + 2*img_h * img_w); 
      i +=3;
    }
  }
  return 0;
}

参考

1 . https://developer.horizon.ai/forumDetail/136488103547258555

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

被热议的DataOps,到底是什么?

近几年&#xff0c;DevOps的火热程度日渐高涨&#xff0c;同时涌现出了各种Ops&#xff0c;包括DevSecOps、GitOps、AIOps、NoOps、DataOps、MLOps、FeatureOps、ModelOps、FinOps等等。其中&#xff0c;对于企业来说&#xff0c;确保数据以高效和合规的方式使用&#xff0c;Da…

git commit 设置 eslint + pretter 格式化校验

系统版本 node 版本: v14.17.5 npm 版本: 6.14.14 vue-cli 版本: vue/cli 4.5.19 目录 系统版本 1. 新建一个 vue2.X 空项目 2. 安装插件 eslint ,并初始化 eslint 配置,根目录生成 .eslintrc 配置文件 3. 测试 eslint 配置 4. 安装 husky、lint-staged 5. 在package.j…

【Linux从入门到精通】了解冯诺依曼体系结构

本片文章会对冯诺依曼体系结构进行详解。同时&#xff0c;我们对冯诺依曼的理解&#xff0c;不能停留在概念上&#xff0c;要深入到对软件数据流理解上。本片文章同时也会对数据在冯诺依曼结构上的交互进行讲解。希望本篇文章会对你有所所帮助。 文章目录 一、简单认识冯诺依曼…

牛客网面试必刷:BM17 二分查找-I

牛客网面试必刷&#xff1a;BM17 二分查找-I 前言一、什么是二分查找&#xff1f;二、二分查找具体代码1.第一种写法&#xff1a;left < right2.第二种写法&#xff1a;left < right 三、复杂度分析 前言 二分查找是一个常见、基础、难度较低问题&#xff0c;本文记录了…

【JMeter入门】—— JMeter介绍

1、什么是JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 &#xff08;Apache JMeter是100%纯JAVA桌面应用程序&#xff09;Apache JMeter可以用于对静…

linux系统挂载硬盘

linux系统挂载硬盘 1、背景2、环境3、准备工作4、挂载分区4.1、查看分区信息4.2、创建分区4.3、设置分区格式4.4、创建挂载目录4.5、挂载分区4.6、设置开机自动挂载4.7、验证是否挂载成功 1、背景 日常使用过程中随着系统业务量的新增对磁盘的空间和性能提出了更高的要求&…

功能测试之设计语言测试:功能测试包含哪些测试?分别有什么作用

Web 设计语言版本的差异可以引起客户端或服务器端严重的问题&#xff0c;例如使用哪种版本的HTML 等。当在分布式环境中开发时&#xff0c;开发人员都不在一起&#xff0c;这个问题就显得尤为重要。除了HTML 的版本问题外&#xff0c;不同的脚本语言&#xff0c;例如Java、Java…

按照这6步学习测试,月薪不过万,我给你介绍测试工作

上周一刚入职不久&#xff0c;是在上海的一家软件公司&#xff0c;税前11K&#xff0c;五险一金&#xff0c;996的工作制&#xff0c;已经上班了一个月&#xff0c;说下自己的感受。 因为我专科毕业4年&#xff0c;之前一直在做电商运营&#xff0c;大专学的专业是电子商务&am…

Linux上Nacos基本使用:连接MySQL并修改密码、启动、停止命令等

Nacos如何连接MySQL并修改密码 说明如何将内嵌数据库Derby切换为MySQL数据库直接新建MySQL数据库: 必须是MySQL5.7及以上 如何修改密码启动、停止命令 说明 nacos默认&#xff1a; 使用内嵌的数据库&#xff08;Derby&#xff09;默认登录地址 ip:8848/nacos; 账号&#xff1…

Flutter组件——Getx入门01

前言 最近要正式开始写一个flutter项目了&#xff0c;我在浏览flutter如何进行框架设计的时候突然看到了一篇关于如何管理flutter状态的文章。flutter中的状态管理并不是很好理解&#xff0c;但是你需要在页面之间传值或者改变组件中的某个值的时候就必须更改状态。当我在这篇…

C生万物 | 字符串函数与内存函数解读【附英译中图解】

文章目录 求字符串长度一、strlen() 长度不受限制的字符串函数一、strcpy()二、strcat()三、strcmp() 长度受限制的字符串函数一、引入二、strncpy()三、strncat()四、strncmp() 字符串查找函数一、strstr()二、strtok() 错误信息报告函数一、strerror() 字符操作函数内存操作函…

从“能用”到“好用”:它的出现,解决你80%的转型困境【内含免费试用附教程】

免费试用地址&#xff1a;引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构引迈信息&#xff0c;提供快速开发平台、快速开发框架、低代码开发平台、低代码开发框架、0代码开发平台、0代码开发框架、零代码开发平台、零代码开发…

战略投资奥琦玮,微盟冲在餐饮复苏最前线

作者 | 辰纹 来源 | 洞见新研社 好起来了&#xff0c;一切都好起来了。 刚刚过去的五一假期&#xff0c;广州费大厨正佳广场店每天取号1000多桌&#xff0c;餐厅翻台率达到了1200%&#xff1b;长沙文和友单日最高排号超过1万&#xff0c;到店人数近6万&#xff1b;武汉主力龙…

OpenGL高级-帧缓冲

效果展示 知识点 颜色缓冲记录帧的颜色值&#xff0c;深度缓冲记录深度信息&#xff0c;模板缓冲允许我们基于一些条件丢弃指定片段。这几种缓冲结合起来叫做帧缓冲(FrameBuffer)&#xff0c;它被储存于内存中。  OpenGL给了我们自己定义帧缓冲的自由&#xff0c;我们可以选择…

Linux网络——shell脚本之正则表达式

Linux网络——shell脚本之正则表达式 一、概述二、基本的正则表达式三、实践操作1.匹配输出规定的电话号码2.匹配规定格式的邮箱 一、概述 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则…

实时聊天如何做,让客户眼前一亮(二)

让我们继续讨论一下如何利用SaleSmartly&#xff08;ss客服&#xff09;在网站中的实时聊天视图如何提供出色的实时聊天体验。 四、在实时聊天会话期间 让我们来看看我们可以确保尽可能的提高客户体验的各种方法&#xff0c;使用SaleSmartly&#xff08;ss客服&#xff09;时聊…

Magic-API的部署

目录 概述简介特性 搭建创建元数据表idea新建spring-boot项目pom.xmlapplication.properties打包上传MagicAPI-0.0.1-SNAPSHOT.jar开启服务访问 magic语法 概述 简介 magic-api是一个基于Java的接口快速开发框架&#xff0c;编写接口将通过magic-api提供的UI界面完成&#xf…

性能优化之Tomcat优化策略

一、优化策略 系统性能的衡量指标&#xff0c;主要是响应时间和吞吐量。 1&#xff09;响应时间&#xff1a;执行某个操作的耗时&#xff1b; 2) 吞吐量&#xff1a;系统在给定时间内能够支持的事务数量&#xff0c;单位为TPS&#xff08;Transactions PerSecond的缩写&…

WhatsApp App Vs WhatsApp API,哪一个更适合你?

WhatsApp在全球拥有超过20亿月度活跃用户&#xff0c;是一个深受欢迎、可靠和安全的跨平台信息服务&#xff0c;使其成为与朋友、家人、同事和客户通信的首选移动信息程序。使用WhatsApp聊天机器人使推销你的公司和获得新客户变得更简单。 一、让我们先来看看WhatsApp个人应用…

VR全景的价值体现在哪里?VR全景创业有市场吗?

在这个5G时代&#xff0c;思维一定要快&#xff0c;动作还得要帅&#xff0c;动作快的现在已经挣到钱了。VR全景行业赶上了风口&#xff0c;在5G的搭载下发展非常迅速。 随着时代的发展&#xff0c;各行各业百花齐放&#xff0c;而创业的门槛也越来越低&#xff0c;作为创业项目…