На тренировке я потребляю пути к изображениям и соответствующие им метки. При использовании tf.data.Dataset
это выглядит следующим образом:
def decode_img(image):
image = tf.io.decode_png(image)
image = tf.image.convert_image_dtype(image, tf.float32)
image = tf.image.resize(image, [64, 64])
return image
def process_path(image_path, label):
image = tf.io.read_file(image_path)
image = decode_img(image)
return image, label
train_ds = tf.data.Dataset.from_tensor_slices((train_paths, train_labels))
train_ds = train_ds.shuffle(BUFFER_SIZE).repeat().map(process_path).batch(BATCH_SIZE)
Однако в качестве вывода мои входные данные теперь представляют собой numpy массив изображений разных размеров . Итак, я попробовал следующее:
Используйте opencv для изменения размера:
def preprocess_batch(batch_images):
batch_images = np.array([cv2.resize(img, (64, 64)).astype('float32') / 255.0 for img in batch_images])
return batch_images
processed_batch_images = preprocess_batch(batch_images)
predictions = model.predict(processed_batch_images)
Возможная проблема здесь - это несоответствие между поездом (tf) и выводом (cv2) , python) конвейеры данных.
Использовать TF в нетерпении
Я использую tenorflow 2.x, поэтому нетерпеливое выполнение выполняется по умолчанию.
def preprocess_batch(batch_images):
def tf_preprocess(image):
image = tf.image.convert_image_dtype(image, tf.float32)
image = tf.image.resize(image, [64, 64])
return image
batch_images = [tf_preprocess(img) for img in batch_images])
batch_images = tf.stack(batch_images)
return batch_images
processed_batch_images = preprocess_batch(batch_images)
predictions = model.predict(processed_batch_images)
Моя проблема здесь в том, что время вывода намного медленнее, чем в первом варианте (cv2, python).
Может кто-нибудь помочь мне с лучшими практиками в этом случае? Я хотел бы иметь минимальное несоответствие между конвейерами данных обучения и вывода и при этом все равно выполнять как можно быстрее при выводе.
Кроме того, между двумя методами существует небольшая разница в точности тестирования. Спасибо.