數據集增強
讓機器學習模型泛化得更好的最好辦法是使用更多的數據進行訓練。當然,在實踐中,我們擁有的數據量是很有限的。解決這個問題的一種辦法是創造假數據並添加到訓練集中。對於一些機器學習任務,創建假數據相當簡單。、
對分類來說這種方法是最簡單的。分類器需要一個複雜的高維輸入,並用單個類別表示概括,這就意味着分類面臨的一個主要任務面對各種變換保持不變。我們輕易通過轉換訓練集x來生成新的對。
這種方法對其他許多任務來說是困難的,例如密度估計問題,除非我們已經解決了密度估計問題,否則我們很難生成新的假數據。
數據集增強對一個具體的分類問題來說是特別有效的方法:對象識別。圖像是高維的幷包括各種巨大的變化因素,其中有許多可以輕易地模擬。即使模型已使用卷積和池化技術對部分平移保持不變,沿訓練圖像每個方向平移幾個像素的操作通常可以大大改善泛化。許多其他操作如旋轉圖像或壓縮圖像也已經被證明非常有效。
我們必須要小心,不能使用會改變類別的轉換。
能保持我們希望的分類不變,但不容易執行的變換也是存在的,例如,平面外繞軸轉動難以通過簡單的幾何運算在輸入像素上實現。
數據集增強對語音識別任務也是有效的。
在神經網絡的輸入層注入噪聲也可以看作數據增強的一種方式。對於許多分類甚至一些迴歸任務而言,即使小的隨機噪聲被加到輸入,任務仍應該是能夠被解決的。然而,神經網絡被證明不是非常健壯。改善神經網絡健壯性的方法之一是簡單地將隨機噪聲添加到輸入再進行訓練。輸入噪聲注入是一些無監督學習算法的一部分,如去噪自編碼器。向隱藏單元施加噪聲也是可行的,這可以被看作在多個抽象層上進行的數據集增強。最近表明,噪聲的幅度被細心調整後,該方法是非常高效的。
###
本代碼共採用了四種數據增強,如採用其他數據增強方式,可以參考本代碼,隨意替換。
imageDir 爲原數據集的存放位置
saveDir 爲數據增強後數據的存放位置
###
def flip(root_path,img_name): #翻轉圖像
img = Image.open(os.path.join(root_path, img_name))
filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
# filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
return filp_img
def rotation(root_path, img_name):
img = Image.open(os.path.join(root_path, img_name))
rotation_img = img.rotate(20) #旋轉角度
# rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
return rotation_img
def randomColor(root_path, img_name): #隨機顏色
"""
對圖像進行顏色抖動
:param image: PIL的圖像image
:return: 有顏色色差的圖像image
"""
image = Image.open(os.path.join(root_path, img_name))
random_factor = np.random.randint(0, 31) / 10. # 隨機因子
color_image = ImageEnhance.Color(image).enhance(random_factor) # 調整圖像的飽和度
random_factor = np.random.randint(10, 21) / 10. # 隨機因子
brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor) # 調整圖像的亮度
random_factor = np.random.randint(10, 21) / 10. # 隨機因子
contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor) # 調整圖像對比度
random_factor = np.random.randint(0, 31) / 10. # 隨機因子
return ImageEnhance.Sharpness(contrast_image).enhance(random_factor) # 調整圖像銳度
def contrastEnhancement(root_path, img_name): # 對比度增強
image = Image.open(os.path.join(root_path, img_name))
enh_con = ImageEnhance.Contrast(image)
contrast = 1.5
image_contrasted = enh_con.enhance(contrast)
return image_contrasted
def brightnessEnhancement(root_path,img_name):#亮度增強
image = Image.open(os.path.join(root_path, img_name))
enh_bri = ImageEnhance.Brightness(image)
brightness = 1.5
image_brightened = enh_bri.enhance(brightness)
return image_brightened
def colorEnhancement(root_path,img_name):#顏色增強
image = Image.open(os.path.join(root_path, img_name))
enh_col = ImageEnhance.Color(image)
color = 1.5
image_colored = enh_col.enhance(color)
return image_colored
from PIL import Image
from PIL import ImageEnhance
import os
import cv2
import numpy as np
imageDir="/home/admin324/PycharmProjects/data/UC/train" #要改變的圖片的路徑文件夾
saveDir="/home/admin324/PycharmProjects/data/UC/train_aug" #要保存的圖片的路徑文件夾
for name in os.listdir(imageDir):
saveName= name[:-4]+"id.jpg"
image = Image.open(os.path.join(imageDir, name))
image.save(os.path.join(saveDir,saveName))
saveName= name[:-4]+"be.jpg"
saveImage=brightnessEnhancement(imageDir,name)
saveImage.save(os.path.join(saveDir,saveName))
saveName= name[:-4]+"fl.jpg"
saveImage=flip(imageDir,name)
saveImage.save(os.path.join(saveDir,saveName))
saveName= name[:-4]+"ro.jpg"
saveImage=rotation(imageDir,name)
saveImage.save(os.path.join(saveDir,saveName))