使用 3 個(gè)Python庫的圖像增強(qiáng)
介紹
本文中探索三個(gè)流行的 Python 圖像增強(qiáng)庫。
圖像分類器通常在訓(xùn)練更多的圖像時(shí)表現(xiàn)得更好。在圖像分類模型中,一個(gè)常見的問題是,模型不能正確地對圖像進(jìn)行分類,只是因?yàn)樗鼪]有針對同一圖像的不同方向進(jìn)行訓(xùn)練。這可以通過向模型提供多種可能的圖像方向和轉(zhuǎn)換來克服。
然而,在現(xiàn)實(shí)中,收集這些不同的數(shù)據(jù)可能需要更多的時(shí)間、資源和專業(yè)知識,而且對公司來說成本可能很高。在這種情況下,圖像數(shù)據(jù)增強(qiáng)是一個(gè)流行的選擇,通過使用一個(gè)或多個(gè)增強(qiáng)技術(shù)來生成用于訓(xùn)練的各種圖像,從而為現(xiàn)有數(shù)據(jù)集增加多樣性。
盡管一些Python庫支持多種增強(qiáng)技術(shù),但并不是所有的技術(shù)都適合訓(xùn)練模型。用戶需要知道哪些增強(qiáng)技術(shù)可以幫助生成用于訓(xùn)練模型的實(shí)際附加數(shù)據(jù)。
我們可以使用各種技術(shù)來增強(qiáng)圖像數(shù)據(jù)。它可以包括:
· 使用幾何變換(例如翻轉(zhuǎn)、裁剪、旋轉(zhuǎn)、縮放等)增強(qiáng)圖像數(shù)據(jù)。
· 通過使用顏色轉(zhuǎn)換來增強(qiáng)圖像數(shù)據(jù),例如通過調(diào)整亮度、暗度、銳度、飽和度等。
· 通過隨機(jī)擦除、混合圖像等來增強(qiáng)圖像數(shù)據(jù)。
Imgaug
Imgaug 是一個(gè)開源 python 包,可讓你在機(jī)器學(xué)習(xí)實(shí)驗(yàn)中增強(qiáng)圖像。它適用于各種增強(qiáng)技術(shù)。它有一個(gè)簡單而強(qiáng)大的界面,可以增強(qiáng)圖像、地標(biāo)、邊界框、熱圖和分割圖。
讓我們首先使用 pip 安裝這個(gè)庫。
pip install imgaug
接下來,我們將使用 pip 命令在命令提示符下安裝名為“IPyPlot”的 python 包:
pip install ipyplot
IPyPlot 是一個(gè) Python 工具,允許在 Python Notebook 單元格中快速高效地顯示圖像。這個(gè)包將 IPython 與 HTML 相結(jié)合,以提供一種更快、更豐富、更具交互性的方式來顯示圖像。這個(gè)包的 'plot_images' 命令將用于以網(wǎng)格狀結(jié)構(gòu)繪制所有圖像。
此外,我們將導(dǎo)入擴(kuò)充數(shù)據(jù)所需的所有必要包。
import imageio
import imgaug as ia
import imgaug.a(chǎn)ugmenters as iaa
增強(qiáng)的圖像路徑在此處定義。我們將使用鳥類圖像作為示例。
input_img = imageio.imread('../input/image-bird/bird.jpg')
圖像翻轉(zhuǎn)
我們可以使用下面的命令水平和垂直翻轉(zhuǎn)圖像。以下代碼中的“Fliplr”關(guān)鍵字水平翻轉(zhuǎn)圖像。同樣,關(guān)鍵字“Flipud”垂直翻轉(zhuǎn)圖像。
#Horizontal Flip
hflip= iaa.Fliplr(p=1.0)
input_h(yuǎn)f= hflip.a(chǎn)ugment_image(input_img)
#Vertical Flip
vflip= iaa.Flipud(p=1.0)
input_vf= vflip.a(chǎn)ugment_image(input_img)
images_list=[input_img, input_h(yuǎn)f, input_vf]
labels = ['Original', 'Horizontally flipped', 'Vertically flipped']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
每個(gè)圖像被翻轉(zhuǎn)的概率由 p 表示。默認(rèn)情況下,概率設(shè)置為 0.0。要水平翻轉(zhuǎn)輸入圖像,請使用 Fliplr(1.0) 。同樣,當(dāng)垂直翻轉(zhuǎn)圖像時(shí),使用 Flipud(1.0) 。
圖像旋轉(zhuǎn)
通過以度為單位定義旋轉(zhuǎn),我們可以旋轉(zhuǎn)圖像。
rot1 = iaa.Affine(rotate=(-50,20))
input_rot1 = rot1.a(chǎn)ugment_image(input_img)
images_list=[input_img, input_rot1]
labels = ['Original', 'Rotated Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
圖像裁剪
裁剪圖像包括從圖像的側(cè)面移除像素的列或行,可以從全尺寸輸入圖像中提取較小尺寸的子圖像。要?jiǎng)h除的像素?cái)?shù)可以以絕對數(shù)或圖像大小的一部分指定。
在這種情況下,我們使用從連續(xù)間隔 [0.0, 0.3] 中均勻獲取的隨機(jī)分?jǐn)?shù)裁剪圖像的每一側(cè),并在每個(gè)圖像和每側(cè)采樣一次。在這里,我們?yōu)轫敳咳?0.3 的采樣分?jǐn)?shù),這會(huì)將圖像裁剪 0.3*H,其中 H 是輸入圖像的高度。
crop1 = iaa.Crop(percent=(0, 0.3))
input_crop1 = crop1.a(chǎn)ugment_image(input_img)
images_list=[input_img, input_crop1]
labels = ['Original', 'Cropped Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
為圖像添加噪點(diǎn)
該增強(qiáng)器將高斯噪聲添加到輸入圖像。尺度值是產(chǎn)生噪聲的正態(tài)分布的標(biāo)準(zhǔn)偏差。
noise=iaa.AdditiveGaussianNoise(10,40)
input_noise=noise.a(chǎn)ugment_image(input_img)
images_list=[input_img, input_noise]
labels = ['Original', 'Gaussian Noise Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
圖像剪切
該增強(qiáng)器以 -40 到 40 度范圍內(nèi)的隨機(jī)量剪切圖像。
shear = iaa.Affine(shear=(-40,40))
input_shear=shear.a(chǎn)ugment_image(input_img)
images_list=[input_img, input_shear]
labels = ['Original', 'Image Shearing']
ipyplot.plot_images(images_list,labels=labels,img_width=180)
圖像對比度
該增強(qiáng)器通過縮放像素值來調(diào)整圖像對比度。
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.a(chǎn)ugment_image(input_img)
sigmoid_contrast = contrast_sig.a(chǎn)ugment_image(input_img)
linear_contrast = contrast_lin.a(chǎn)ugment_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 函數(shù)使用公式 255*((v/255)**gamma 調(diào)整圖像對比度,其中 v 是像素值,gamma 從范圍 [0.5, 2.0] 中均勻采樣。
SigmoidContrast 使用公式 255*1/(1+exp(gain*(cutoff-v/255)) 調(diào)整圖像對比度 (其中v為像素值,gain 從區(qū)間[3, 10]開始均勻采樣(每張圖像一次),截?cái)嗖蓸优c區(qū)間 [0.4, 0.6] 一致。
LinearContrast 使用公式 127 + alpha*(v-127) 改變圖像對比度,其中 v 是像素值,alpha 從 [0.4, 0.6] 范圍內(nèi)均勻采樣。
圖像轉(zhuǎn)換
“ElasticTransformation”增強(qiáng)器通過使用位移場在局部移動(dòng)像素來變換圖像。增強(qiáng)器的參數(shù)是 alpha 和 sigma。位移的強(qiáng)度由 alpha 控制,其中較大的值表示像素移動(dòng)得更遠(yuǎn)。位移的平滑度由 sigma 控制,其中較大的值會(huì)導(dǎo)致更平滑的圖案。
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.a(chǎn)ugment_image(input_img)
input_polar = polar.a(chǎn)ugment_image(input_img)
input_jigsaw = jigsaw.a(chǎn)ugment_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”增強(qiáng)器時(shí),首先在極坐標(biāo)表示中應(yīng)用裁剪和填充,然后再將其扭轉(zhuǎn)回笛卡爾表示。這個(gè)增強(qiáng)器可以為圖像添加額外的像素。這些將被黑色像素填充。此外,“Jigsaw”增強(qiáng)以類似于拼圖模式的方式移動(dòng)圖片內(nèi)的單元格。
圖像上的邊界框
Imgaug 還為圖像提供邊界框支持。如果在增強(qiáng)期間旋轉(zhuǎn),該庫可以旋轉(zhuǎn)圖像上的所有邊界框。
from imgaug.a(chǎn)ugmentables.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 是一個(gè)快速且知名的庫,它與流行的深度學(xué)習(xí)框架(如 PyTorch 和 TensorFlow)集成。它也是 PyTorch 生態(tài)系統(tǒng)的一部分。
Albumentations 可以執(zhí)行所有典型的計(jì)算機(jī)視覺任務(wù),包括分類、語義分割、實(shí)例分割、對象識別和姿勢估計(jì)。該庫包含 70 多種不同的增強(qiáng)功能,用于從現(xiàn)有數(shù)據(jù)創(chuàng)建新的訓(xùn)練樣本。它通常用于工業(yè)、深度學(xué)習(xí)研究、機(jī)器學(xué)習(xí)競賽和開源項(xiàng)目。
讓我們首先使用 pip 命令安裝庫。
pip install Albumentations
我們將導(dǎo)入使用 Albumentations 擴(kuò)充數(shù)據(jù)所需的所有必要包:
import albumentations as A
import cv2
除了 Albumentations 包之外,我們還使用 OpenCV 包,這是一個(gè)支持多種圖像格式的開源計(jì)算機(jī)視覺庫。Albumentations 依賴于 OpenCV;因此,你已經(jīng)安裝了它。
圖像翻轉(zhuǎn)
'A.HorizontalFlip' 和 'A.VerticalFlip' 函數(shù)用于水平和垂直翻轉(zhuǎn)圖像。p 是一個(gè)獨(dú)特的參數(shù),幾乎所有的擴(kuò)充都支持。它控制使用增強(qiáng)的概率。
#HorizontalFlip
transform = A.HorizontalFlip(p=0.5)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.a(chǎn)xis('off')
plt.imshow(augmented_image)
#VerticalFlip
transform = A.VerticalFlip(p=1)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.a(chǎn)xis('off')
plt.imshow(augmented_image)
圖像縮放和旋轉(zhuǎn)
該增強(qiáng)器隨機(jī)使用仿射變換來平移、縮放和旋轉(zhuǎn)輸入圖像。
transform = A.ShiftScaleRotate(p=0.5)
random.seed(7)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.a(chǎn)xis('off')
plt.imshow(augmented_image)
圖像 ChannelShuffle
該增強(qiáng)器隨機(jī)重新排列輸入圖像的 RGB 通道。
from albumentations.a(chǎn)ugmentations.transforms import ChannelShuffle
transform = ChannelShuffle(p=1.0)
random.seed(7)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.a(chǎn)xis('off')
plt.imshow(augmented_image)
圖像曝光
該增強(qiáng)器反轉(zhuǎn)輸入圖像中大于某個(gè)閾值的所有像素值。
from albumentations.a(chǎn)ugmentations.transforms import Solarize
transform = Solarize(threshold=200, p=1.0)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.a(chǎn)xis('off')
plt.imshow(augmented_image)
反轉(zhuǎn)圖像
通過從 255 中減去像素值,此增強(qiáng)器反轉(zhuǎn)輸入圖像。
from albumentations.a(chǎn)ugmentations.transforms import InvertImg
transform = InvertImg(p=1.0)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.a(chǎn)xis('off')
plt.imshow(augmented_image)
使用 Compose 增強(qiáng)管道
要定義一個(gè)擴(kuò)展管道,首先,創(chuàng)建一個(gè) Compose 實(shí)例。你必須提供擴(kuò)充列表作為 Compose 類的參數(shù)。在此示例中,我們將使用各種增強(qiáng)功能,例如轉(zhuǎn)置、模糊、失真等。
調(diào)用 Compose 將導(dǎo)致返回一個(gè)將進(jìn)行圖像增強(qiáng)的轉(zhuǎn)換函數(shù)。
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.a(chǎn)xis('off')
plt.imshow(augmented_image)
SOLT
SOLT 是一個(gè)深度學(xué)習(xí)數(shù)據(jù)增強(qiáng)庫,支持圖像、分割掩碼、標(biāo)簽和關(guān)鍵點(diǎn)。SOLT 也很快,并且在其后端有 OpenCV。
我們將從使用 pip 命令安裝 SOLT 開始
pip install solt
然后我們將導(dǎo)入增強(qiáng)圖像數(shù)據(jù)所需的所有必要的 SOLT 包。
import solt
import solt.transforms as slt
h, w, c = input_img.shape
img = input_img[:w]
在這里,我們將為擴(kuò)充管道創(chuàng)建一個(gè) Stream 實(shí)例。你必須提供擴(kuò)充列表作為流類的參數(shù)。
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.a(chǎn)dd_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()
結(jié)論
圖像增強(qiáng)可以幫助增加現(xiàn)有數(shù)據(jù)集。目前有幾個(gè) Python 庫可用于圖像增強(qiáng)。在本文中,我們使用三個(gè) Python 庫——Imgaug、Albalentations和Solt探索了不同的圖像增強(qiáng)技術(shù)。
原文標(biāo)題 : 使用 3 個(gè)Python庫的圖像增強(qiáng)
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開啟變現(xiàn)競速
- 6 海信給AI電視打樣,12大AI智能體全面升級大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級軟件工程師 廣東省/深圳市
- 自動(dòng)化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市