Используйте тот же конвейер tf.data.Dataset в выводе без снижения производительности - PullRequest
0 голосов
/ 30 апреля 2020

На тренировке я потребляю пути к изображениям и соответствующие им метки. При использовании 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).

Может кто-нибудь помочь мне с лучшими практиками в этом случае? Я хотел бы иметь минимальное несоответствие между конвейерами данных обучения и вывода и при этом все равно выполнять как можно быстрее при выводе.

Кроме того, между двумя методами существует небольшая разница в точности тестирования. Спасибо.

...