一般圖像的存儲(chǔ)方式是H x W x C的順序(其中H、W、C分別表示圖像的高、寬和通道數(shù),通道數(shù)一般為RGB三通道),另外,其中的每一個(gè)數(shù)據(jù)都是[0,255]的整數(shù),opencv中圖片的格式也是hwc。但在pytorch中為CHW,img = img.transpose(2, 0, 1)。
代碼中首先使用datasets模塊讀取圖像數(shù)據(jù),輸出的圖像類型為PILImage,并且圖像中的每一個(gè)數(shù)據(jù)大小范圍已經(jīng)不再是[0,255],而是[0,1]。datasets模塊下有好幾個(gè)讀取圖像的類,比如CIFAR10、MNIST等能夠直接獲取標(biāo)準(zhǔn)數(shù)據(jù)庫(kù);而我們代碼中所使用的類是ImageFolder,它能夠讀取本地存放的圖像。其中需要指定圖像所在文件路徑和需要對(duì)數(shù)據(jù)進(jìn)行的變換。 從上面的data_transforms變量中我們能夠看出進(jìn)行了多種變換,而Compose就是將多種變換組合起來的方法。data_transforms中一共包含了四個(gè)變換,前兩個(gè)是對(duì)PILImage進(jìn)行的,分別對(duì)其進(jìn)行隨機(jī)大?。J(rèn)原始圖像大小的0.08-1.0)和隨機(jī)寬高比(默認(rèn)原始圖像寬高比的3/4-4/3)的裁剪,之后resize到指定大小224;以及對(duì)原始圖像進(jìn)行隨機(jī)(默認(rèn)0.5概率)的水平翻轉(zhuǎn)。 第三個(gè)transforms.ToTensor()的變換操作是關(guān)鍵一步,它將PILImage轉(zhuǎn)變?yōu)閠orch.FloatTensor的數(shù)據(jù)形式,這種數(shù)據(jù)形式一定是C x H x W的圖像格式加上[0,1]的大小范圍,它的作用有歸一化和將圖像轉(zhuǎn)化為tensor的作用。 后面的Normalize變換是對(duì)tensor這種數(shù)據(jù)格式進(jìn)行的,它的操作是用給定的均值和標(biāo)準(zhǔn)差分別對(duì)每個(gè)通道的數(shù)據(jù)進(jìn)行正則化,即減均值/方差。經(jīng)過上面一系列的轉(zhuǎn)換之后,我們可以得出的結(jié)論是,圖像的數(shù)據(jù)格式首先在維度的排序上發(fā)生了改變,其次數(shù)據(jù)的范圍也發(fā)生了改變。