• 图像数据通道格式:NCHW和NHWC的区别


    在深度学习中,图像数据通道格式有两种:

    1. NCHW,又称:“channels_first”,是nvidia
      cudnn库原生支持的数据模式;在GPU中,使用NCHW格式计算卷积,比NHWC要快2.5倍左右(0:54 vs 2:14)

    在这里插入图片描述

    1. NHWC, 又称“channels_last”,是CPU指令比较适合的方式,SSE 或 AVX优化,沿着最后一维,即C维计算,会更快。
    2. NCHW排列,C在外层,所以每个通道内,像素紧挨在一起,即“RRRGGGBBB”;NHWC排列,C在最内层,所以每个通道内,像素间隔挨在一起,即“RGBRGBRGB”,如下所示:
      在这里插入图片描述
    3. 尽管存储的数据实际上是一样的,但是不同的顺序会导致数据的访问特性不一致,因此即使进行同样的运算,相应的计算性能也会不一样。对于"NCHW"
      而言,其同一个通道的像素值连续排布,更适合那些需要对每个通道单独做运算的操作,比如"MaxPooling"。对于"NHWC"而言,其不同通道中的同一位置元素顺序存储,因此更适合那些需要对不同通道的同一像素做某种运算的操作,比如“Conv1x1”

    在这里插入图片描述

    1. 由于NCHW,需要把所有通道的数据都读取到,才能运算,所以在计算时需要的存储更多。这个特性适合GPU运算,正好利用了GPU内存带宽较大并且并行性强的特点,其访存与计算的控制逻辑相对简单;而NHWC,每读取三个像素,都能获得一个彩色像素的值,即可对该彩色像素进行计算,这更适合多核CPU运算,CPU的内存带宽相对较小,每个像素计算的时延较低,临时空间也很小;若采取异步方式边读边算来减小访存时间,计算控制会比较复杂,这也比较适合CPU。

    **结论:**在训练模型时,使用GPU,适合NCHW格式;在CPU中做推理时,适合NHWC格式。采用什么格式排列,由计算硬件的特点决定。OpenCV在设计时是在CPU上运算的,所以默认HWC格式。TensorFlow的默认格式是NHWC,也支持cuDNN的NCHW

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    img = cv2.imread("data/images/bus.jpg")
    img = cv2.resize(img, (5,4)) #(x, y) -> (W, H)
    print(img.shape) # (H,W,C)
    plt.figure()
    plt.imshow(img)
    plt.show()
    line1 = img[1,...]
    line1 = np.expand_dims(line1, axis=0)
    print(line1.shape)
    print(line1)
    plt.figure()
    plt.imshow(line1)
    plt.show()
    print("BGR->RGB")
    rgb_line1 = cv2.cvtColor(line1, cv2.COLOR_BGR2RGB)
    print(rgb_line1.shape)
    print(rgb_line1)
    print()
    print("HWC->CHW")
    CHW_line1 = np.transpose(line1, (2,0,1))
    print(CHW_line1.shape)
    print(CHW_line1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    运行结果如下:

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    作者:LabVIEW_Python
    链接:https://www.jianshu.com/p/61de601bc90f
    来源:简书

  • 相关阅读:
    Java 基础之锁
    Golang实现Windows的TTS实现文本转语音
    MySQL 分库分表与 TiDB(平凯数据库),如何选择?
    如何正确的在C++中实现单例SingleTone模式
    程序员的护城河-并发编程
    React隐藏显示元素
    这部分查找用的是哈希表吗?
    【MySQL】MySQL的IFNULL()、ISNULL()、NULLIF()函数用法说明
    自媒体视频剪辑素材到哪里找?
    2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
  • 原文地址:https://blog.csdn.net/qq_39522016/article/details/132942296