干貨|10 大 PyTorch 最常用的轉(zhuǎn)換函數(shù)

極市導(dǎo)讀
當(dāng)我們要處理多種類型的數(shù)據(jù)時(shí),數(shù)據(jù)可能不是我們所需要的格式,PyTorch轉(zhuǎn)換就是救星。本文介紹了10個(gè)PyTorchPyTorch最常用的轉(zhuǎn)換函數(shù)。 >>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
Pytorch是一個(gè)深度學(xué)習(xí)框架,廣泛用于圖像分類、分割、目標(biāo)識(shí)別等各種任務(wù)。在這種情況下,我們必須處理各種類型的數(shù)據(jù)。很可能在大多數(shù)情況下,數(shù)據(jù)可能不是我們所需要的格式。PyTorch轉(zhuǎn)換就是救星。torchvision.transforms模塊提供了可以使用的各種圖像轉(zhuǎn)換。我們使用變換對(duì)數(shù)據(jù)進(jìn)行一些操作,使其適合于訓(xùn)練torchvision模塊,PyTorch為常見(jiàn)的圖像變換提供變換有關(guān)的函數(shù)。這些變換可以使用Compose鏈接在一起。讓我們?cè)诒疚闹锌纯雌渲械膸讉€(gè)!準(zhǔn)備好了嗎?
1. ToTensor
這是一個(gè)非常常用的轉(zhuǎn)換。在PyTorch中,我們主要處理張量形式的數(shù)據(jù)。如果輸入數(shù)據(jù)是NumPy數(shù)組或PIL圖像的形式,我們可以使用ToTensor將其轉(zhuǎn)換為張量格式。最后一個(gè)張量的形式是(C * H * W)。同時(shí),還執(zhí)行從0–255到0–1的范圍內(nèi)的縮放操作。讓我們用一個(gè)例子來(lái)更好地理解它。在這個(gè)博客中,我將使用Ragnar(我最喜歡的虛構(gòu)角色)的圖像來(lái)執(zhí)行轉(zhuǎn)換。

2. Normalize
此操作將獲取張量圖像,并使用平均值和標(biāo)準(zhǔn)差對(duì)其進(jìn)行歸一化。它有3個(gè)參數(shù):mean, std, inplace。我們需要為3個(gè)通道提供一系列平均值,作為參數(shù)“mean”,“std”類似。如果將“inplace”設(shè)為True,則將計(jì)算得到的值覆蓋之前的值。
torchvision.transforms.Normalize([meanOfChannel1, meanOfChannel2, meanOfChannel3], [stdOfChannel1, stdOfChannel2, stdOfChannel3])#Example:transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
3. CenterCrop
這將在中心裁剪給定的張量圖像。你可以以(高度、寬度)的形式向transforms.CenterCrop()提供要裁剪的大小作為輸入。讓我們?cè)趫D像上實(shí)現(xiàn)這個(gè)并進(jìn)行檢查。
transform = transforms.Compose([transforms.ToTensor(),transforms.CenterCrop((200,100))])tensor_img = transform(image)tensor_img.shapeOutput: torch.Size([3, 200, 100])
如果只提供一個(gè)尺寸標(biāo)注而不是兩個(gè)尺寸標(biāo)注,會(huì)發(fā)生什么情況?它將假設(shè)它是一個(gè)正方形,并且將生成一個(gè)(size, size))的裁剪。如果給定的尺寸比原來(lái)的尺寸大呢?沿著這些邊,圖像將填充0!
4. RandomHorizontalFlip
此變換將以給定的概率水平(隨機(jī))翻轉(zhuǎn)圖像。你可以通過(guò)參數(shù)“p”來(lái)設(shè)置這個(gè)概率。p的默認(rèn)值為0.5。檢查我下面的例子來(lái)理解。
transform = transforms.Compose([transforms.RandomHorizontalFlip(p=0.9)])tensor_img = transform(image)tensor_img
查看原始圖像和翻轉(zhuǎn)的圖像!


5. RandomRotation
此變換將圖像隨機(jī)旋轉(zhuǎn)一個(gè)角度。以度為單位的角度可以作為參數(shù)“degrees”的輸入。
transform = transforms.Compose([transforms.RandomRotation(degrees=180)])tensor_img = transform(image)tensor_img
查看上述代碼的轉(zhuǎn)換!

6. Grayscale
此轉(zhuǎn)換將把原始RGB圖像更改為灰度(即黑白)。你可以提供你想要多少個(gè)通道作為參數(shù)“num_output_channels”的輸入。
transform = transforms.Compose([transforms.Grayscale(num_output_channels=1)])tensor_img = transform(image)tensor_img
輸出如下所示。

7. GaussianBlur
在這里,圖像將被隨機(jī)選擇的高斯模糊所模糊。必須提供參數(shù)kernel_size。
transform = transforms.Compose([transforms.GaussianBlur(kernel_size=501)])tensor_img = transform(image)tensor_img

8. RandomApply
此轉(zhuǎn)換將隨機(jī)應(yīng)用給定的轉(zhuǎn)換列表。
transform = transforms.RandomApply([transforms.RandomSizedCrop(200),transforms.RandomHorizontalFlip()],p=0.6)tensor_img = transform(image)
9. Compose
在本文中,我們一直在使用Compose() 。為了清楚地定義它,它將幾個(gè)變換組合在一起。
transforms.Compose([transforms.Grayscale(1),transforms.CenterCrop(10), transforms.ToTensor()])
一些轉(zhuǎn)換將以所需格式處理數(shù)據(jù)。然而,對(duì)于圖像數(shù)據(jù)增強(qiáng),則需要灰度、隨機(jī)水平翻轉(zhuǎn)和隨機(jī)旋轉(zhuǎn)等變換。
10. 函數(shù)變換
在我們學(xué)習(xí)到的所有變換中,你可以注意到參數(shù)是隨機(jī)生成的。這通常足以進(jìn)行數(shù)據(jù)擴(kuò)充。但是,有時(shí)你可能需要對(duì)轉(zhuǎn)換管道進(jìn)行更細(xì)粒度的控制。在這種情況下,可以使用函數(shù)變換。在這里,你可以指定或生成所有參數(shù)。一個(gè)附加的優(yōu)點(diǎn)是,一個(gè)特定定義的函數(shù)變換可以應(yīng)用于多個(gè)圖像。可以從torchvision.transforms.functional訪問(wèn)所有函數(shù)轉(zhuǎn)換。現(xiàn)在讓我們深入了解PyTorch提供的不同功能轉(zhuǎn)換。
A) 調(diào)整亮度:adjust_brightness
這主要是調(diào)整圖像的亮度。它以PyTorch張量的形式將圖像作為輸入。它還有一個(gè)重要參數(shù)“亮度系數(shù)”。這將表示如何實(shí)際更改亮度。例如,如果值為1,則會(huì)得到與輸入相同的圖像。如果該值大于1,將獲得更亮的圖像。如果它小于1,你會(huì)得到一個(gè)更暗的圖像。可以相應(yīng)地傳遞浮點(diǎn)值。返回的圖像將是張量或PIL圖像。
new_img = transforms.functional.adjust_brightness(image,brightness_factor=2)new_img

B) 調(diào)整對(duì)比度:adjust_contrast
上面我們看到了如何調(diào)整亮度,這里我們有另一個(gè)用于調(diào)整圖像對(duì)比度的變換。它需要兩個(gè)輸入?yún)?shù):張量形式的圖像和“對(duì)比度因子”。第二個(gè)參數(shù)將輸入一個(gè)浮點(diǎn)值,它將告訴你如何調(diào)整對(duì)比度。但不能是負(fù)的。
new_img = transforms.functional.adjust_contrast(image,contrast_factor=3.8)new_img
C) 調(diào)整色調(diào):adjust_hue
色調(diào)是圖像的一個(gè)重要屬性。Pytorch允許你通過(guò)transforms.functional.adjust_hue進(jìn)行調(diào)整。想知道它是怎么工作的嗎?首先,圖像將被轉(zhuǎn)換成HSV(色調(diào),飽和度,值)形式。將根據(jù)我們的參數(shù)在H通道中進(jìn)行更改。更改后,圖像將轉(zhuǎn)換為其原始形式。重要的參數(shù)是“色調(diào)因子”。它可以是[-0.5.0.5]范圍內(nèi)的浮點(diǎn)值。嘗試實(shí)現(xiàn)下面的示例。
new_img = transforms.functional.adjust_hue(image,hue_factor=0.3)new_img

D) 調(diào)整飽和度:adjust_saturation
這是為了調(diào)整輸入圖像的顏色飽和度。與上述情況類似,我們有一個(gè)“飽和度系數(shù)”參數(shù),它決定了飽和度的變化方式。這將輸入一個(gè)浮點(diǎn)值。如果將其設(shè)置為0,則會(huì)得到黑白圖像。
new_img = transforms.functional.adjust_saturation(image,saturation_factor=6)
輸出如下圖所示!

E) 調(diào)整銳度:adjust_sharpness
你可以通過(guò)此變換調(diào)整圖像的清晰度。它采用浮點(diǎn)值作為“銳度系數(shù)”參數(shù)的輸入。此值可以是除負(fù)值以外的任何值。在下面的代碼中,我使用了10的銳度因子,這意味著變換后的圖像將是原始圖像的10倍銳度。
new_img = transforms.functional.adjust_sharpness(image,sharpness_factor=10)
檢查輸出!

F) 均衡:equalize
這種變換將均衡圖像的直方圖。怎么會(huì)這樣?它將對(duì)輸入應(yīng)用非線性映射,從而在輸出中創(chuàng)建灰度值的均勻分布。
new_img = transforms.functional.equalize(image)
這些是一些重要的函數(shù)轉(zhuǎn)換,將有助于在圖像預(yù)處理階段。它們也可以組合使用。
如果覺(jué)得有用,就請(qǐng)分享到朋友圈吧!
公眾號(hào)后臺(tái)回復(fù)“79”獲取CVPR 2021:TransT 直播鏈接~

# CV技術(shù)社群邀請(qǐng)函 #
備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測(cè)-深圳)
即可申請(qǐng)加入極市目標(biāo)檢測(cè)/圖像分割/工業(yè)檢測(cè)/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競(jìng)賽、干貨資訊匯總、與 10000+來(lái)自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺(jué)開(kāi)發(fā)者互動(dòng)交流~

