簡體   English   中英

Keras 方法 image_dataset_from_directory() 如何區分 X 和 Y 數據?

[英]How does the Keras method image_dataset_from_directory() distinguish X and Y data?

我正在使用 ADE20K 數據集來訓練像 model 這樣的 Unet,以便在 Keras 中進行分割。

數據集有超過 1000 個類。 我正在嘗試使用 Keras 方法image_dataset_from_directory()將數據集加載到tf.dataset object 中。

以下文檔向您展示如何加載此數據集 object 並將其傳遞到您的 model: https://keras.io/api/preprocessing/

# directory for training data
training_data/
...class_a/
......a_image_1.jpg
......a_image_2.jpg
...class_b/
......b_image_1.jpg
......b_image_2.jpg
etc.


from tensorflow import keras
from tensorflow.keras.preprocessing import image_dataset_from_directory

train_ds = image_dataset_from_directory(
    directory='training_data/',
    labels='inferred',
    label_mode='categorical',
    batch_size=32,
    image_size=(256, 256))
validation_ds = image_dataset_from_directory(
    directory='validation_data/',
    labels='inferred',
    label_mode='categorical',
    batch_size=32,
    image_size=(256, 256))

model = keras.applications.Xception(weights=None, input_shape=(256, 256, 3), classes=10)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit(train_ds, epochs=10, validation_data=validation_ds)

在上面的示例中,它基於提供的文件夾結構構建了一個數據集 object,其中每個 class 是目錄中的一個文件夾。 就我而言,我有一個這樣的目錄:

ADE20k_Data/
...cars/
......image_1.jpg
......image_1_segmentation.png
......image_2.jpg
......image_2_segmentation.png
...resteraunt/
......image_1.jpg
......image_1_segmentation.png
......image_2.jpg
......image_2_segmentation.png
etc.

在每個 class 文件夾中,我都有 X 和 Y(或原始圖像和分段圖像)。

如果我按照上面的例子加載我的數據集,並將其傳遞給 .fit() 方法,那么 X 和 Y 是如何區分的?

我想這就是我的困惑所在。 如何正確安排數據的目錄結構以進行圖像分割。

您使用它的方式將為分類而不是分段准備數據。 它將使用圖像作為 X 和“resteraunt”、“汽車”作為標簽在 Y 中進行分類。

我建議你創建自己的 tf.Dataset

考慮您的文件夾結構並假設您的所有圖像都是“*.jpg”並且每個圖像都有一個“*_segmentation.png”對,您可以使用以下代碼查找所有圖像和相應的分割掩碼。

import glob
jpgs = glob.glob('ADE20k_Data/*/*.jpg')
pngs = [f.split('.jpg')[0] + "_segmentation" + ".png" for f in jpgs]

然后你可以從這個數據創建你的數據集

import tensorflow as tf
dataset = tf.data.Dataset.from_tensor_slices((jpgs, pngs))

在這一點上,如果你想做類似的事情

for pair in dataset.take(1):
    print(pair)

它會給你一對張量,第一個包含圖像的路徑,第二個包含對應分割掩碼的路徑。

此外,您可以從路徑中讀取圖像,例如這樣

def read_images(img_path, segmentation_mask_path):
    img_data = tf.io.read_file(img_path)
    img = tf.io.decode_jpeg(img_data)
    
    segm_data = tf.io.read_file(segmentation_mask_path)
    segm_mask = tf.io.decode_png(segm_data)
    
    return img, segm_mask

dataset = dataset.map(read_images)

接下來你可以為你的 model 做一些預處理

HEIGHT = 256
WIDTH = 256

def prepare_images(img, semg_mask):
    img = tf.image.resize(img, [HEIGHT, WIDTH])
    semg_mask = tf.image.resize(semg_mask, [HEIGHT, WIDTH], method='nearest')
    return img, semg_mask


dataset = dataset.map(prepare_images)

此時,如果您要從數據集中獲取一個實例

for pair in dataset.take(1):
    print(pair)

它會給你一對張量,第一個包含輸入圖像,第二個包含分割掩碼作為你的 output。

顯然,您將需要很多其他的東西,例如選擇正確的網絡架構、標准化輸入圖像(只需將 img 除以 255)、將數據集拆分為訓練/驗證/測試、打亂訓練數據、批處理。 但是您可以使用 tf.data api 來實現這一點,例如dataset = dataset.batch(batch_size)將根據您的 model 的要求批量生成 X 和 Y。 https://www.tensorflow.org/api_docs/python/tf/data/Dataset

然后就像你已經做的那樣將你的數據集傳遞給 fit 方法model.fit(daseset, epoches=10)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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