溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Imgaug導入和增強圖像的方法是什么

發(fā)布時間:2021-12-27 14:38:37 來源:億速云 閱讀:205 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Imgaug導入和增強圖像的方法是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

在機器視覺領(lǐng)域,想將深度學習應用于實際工程項目,并最終落地,會遇到很多問題:光照、遮擋等。而采集到的數(shù)據(jù)通常難以滿足各種現(xiàn)實環(huán)境,需要進行數(shù)據(jù)增強操作。 imgaug是一個基于OpenCV的更高級的API,包含很多集成好的圖像增強的方法。

安裝方式:

conda config --add channels conda-forge

conda install imgaug

導入和增強圖像

輸入的圖像需要符合以下兩種規(guī)格之一:

  1. 可以是4D的numpy數(shù)組,形狀需要滿足“NHWC”原則,即(N, height, width, channels)

  2. 也可以是一個由3D numpy數(shù)組組成的列表list,3D numpy數(shù)組的形狀需要滿足(height, width, channels) 對于灰度圖像,其形狀必須滿足(height, width, 1)

并且所有的圖像必須是numpy數(shù)組的uint8格式,數(shù)值需要是在0-255之間。

uint8是所有API測試最徹底的數(shù)據(jù)類型,其余的格式例如float32,需要查看imgaug API的文檔是否支持。

圖像導入函數(shù)

imgaug只是進行圖像增強的庫函數(shù),其中并沒有相關(guān)圖像的讀取和輸出的函數(shù)。因此,需要使用其他的庫進行圖像的導入:

imageio

cv2.imread()

另外,值得注意的是,cv2.imread()函數(shù)返回的圖像顏色空間是BGR,而不是RGB,因此,需要手動改變其通道組成: cv2.imread(path)[:, :, ::-1]

因此,提倡使用imageio進行圖像的導入。

導入并增強一張圖片

imagio.imread("/path/to/the/file.jpg")

windows: imagio.imread("C:\path\to\the\file.jpg") 返回的是一個uint8格式的numpy數(shù)組,形狀為HWC--RGB空間。

import imageio
import imgaug as ia
%matplotlib inline    
 
image = imageio.imread("./pick1.jpg")   # Image格式
 
print("Original")
ia.imshow(image)

Augmented:

Imgaug導入和增強圖像的方法是什么                                                                                   

imgaug沒有讀圖像的語句,但是有顯示圖像的語句。

# 增強
from imgaug import augmenters as iaa

ia.seed(4)
 
rotate = iaa.Affine(rotate=(-25, 25))  # 旋轉(zhuǎn)
image_aug = rotate(image=image)   # 處理后是numpy數(shù)組格式

print("Augmented:")
ia.imshow(image_aug)

Augmented:

png

可以看出,圖像發(fā)生了[-25, 25]之間角度的旋轉(zhuǎn)。

在使用imgaug中包含的數(shù)據(jù)增強功能時,需要先通過傳參生成某種數(shù)據(jù)增強的實例,再通過實例對圖像進行處理。

嘗試一下ia.seed(4),觀察是否可以讓旋轉(zhuǎn)的角度相同。

ia.seed(4)
image_aug = rotate(image=image)

print("Re-Augmented:")
ia.imshow(image_aug)
Re-Augmented:

Imgaug導入和增強圖像的方法是什么

仿佛每次的結(jié)果都是一樣的。

  • 再試試更改一下數(shù)值。

ia.seed(5)
image_aug = rotate(image=image)

print("Augmented:")
ia.imshow(image_aug)
Augmented:

結(jié)果發(fā)生了隨機性的變化。

增強一個batch數(shù)量的圖像

實際使用中,我們通常需要處理更多份的圖像數(shù)據(jù),而不是一張。此時,可以將圖形數(shù)據(jù)按照NHWC的形式或者由列表組成的HWC的形式對批量的圖像進行處理。

如下述代碼,將一份圖像存儲多次形成一個batch數(shù)量的圖像。經(jīng)過處理后,使用np.hstack()對處理后的圖像進行顯示。

import numpy as np

images = [image, image, image, image, image]
images_aug = rotate(images=images)

print("Augmented batch:")
ia.imshow(np.hstack(images_aug))
Augmented batch:

Imgaug導入和增強圖像的方法是什么

同時使用多種增強技術(shù)

之前使用的方法僅僅在一張圖像或者多張圖像上使用了一種Affine的增強技術(shù),在實際深度學習模型訓練中,往往需要同時使用多種圖像增強技術(shù),從而讓模型適應變化的外界條件。

在使用多種圖像增強技術(shù)時,可以使用imgaug中類似keras和Pytorch中Sequential方法,將多種增強技術(shù)拼接在一起。如下所示:

seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)), 
                      iaa.AdditiveGaussianNoise(scale=(10, 60)),
                      iaa.Crop(percent=(0, 0.2))
                      ])
 
images_aug = seq(images=images)
 
print("Augmented:")
ia.imshow(np.hstack(images_aug))
Augmented:

png

Crop()默認會保持輸入圖像的尺寸,如果將keep_size=False,輸入輸出的尺寸將可能會發(fā)生變化。即該參數(shù)表示是否保持圖像尺寸一致。

下述代碼在Sequential中設(shè)置了random_order=True,并使用單張圖片重復8次得到的結(jié)果。該參數(shù)表示是否啟用隨機順序增強。

seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)),
                      iaa.AdditiveGaussianNoise(scale=(30, 90)),
                      iaa.Crop(percent=(0, 0.4))], random_order=True)
 
images_aug = [seq(image=image) for _ in range(8)]

print("Augmented:")
ia.imshow(ia.draw_grid(images_aug, cols=4, rows=2))
Augmented:

Imgaug導入和增強圖像的方法是什么

增強圖像(不同尺寸)

在收集訓練集時,訓練集的尺寸往往難以做到統(tǒng)一尺寸。之前的示例中也總是使用的相同尺寸的圖像。下述代碼介紹了不同尺寸圖像的處理和展示。

對于不同尺寸的圖像,肯定不能使用numpy數(shù)組組成NHWC的形式,只能將不同尺寸的圖像存儲于列表中。

 seq = iaa.Sequential([
      iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge"),  # crop and pad images
      iaa.AddToHueAndSaturation((-60, 60)),  # change their color
      iaa.ElasticTransformation(alpha=90, sigma=9),  # water-like effect
      iaa.Cutout()  # replace one squared area within the image by a constant intensity value
  ], random_order=True)
  
 # load images with different sizes
 images_different_sizes = [
     imageio.imread("./pick1.jpg"),
     imageio.imread("./flower.jpg"),
     imageio.imread("./samoye.jpg")
 ]
 
# augment them as one batch
images_aug = seq(images=images_different_sizes)
 
# visualize the results
print("Image 0 (input shape: %s, output shape: %s)" % (images_different_sizes[0].shape, images_aug[0].shape))
ia.imshow(np.hstack([images_different_sizes[0], images_aug[0]]))
 
print("Image 1 (input shape: %s, output shape: %s)" % (images_different_sizes[1].shape, images_aug[1].shape))
ia.imshow(np.hstack([images_different_sizes[1], images_aug[1]]))
 
print("Image 2 (input shape: %s, output shape: %s)" % (images_different_sizes[2].shape, images_aug[2].shape))
ia.imshow(np.hstack([images_different_sizes[2], images_aug[2]]))
Image 0 (input shape: (313, 500, 3), output shape: (313, 500, 3))

Imgaug導入和增強圖像的方法是什么

Image 1 (input shape: (621, 500, 3), output shape: (621, 500, 3))

Imgaug導入和增強圖像的方法是什么

Image 2 (input shape: (406, 500, 3), output shape: (406, 500, 3))

Imgaug導入和增強圖像的方法是什么

整理總結(jié)

本節(jié)教程主要包含以下幾個方面的內(nèi)容:

  1. 在利用imgaug圖像增強的方法中,如何讀取和顯示圖像; imageio.imread() imgaug.imshow() 不推薦使用opencv,因為其讀入圖像默認為BGR模式;

  2. 單/多張圖像如何利用一/多種圖像增強方法;

  3. 如何將不同尺寸的圖像組合在一起進行圖像增強。

本節(jié)教程中包含的圖像增強的方法:

  1. iaa.Affine(rotate=(-25, 25))

    • 實現(xiàn)仿射變換,本節(jié)僅利用了其中的旋轉(zhuǎn)操作;

  2. iaa.AdditiveGaussianNoise(scale=(10, 60))

    • 添加高斯白噪聲

  3. iaa.Crop(percent=(0, 0.2))

    • 實現(xiàn)裁剪,參數(shù)為裁剪比例

  4. iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge")

    • 實現(xiàn)裁剪和邊緣補充

  5. iaa.AddToHueAndSaturation((-60, 60))

    • Hue空間調(diào)整飽和度

  6. iaa.ElasticTransformation(alpha=90, sigma=9)

    • 隨機彈性變換(仿射變換的一種)

  7. iaa.Cutout()

    • 圖像增強之 cutout 生成遮擋塊


* CropAndPad使用效果:*

import imageio
import imgaug as ia
from imgaug import augmenters as iaa
import numpy as np
%matplotlib inline    

image = imageio.imread("./pick1.jpg")
 
crop = iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge")
img_aug = crop(image=image)
 
print("Original")
ia.imshow(np.hstack([image, img_aug]))
#ia.imshow(image) 
#ia.imshow(img_aug)
Original

Imgaug導入和增強圖像的方法是什么


* AddToHueAndSaturation使用效果 *

import imageio
import imgaug as ia
from imgaug import augmenters as iaa
%matplotlib inline    
 
image = imageio.imread("./pick1.jpg")

hue = iaa.AddToHueAndSaturation((-60, 60))
img_aug = hue(image=image)
 
print("Original")
ia.imshow(np.hstack([image, img_aug]))
#ia.imshow(image) 
#ia.imshow(img_aug)
Original

png


* ElasticTransformation使用效果 *

import imageio
import imgaug as ia
from imgaug import augmenters as iaa
%matplotlib inline    
 
image = imageio.imread("./pick1.jpg")

trans = iaa.ElasticTransformation(alpha=90, sigma=9)
img_aug = trans(image=image)

print("Original")
ia.imshow(np.hstack([image, img_aug]))
#ia.imshow(image) 
#ia.imshow(img_aug)
Original

Imgaug導入和增強圖像的方法是什么

“Imgaug導入和增強圖像的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI