![](/img/trans.png)
[英]Keras: Image segmentation using grayscale masks and ImageDataGenerator class
[英]Keras ImageDataGenerator for segmentation with images and masks in separate directories
我正在嘗試使用tensorflow.keras
構建語義分割模型。 我使用的數據集將圖像和掩碼存儲在單獨的目錄中,每個文件名都有一個 id,用於將圖像文件與其各自的掩碼映射。
以下是我的數據集目錄的結構:
new
- rendered_imges
- render
- image_1.tif
- image_2.tif
- image_3.tif
- ground_truths
- masks
- mask_1.tif
- mask_2.tif
- mask_3.tif
在上面的目錄結構中, image_{i}.tif
對應的是mask_{i}.tif
。
我嘗試編寫一個ImageDataGenerator
以完全相同的方式增強圖像及其各自的蒙版。 我的方法如下:
SEED = 100
image_data_generator = ImageDataGenerator(
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 10,
zoom_range = 0.1
).flow_from_directory('./new/rendered_images', batch_size = 16, target_size = (150, 150), seed = SEED)
mask_data_generator = ImageDataGenerator(
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 10,
zoom_range = 0.1
).flow_from_directory('./new/ground_truths', batch_size = 16, target_size = (150, 150), seed = SEED)
使用上述方法,雖然我對圖像和蒙版應用了相同的增強,但圖像並沒有根據它們的文件名與各自的蒙版配對。 如果有人可以建議一種使用 Keras 或 Tensorflow 正確執行此操作的方法,那就太好了。
您將需要創建一個新函數,該函數將生成訓練圖像和相應的掩碼,您將使用這些掩碼輸入fit_generator
方法。 具體來說, fit_generator
工作方式是生成一個元組序列,元組的第一個元素是圖像,元組的第二個元素是預期的輸出。 通過簡單地單獨使用數據生成器,子目錄將隱式編碼圖像的預期標簽。 當您嘗試進行語義分割時,情況當然不再如此。
因此,創建一個新函數,該函數將輸出一組元組,為您提供圖像和掩碼。 總而言之,您只需將創建的兩個ImageDataGenerators
zip
在一起,然后創建一個循環,生成每批訓練圖像和預期的輸出標簽。
我需要提到的最后一件事是,如果您想成功地將圖像和相應的掩碼配對,兩個目錄的文件名需要匹配。 例如,如果您的1.tif
rendered_imges/render
子目錄中有一個名為1.tif
的訓練圖像,則您需要在ground_truths/mask
以相同的方式命名相應的ground_truths/mask
。 原因是即使你匹配了種子,它也會在將圖像加載到內存之前隨機選擇文件名,因此為了確保訓練圖像和相應掩碼之間保持相同的選擇順序,它們的文件名也需要匹配. 在我們繼續之前,請確保您這樣做。
因此,請執行以下操作:
def my_image_mask_generator(image_data_generator, mask_data_generator):
train_generator = zip(image_data_generator, mask_data_generator)
for (img, mask) in train_generator:
yield (img, mask)
接下來,像往常一樣創建數據生成器:
SEED = 100
image_data_generator = ImageDataGenerator(
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 10,
zoom_range = 0.1
).flow_from_directory('./new/rendered_images', batch_size = 16, target_size = (150, 150), seed = SEED)
mask_data_generator = ImageDataGenerator(
width_shift_range = 0.1,
height_shift_range = 0.1,
rotation_range = 10,
zoom_range = 0.1
).flow_from_directory('./new/ground_truths', batch_size = 16, target_size = (150, 150), seed = SEED)
最后,在您的模型上調用fit_generator
方法。 假設您已經正確構建了模型:
from keras.optimizers import Adam
# Your other related imports here...
# Create custom generator for training images and masks
my_generator = my_image_mask_generator(image_data_generator, mask_data_generator)
model = ... # Define your model here
# Compile your model here
model.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy'])
# Train your model here
model.fit_generator(my_generator,...)
請注意,鑒於您的目錄結構,您似乎正在對每個圖像執行二進制分割,這就是我選擇二進制交叉熵作為損失函數的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.