我正在使用 ADE20K 資料集來訓練一個類似 Unet 的模型,以便在 Keras 中進行分割。
該資料集有 1000 多個類。我正在嘗試使用 Keras 方法image_dataset_from_directory()
將資料集加載到tf.dataset物件中。
以下檔案向您展示了如何將此資料集物件加載并傳遞到您的模型中: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)
在上面的例子中,它根據提供的檔案夾結構構建了一個資料集物件,其中每個類都是目錄中的一個檔案夾。就我而言,我有一個這樣的目錄:
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.
在每個類檔案夾中,我都有 X 和 Y(或原始影像和分割影像)。
如果我根據上面的例子加載我的資料集,并將其傳遞給 .fit() 方法,那么 X 和 Y 是如何區分的?
我想這就是我的困惑所在。如何為影像分割正確安排資料的目錄結構。
uj5u.com熱心網友回復:
您使用它的方式將為分類準備資料,而不是為分段準備資料。它將使用影像作為 X 和“餐館”、“汽車”作為 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)
接下來你可以為你的模型做一些預處理
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)
它會給你一對張量,第一個包含輸入影像,第二個包含分割掩碼作為你的輸出。
顯然,您還需要很多其他東西,例如選擇正確的網路架構、標準化輸入影像(只需將 img 除以 255)、將資料集拆分為訓練/驗證/測驗、改組訓練資料、批處理。但是您可以使用 tf.data api 實作這一點,例如dataset = dataset.batch(batch_size)將根據您的模型需要分批生成 X 和 Y。
https://www.tensorflow.org/api_docs/python/tf/data/Dataset
然后就像你已經做的那樣將你的資料集傳遞給 fit 方法
model.fit(daseset, epoches=10)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/382723.html
