首頁 > 軟體

深入淺出Python中三個影象增強庫的使用

2022-05-26 14:01:48

介紹

本文中探索三個流行的 Python 影象增強庫。

影象分類器通常在訓練更多的影象時表現得更好。在影象分類模型中,一個常見的問題是,模型不能正確地對影象進行分類,只是因為它沒有針對同一影象的不同方向進行訓練。這可以通過向模型提供多種可能的影象方向和轉換來克服。

然而,在現實中,收集這些不同的資料可能需要更多的時間、資源和專業知識,而且對公司來說成本可能很高。在這種情況下,影象資料增強是一個流行的選擇,通過使用一個或多個增強技術來生成用於訓練的各種影象,從而為現有資料集增加多樣性。

儘管一些Python庫支援多種增強技術,但並不是所有的技術都適合訓練模型。使用者需要知道哪些增強技術可以幫助生成用於訓練模型的實際附加資料。

我們可以使用各種技術來增強影象資料。它可以包括:

  • 使用幾何變換(例如翻轉、裁剪、旋轉、縮放等)增強影象資料。
  • 通過使用顏色轉換來增強影象資料,例如通過調整亮度、暗度、銳度、飽和度等。
  • 通過隨機擦除、混合影象等來增強影象資料。

Imgaug

Imgaug 是一個開源 python 包,可讓你在機器學習實驗中增強影象。它適用於各種增強技術。它有一個簡單而強大的介面,可以增強影象、地標、邊界框、熱圖和分割圖。

讓我們首先使用 pip 安裝這個庫。

pip install imgaug

接下來,我們將使用 pip 命令在命令提示字元下安裝名為“IPyPlot”的 python 包:

pip install ipyplot

IPyPlot 是一個 Python 工具,允許在 Python Notebook 單元格中快速高效地顯示影象。這個包將 IPython 與 HTML 相結合,以提供一種更快、更豐富、更具互動性的方式來顯示影象。這個包的 'plot_images' 命令將用於以網格狀結構繪製所有影象。

此外,我們將匯入擴充資料所需的所有必要包。

import imageio
import imgaug as ia
import imgaug.augmenters as iaa

增強的影象路徑在此處定義。我們將使用鳥類影象作為範例。

input_img = imageio.imread('../input/image-bird/bird.jpg')

影象翻轉

我們可以使用下面的命令水平和垂直翻轉影象。以下程式碼中的“Fliplr”關鍵字水平翻轉影象。同樣,關鍵字“Flipud”垂直翻轉影象。

#Horizontal Flip
hflip= iaa.Fliplr(p=1.0)
input_hf= hflip.augment_image(input_img)
#Vertical Flip
vflip= iaa.Flipud(p=1.0) 
input_vf= vflip.augment_image(input_img)
images_list=[input_img, input_hf, input_vf]
labels = ['Original', 'Horizontally flipped', 'Vertically flipped']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

每個影象被翻轉的概率由 p 表示。預設情況下,概率設定為 0.0。要水平翻轉輸入影象,請使用 Fliplr(1.0) 。同樣,當垂直翻轉影象時,使用 Flipud(1.0) 。

影象旋轉

通過以度為單位定義旋轉,我們可以旋轉影象。

rot1 = iaa.Affine(rotate=(-50,20))
input_rot1 = rot1.augment_image(input_img)
images_list=[input_img, input_rot1]
labels = ['Original', 'Rotated Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

影象裁剪

裁剪影象包括從影象的側面移除畫素的列或行,可以從全尺寸輸入影象中提取較小尺寸的子影象。要刪除的畫素數可以以絕對數或影象大小的一部分指定。

在這種情況下,我們使用從連續間隔 [0.0, 0.3] 中均勻獲取的隨機分數裁剪影象的每一側,並在每個影象和每側取樣一次。在這裡,我們為頂部取 0.3 的取樣分數,這會將影象裁剪 0.3*H,其中 H 是輸入影象的高度。

crop1 = iaa.Crop(percent=(0, 0.3)) 
input_crop1 = crop1.augment_image(input_img)
images_list=[input_img, input_crop1]
labels = ['Original', 'Cropped Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

為影象新增噪點

該增強器將高斯噪聲新增到輸入影象。尺度值是產生噪聲的正態分佈的標準偏差。

noise=iaa.AdditiveGaussianNoise(10,40)
input_noise=noise.augment_image(input_img)
images_list=[input_img, input_noise]
labels = ['Original', 'Gaussian Noise Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

影象剪下

該增強器以 -40 到 40 度範圍內的隨機量剪下影象。

shear = iaa.Affine(shear=(-40,40))
input_shear=shear.augment_image(input_img)
images_list=[input_img, input_shear]
labels = ['Original', 'Image Shearing']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

影象對比度

該增強器通過縮放畫素值來調整影象對比度。

contrast=iaa.GammaContrast((0.5, 2.0))
contrast_sig = iaa.SigmoidContrast(gain=(5, 10), cutoff=(0.4, 0.6))
contrast_lin = iaa.LinearContrast((0.6, 0.4))
input_contrast = contrast.augment_image(input_img)
sigmoid_contrast = contrast_sig.augment_image(input_img)
linear_contrast = contrast_lin.augment_image(input_img)
images_list=[input_img, input_contrast,sigmoid_contrast,linear_contrast]
labels = ['Original', 'Gamma Contrast','SigmoidContrast','LinearContrast']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

GammaContrast 函數使用公式 255*((v/255)**gamma 調整影象對比度,其中 v 是畫素值,gamma 從範圍 [0.5, 2.0] 中均勻取樣。

SigmoidContrast 使用公式 255*1/(1+exp(gain*(cutoff-v/255)) 調整影象對比度 (其中v為畫素值,gain 從區間[3, 10]開始均勻取樣(每張影象一次),截斷取樣與區間 [0.4, 0.6] 一致。

LinearContrast 使用公式 127 + alpha*(v-127) 改變影象對比度,其中 v 是畫素值,alpha 從 [0.4, 0.6] 範圍內均勻取樣。

影象轉換

“ElasticTransformation”增強器通過使用位移場在區域性移動畫素來變換影象。增強器的引數是 alpha 和 sigma。位移的強度由 alpha 控制,其中較大的值表示畫素移動得更遠。位移的平滑度由 sigma 控制,其中較大的值會導致更平滑的圖案。

elastic = iaa.ElasticTransformation(alpha=60.0, sigma=4.0)
polar = iaa.WithPolarWarping(iaa.CropAndPad(percent=(-0.2, 0.7)))
jigsaw = iaa.Jigsaw(nb_rows=20, nb_cols=15, max_steps=(3, 7))
input_elastic = elastic.augment_image(input_img)
input_polar = polar.augment_image(input_img)
input_jigsaw = jigsaw.augment_image(input_img)
images_list=[input_img, input_elastic,input_polar,input_jigsaw]
labels = ['Original', 'elastic','polar','jigsaw']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

在使用“Polar Warping”增強器時,首先在極座標表示中應用裁剪和填充,然後再將其扭轉回笛卡爾表示。這個增強器可以為影象新增額外的畫素。這些將被黑色畫素填充。此外,“Jigsaw”增強以類似於拼圖模式的方式移動圖片內的單元格。

影象上的邊界框

Imgaug 還為影象提供邊界框支援。如果在增強期間旋轉,該庫可以旋轉影象上的所有邊界框。

from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
bbs = BoundingBoxesOnImage([
 BoundingBox(x1=40, x2=550, y1=40, y2=780)
], shape=input_img.shape)
ia.imshow(bbs.draw_on_image(input_img))

Albumentations

Albumentations 是一個快速且知名的庫,它與流行的深度學習框架(如 PyTorch 和 TensorFlow)整合。它也是 PyTorch 生態系統的一部分。

Albumentations 可以執行所有典型的計算機視覺任務,包括分類、語意分割、範例分割、物件識別和姿勢估計。該庫包含 70 多種不同的增強功能,用於從現有資料建立新的訓練樣本。它通常用於工業、深度學習研究、機器學習競賽和開源專案。

讓我們首先使用 pip 命令安裝庫。

pip install Albumentations

我們將匯入使用 Albumentations 擴充資料所需的所有必要包:

import albumentations as A
import cv2

除了 Albumentations 包之外,我們還使用 OpenCV 包,這是一個支援多種影象格式的開源計算機視覺庫。Albumentations 依賴於 OpenCV;因此,你已經安裝了它。

影象翻轉

'A.HorizontalFlip' 和 'A.VerticalFlip' 函數用於水平和垂直翻轉影象。p 是一個獨特的引數,幾乎所有的擴充都支援。它控制使用增強的概率。

#HorizontalFlip
transform = A.HorizontalFlip(p=0.5)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)
 
#VerticalFlip
transform = A.VerticalFlip(p=1)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

影象縮放和旋轉

該增強器隨機使用仿射變換來平移、縮放和旋轉輸入影象。

transform = A.ShiftScaleRotate(p=0.5)
random.seed(7) 
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

影象 ChannelShuffle

該增強器隨機重新排列輸入影象的 RGB 通道。

from albumentations.augmentations.transforms import ChannelShuffle
transform = ChannelShuffle(p=1.0)
random.seed(7) 
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

影象曝光

該增強器反轉輸入影象中大於某個閾值的所有畫素值。

from albumentations.augmentations.transforms import Solarize
transform = Solarize(threshold=200,  p=1.0)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

反轉影象

通過從 255 中減去畫素值,此增強器反轉輸入影象。

from albumentations.augmentations.transforms import InvertImg
transform = InvertImg(p=1.0)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

使用 Compose 增強管道

要定義一個擴充套件管道,首先,建立一個 Compose 範例。你必須提供擴充列表作為 Compose 類的引數。在此範例中,我們將使用各種增強功能,例如轉置、模糊、失真等。

呼叫 Compose 將導致返回一個將進行影象增強的轉換函數。

transform = A.Compose([
    A.RandomRotate90(),
    A.Transpose(),
    A.ShiftScaleRotate(shift_limit=0.08, scale_limit=0.5, rotate_limit=5, p=.8),
    A.Blur(blur_limit=7),
    A.GridDistortion(),
])
random.seed(2) 
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

SOLT

SOLT 是一個深度學習資料增強庫,支援影象、分割掩碼、標籤和關鍵點。SOLT 也很快,並且在其後端有 OpenCV。

我們將從使用 pip 命令安裝 SOLT 開始

pip install solt

然後我們將匯入增強影象資料所需的所有必要的 SOLT 包。

import solt
import solt.transforms as slt
h, w, c = input_img.shape
img = input_img[:w]

在這裡,我們將為擴充管道建立一個 Stream 範例。你必須提供擴充列表作為流類的引數。

stream = solt.Stream([
    slt.Rotate(angle_range=(-90, 90), p=1, padding='r'),
    slt.Flip(axis=1, p=0.5),
    slt.Flip(axis=0, p=0.5),
    slt.Shear(range_x=0.3, range_y=0.8, p=0.5, padding='r'),
    slt.Scale(range_x=(0.8, 1.3), padding='r', range_y=(0.8, 1.3), same=False, p=0.5),
    slt.Pad((w, h), 'r'),
    slt.Crop((w, w), 'r'),
    slt.Blur(k_size=7, blur_type='m'),
    solt.SelectiveStream([
        slt.CutOut(40, p=1),
        slt.CutOut(50, p=1),
        slt.CutOut(10, p=1),
        solt.Stream(),
        solt.Stream(),
    ], n=3),
], ignore_fast_mode=True)
fig = plt.figure(figsize=(17,17))
n_augs = 10
random.seed(2)
for i in range(n_augs):
    img_aug = stream({'image': img}, return_torch=False, ).data[0].squeeze()
    ax = fig.add_subplot(1,n_augs,i+1)
    if i == 0:
        ax.imshow(img)
    else:
        ax.imshow(img_aug)
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

結論

影象增強可以幫助增加現有資料集。目前有幾個 Python 庫可用於影象增強。在本文中,我們使用三個 Python 庫——ImgaugAlbalentationsSolt探索了不同的影象增強技術。

到此這篇關於深入淺出Python中三個影象增強庫的使用的文章就介紹到這了,更多相關Python影象增強庫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com