簡體   English   中英

Keras ImageDataGenerator 用於在單獨的目錄中使用圖像和掩碼進行分割

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM