Files
Stomach_Cancer_Keras/Image_Process/Image_Generator.py
2024-12-07 02:00:39 +08:00

201 lines
13 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
from _validation.ValidationTheEnterData import validation_the_enter_data
from Load_process.file_processing import Process_File
from keras.preprocessing.image import ImageDataGenerator
from Load_process.LoadData import Load_Data_Prepare
class Image_generator():
'''製作資料強化'''
def __init__(self, Generator_Root, Labels) -> None:
self._validation = validation_the_enter_data()
self.stop = 0
self.Labels = Labels
self.Generator_Root = Generator_Root
pass
def Processing_Main(self, Training_Dict_Data_Root):
data_size = 0
# 製作標準資料增強
'''
這裡我想要做的是依照paper上的資料強化IMAGE DATA COLLECTION AND IMPLEMENTATION OF DEEP LEARNING-BASED MODEL IN DETECTING MONKEYPOX DISEASE USING MODIFIED VGG16
產生出資料強化後的影像
'''
print("\nAugmentation one monkeypox image")
data_size = self.get_processing_Augmentation(Training_Dict_Data_Root, 1, data_size)
self.stop += data_size
# 製作標準資料增強
'''
這裡我想要做的是依照paper上的資料強化IMAGE DATA COLLECTION AND IMPLEMENTATION OF DEEP LEARNING-BASED MODEL IN DETECTING MONKEYPOX DISEASE USING MODIFIED VGG16
產生出資料強化後的影像
'''
print("\nAugmentation two monkeypox image")
data_size = self.get_processing_Augmentation(Training_Dict_Data_Root, 2, data_size)
self.stop += data_size
# 製作標準資料增強
'''
這裡我想要做的是依照paper上的資料強化IMAGE DATA COLLECTION AND IMPLEMENTATION OF DEEP LEARNING-BASED MODEL IN DETECTING MONKEYPOX DISEASE USING MODIFIED VGG16
產生出資料強化後的影像
'''
print("\nAugmentation three monkeypox image")
data_size = self.get_processing_Augmentation(Training_Dict_Data_Root, 3, data_size)
self.stop += data_size
# 製作標準資料增強
'''
這裡我想要做的是依照paper上的資料強化IMAGE DATA COLLECTION AND IMPLEMENTATION OF DEEP LEARNING-BASED MODEL IN DETECTING MONKEYPOX DISEASE USING MODIFIED VGG16
產生出資料強化後的影像
'''
print("\nAugmentation four monkeypox image")
data_size = self.get_processing_Augmentation(Training_Dict_Data_Root, 4, data_size)
print()
def get_processing_Augmentation(self, original_image_root : dict, Augment_choose, data_size):
Prepaer = Load_Data_Prepare()
self.get_data_roots = original_image_root # 要處理的影像路徑
Prepaer.Set_Label_List(self.Labels)
data_size = self.Generator_main(self.Generator_Root, Augment_choose, data_size) # 執行
return data_size
def Generator_main(self, save_roots, stardand, data_size):
'''
Parameter:
labels = 取得資料的標籤
save_root = 要儲存資料的地方
strardand = 要使用哪種Image Augmentation
'''
File = Process_File()
for label in self.Labels: # 分別對所有類別進行資料強化
image = self.load_data(label) # 取的資料
save_root = File.Make_Save_Root(label, save_roots) # 合併路徑
if File.JudgeRoot_MakeDir(save_root): # 判斷要存的資料夾存不存在,不存在則創立
print("The file is exist")
train_Generator = self.Generator_Content(stardand) # 取的要做怎樣的資料強化
stop_counter = 0
for batches in train_Generator.flow(image, batch_size = 16): # 執行資料強化
'''
程式碼中的 batch_size 參數被設置為 12, 這表示每次從訓練資料集中產生 12 個影像資料,作為一個 batch。當程式碼迭代 train_Generator 物件時,每次從訓練資料集中取出一個 batch 的影像,並逐一處理其中的每個影像。
在迭代過程中, counter 變數用於計算存儲的 Numpy 陣列檔案的數量,而 i 變數用於計算迭代的次數。當 i 的值是 417 的倍數時, if i % 417 == 0: 條件就會成立,進而執行 break 語句,退出外層迴圈。因此,最多只會從訓
練資料集中產生 417 個 batch 的影像資料。如果資料集中的影像總數不能被 12 整除,最後一個 batch 的影像數量會少於 12。因此, 最終產生的 Numpy 陣列檔案數量可能小於 image 資料集的影像總數除以 12。
總之,根據程式碼的設計,最多只會從訓練資料集中產生 417 個 batch 的影像資料,並將它們存儲為 Numpy 陣列檔案。在最後一個 batch 中的影像數量可能少於 12。
* train_Generator: 是一個ImageDataGenerator物件, 它從訓練資料中產生影像資料,這些影像資料可以用於訓練神經網路模型。
* flow(): 方法是ImageDataGenerator物件的一個方法, 它可以從資料集中產生一個batch的影像資料。image 是要傳遞給ImageDataGenerator的影像資料, batch_size 是一個batch中包含的影像數量。
* for batch in train_Generator.flow(image, batch_size = 12): 語句會迭代ImageDataGenerator物件產生的影像batch, 這些影像batch會逐一傳遞給batch 變數。
* for batches in batch: 語句會迭代batch中的每個影像資料, 這些影像資料會逐一傳遞給batches 變數。
* self.save_dir("image_" + label + str(counter) + ".npy", batches): 語句會以Numpy陣列的形式將每個影像資料存儲為一個Numpy陣列檔案, 檔案名稱會包含影像標籤和計數器。
* counter += 1: 語句會將計數器增加1, 以便標識存儲的Numpy陣列檔案。
* i += 1: 語句會增加迭代器的值, 以便在每417個影像batch之後退出迴圈。
* if i % 417 == 0: break 語句會檢查迭代器是否達到了417的倍數, 如果是, 就會退出外層的迴圈, 以便結束影像資料的存儲。
'''
for batch in batches: # 分別抓出每一張照片來儲存
File.Save_CV2_File("image_" + label + str(data_size) + ".png", save_root, batch) # 存檔
data_size += 1
stop_counter += 1
if stop_counter >= self.stop: # 若做指定次數則停止
break
print(str(label) + "" + str(stop_counter) + "筆資料")
return data_size
def load_data(self, label):
'''Images is readed by myself'''
image_processing = Read_image_and_Process_image()
img = image_processing.Data_Augmentation_Image(self.get_data_roots[label])
self.stop = len(img) * 1.5
return img
def Generator_Content(self, judge): # 影像資料增強
'''
ImageGenerator的參數:
featurewise_center : 布爾值。將輸入數據的均值設置為0逐特徵進行。
samplewise_center : 布爾值。將每個樣本的均值設置為0。
featurewise_std_normalization : Boolean. 布爾值。將輸入除以數據標準差,逐特徵進行。
samplewise_std_normalization : 布爾值。將每個輸入除以其標準差。
zca_epsilon : ZCA 白化的epsilon 值默認為1e-6。
zca_whitening : 布爾值。是否應用ZCA 白化。
rotation_range : 整數。隨機旋轉的度數範圍。
width_shift_range : 浮點數、一維數組或整數
float: 如果<1則是除以總寬度的值或者如果>=1則為像素值。
1-D 數組: 數組中的隨機元素。
int: 來自間隔 (-width_shift_range, +width_shift_range) 之間的整數個像素。
width_shift_range=2時可能值是整數[-1, 0, +1],與 width_shift_range=[-1, 0, +1] 相同;而 width_shift_range=1.0 時,可能值是 [-1.0, +1.0) 之間的浮點數。
height_shift_range : 浮點數、一維數組或整數
float: 如果<1則是除以總寬度的值或者如果>=1則為像素值。
1-D array-like: 數組中的隨機元素。
int: 來自間隔 (-height_shift_range, +height_shift_range) 之間的整數個像素。
height_shift_range=2時可能值是整數[-1, 0, +1],與 height_shift_range=[-1, 0, +1] 相同;而 height_shift_range=1.0 時,可能值是 [-1.0, +1.0) 之間的浮點數。
shear_range : 浮點數。剪切強度(以弧度逆時針方向剪切角度)。
zoom_range : 浮點數或[lower, upper]。隨機縮放範圍。如果是浮點數,[lower, upper] = [1-zoom_range, 1+zoom_range]。
channel_shift_range : 浮點數。隨機通道轉換的範圍。
fill_mode : {"constant", "nearest", "reflect" or "wrap"} 之一。默認為'nearest'。輸入邊界以外的點根據給定的模式填充:
'constant': kkkkkkkk|abcd|kkkkkkkk (cval=k)
'nearest': aaaaaaaa|abcd|dddddddd
'reflect': abcddcba|abcd|dcbaabcd
'wrap': abcdabcd|abcd|abcdabcd
cval : 浮點數或整數。用於邊界之外的點的值,當 fill_mode = "constant" 時。
horizontal_flip : 布爾值。隨機水平翻轉。
vertical_flip : 布爾值。隨機垂直翻轉。
rescale : 重縮放因子。默認為None。如果是None 或0不進行縮放否則將數據乘以所提供的值在應用任何其他轉換之前
preprocessing_function : 應用於每個輸入的函數。這個函數會在任何其他改變之前運行。這個函數需要一個參數一張圖像秩為3 的Numpy 張量並且應該輸出一個同尺寸的Numpy 張量。
data_format : 圖像數據格式,{"channels_first", "channels_last"} 之一。"channels_last" 模式表示圖像輸入尺寸應該為(samples, height, width, channels)"channels_first" 模式表示輸入尺寸應該為(samples, channels, height, width)。默認為在Keras 配置文件 ~/.keras/keras.json 中的 image_data_format 值。如果你從未設置它,那它就是"channels_last"
validation_split : 浮點數。Float. 保留用於驗證的圖像的比例嚴格在0和1之間
dtype : 生成數組使用的數據類型。
'''
if judge == 1:
datagen = ImageDataGenerator(
rotation_range=30, # 旋轉影像
width_shift_range=0.1, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
height_shift_range=0.1, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
zoom_range=0.2, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
horizontal_flip=False, # 水平翻轉
vertical_flip=False, # 垂直翻轉
fill_mode='nearest' # 在旋轉或平移造成空隙時,則空隙補常數
)
if judge == 2:
datagen = ImageDataGenerator(
rotation_range=180,
width_shift_range=0.2,
height_shift_range=0.1,
zoom_range=0.1,
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest'
)
if judge == 3:
datagen = ImageDataGenerator(
rotation_range=45, # 旋轉影像
width_shift_range=0.02, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
height_shift_range=0.02, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
shear_range = 0.02,
zoom_range=0.02, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
horizontal_flip = True,
fill_mode = "reflect"
)
if judge == 4: # 第二份paper的資料強化
datagen = ImageDataGenerator(
rotation_range=50, # 旋轉影像
width_shift_range=0.2, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
height_shift_range=0.2, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
shear_range = 0.25,
zoom_range=0.1, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
channel_shift_range = 20 # 隨機通道轉換的範圍
)
if judge == 5: # 第一份paper的資料強化
datagen = ImageDataGenerator(rescale = 1 / 255)
return datagen