人工智能小白,不對之處,希望各位大佬不吝賜教^_^
目錄
前言
正文
1.關于HWC維度的理解
2.為什么pytorch中transforms.ToTorch要把(H,W,C)的矩陣轉為(C,H,W)? [2]
3.如何進行格式的轉換?
3.1 opencv python 把圖(cv2下)BGR轉RGB,且HWC轉CHW【3】.
3.2 Torch將HWC格式轉為CHW
附錄
推薦文章
前言
最近在做一個影像分類的任務,其中涉及到對于資料集的處理,利用到了均值和標準差,但是其中的均值和標準差是一個陣列,如下所示,
# 各通道的均值 CIFAR100_TRAIN_MEAN = (0.5070751592371323, 0.48654887331495095, 0.4409178433670343) # 各通道的標準差 CIFAR100_TRAIN_STD = (0.2673342858792401, 0.2564384629170883, 0.27615047132568404)查閱資料發現,其中每個數值代表一個通道的均值和標準差,因此我猜測是RGB通道對應的數值,后來,通過研讀整個專案代碼,發現了一個令我困擾的地方,
# 資料增強 transform_train = transforms.Compose([ # transforms.ToPILImage(), # Crop the given PIL Image at a random location. # 32*32,padding=4,影像上下左右像素均填充一個像素 transforms.RandomCrop(32, padding=4), # 隨機水平翻轉,默認值是0.5 transforms.RandomHorizontalFlip(), # (-degrees,+degrees) transforms.RandomRotation(15), # 資料的格式轉換和標準化 HWC => CHW, # 把圖片轉換為張量,同時進行歸一化操作,把每個通道 0~255 的值歸一化為0~1 transforms.ToTensor(), transforms.Normalize(mean, std) # 影像張量的歸一化 ])由于我之前對于張量tensor以及torch不太熟悉,查閱資料補充了對上述代碼的理解,
正文
下面將依次介紹HWC格式的理解以及torch影像格式的轉換,我認為這是一個循序漸進的程序,
1.關于HWC維度的理解
我們首先需要明確的是各個引數的含義,HWC可以看作是一幅影像的shape[1],H表示影像的高度(height),W表示影像的寬度(Width),而C表示一幅影像的通道數(Channel),
舉個小栗子
hwc=[5,5,3] 的含義是什么呢?
大家可以思考一下,以影像為例,那么高寬都是5,3就是其中的通道數,因此我們也可以理解為3個 5*5 大小的特征圖,
2.為什么pytorch中transforms.ToTorch要把(H,W,C)的矩陣轉為(C,H,W)? [2]
此問題的回答來源于知乎[2].
- 因為pytorch很多函式都是設計成假設你的輸入是 (c,h,w)的格式,當然你如果不嫌麻煩的話可以每次要用這些函式的時候轉成chw格式,但我想這會比你輸入的時候就轉成chw要麻煩很多,
- 至于為什么pytorch選擇設計成chw而不是hwc(畢竟傳統的讀圖片的函式opencv的cv2.imread或者sklearn的imread都是讀成hwc的格式的)這點確實比較令初學者困惑,個人感覺是因為pytorch做矩陣加減乘除以及卷積等運算是需要呼叫cuda和cudnn的函式的,而這些介面都設成成chw格式了,故而pytorch為了方便起見也設計成chw格式了,
- 那新問題就來了,cuda和cudnn為什么設計成chw格式呢?我想這是由于涉及到圖片操作的都是和卷積相關的,而內部做卷積運算的加速設計成chw在操作上會比hwc處理起來更容易,更快,題主如果想進一步了解可以google一下cudnn的卷積實作,
3.如何進行格式的轉換?
3.1 opencv python 把圖(cv2下)BGR轉RGB,且HWC轉CHW【3】.
img = cv2.imread("test.jpg") img_ = img[:,:,::-1].transpose((2,0,1))
- 在opencv里,圖格式HWC,其余都是CHW,故使用方法transpose((2,0,1)),transpose(2,0,1)就是讀入第三維的數C作為第一維的值,讀入第一維的數H作為第二維,讀入第二維的數作為第三維W,如果再高維,就再按照輸入的讀取順序來讀【4】,
- img[:,:,::-1]對應H、W、C,彩圖是3通道,即C是3層,opencv里對應BGR,故通過C通道的 ::-1 就是把BGR轉為RGB,其中[::-1] 代表順序相反操作,
3.2 Torch將HWC格式轉為CHW
from PIL import Image from torchvision.transforms import ToTensor img = Image.open('image_path') #產生的PIL_image格式資料的取值范圍是[0,255] #形狀(shape)是[h, w, c] #像素順序是RGB tensor = ToTensor()(PIL_img) # 或者 np_data = np.asarray(PIL_img) tensor = ToTensor()(np_data)ToTensor()接收PIL格式的資料,或者是直接從PIL轉來的np.ndarray格式資料,只要保證進來的資料取值范圍是[0, 255], 形狀是[h, w, c],像素順序是RGB,它就會幫你做下面的事情[5]
- 取值范圍[0, 255] / 255.0 => [0, 1.0], 資料格式從int8變成了float32
- 形狀(shape)轉為[c, h, w]
- 像素順序依舊是RGB
附錄
- Pytorch資料前后處理整理
- 為什么pytorch中transforms.ToTorch要把(H,W,C)的矩陣轉為(C,H,W)?
- opencv python 把圖(cv2下)BGR轉RGB,且HWC轉CHW
- Python numpy.transpose 詳解
PIL skimage opencv torch各種影像格式的轉換
推薦文章
- 700套個人簡歷模板(考研保研作業)
- 人工智能2019年秋季學期期末復習知識點整理
- Fisher線性分類器的設計與實作,感知器演算法的設計實作
以上就是我理解的內容啦,歡迎大家關注【小果果學長】微信公眾號,獲取更多資料和原始碼,希望大家點贊收藏加關注,如有不對的地方,非常開心和您交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291586.html
標籤:其他
