Как определить оптимальное количество «шагов» и «размер партии» для тестового набора данных в Keras ImageDataGenerator? - PullRequest
0 голосов
/ 23 января 2020

Я обучил сети подобия изображений. Сеть предназначена для различения guish между подобными / разнородными парами изображений.

Пара содержит изображение с камеры и соответствующее изображение эскиза.

Набор тестовых данных содержит 4 каталога изображений (camera_positive, sketch_positive, camera_negative, sketch_negative).

Возникла проблема при оценке производительности сети в тестовом наборе данных.

Поскольку набор тестовых данных огромен, чтобы поместиться в памяти, я решил использовать Keras ImageDataGenerator.

Я реализовал следующий код. Каждый каталог содержит 20 изображений (для небольшой демонстрации).

Таким образом, всего 80 изображений и 40 прогнозов.

Поскольку ImageDataGenerator дает нам возможность сохранить изображение, я использовал параметр «save_to_dir», как видно из следующего кода для проверки правильно работает.

Каждый каталог содержит 20 изображений, поэтому я ожидаю, что после выполнения прогнозов он сохранит те же изображения в указанных каталогах.

После запуска кода он генерирует 31 изображение в каждой папке вместо 20!

Я играл с разными размерами шагов, но никто не дает точных результатов.

Что не так с этим кодом. Пожалуйста, предложите!

import os
import numpy as np
from keras.models import load_model
from keras.preprocessing.image import ImageDataGenerator

batch_size = 1
image_size = 224
class_mode = None

"""
c_pos/neg: camera positive/neg image
s_pos/neg: sketch positive/neg image
"""
c_pos = r"testing\c_pos"
c_neg = r"testing\c_neg"
s_pos = r"testing\s_pos"
s_neg = r"testing\s_neg"

datagen_constructor = ImageDataGenerator()

def initialize_generator(generator, c_pos, s_pos, c_neg, s_neg):
    camera_pos=generator.flow_from_directory(
            c_pos, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/c_pos', 
            save_format='jpeg', 
            save_prefix='CPOS'
            )

    sketch_pos=generator.flow_from_directory(
            s_pos, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/s_pos', 
            save_format='jpeg', 
            save_prefix='SPOS'
            )

    camera_neg=generator.flow_from_directory(
            c_neg, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/c_neg', 
            save_format='jpeg', 
            save_prefix='CNEG'
            )

    sketch_neg=generator.flow_from_directory(
            s_neg, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/s_neg', 
            save_format='jpeg', 
            save_prefix='SNEG'
            )

    while True:
        camerapos = np.expand_dims(camera_pos.next(), axis=0)
        sketchpos = np.expand_dims(sketch_pos.next(), axis=0)
        cameraneg = np.expand_dims(camera_neg.next(), axis=0)
        sketchneg = np.expand_dims(sketch_neg.next(), axis=0)

        camera = np.concatenate((camerapos[0], cameraneg[0]))
        sketch = np.concatenate((sketchpos[0], sketchneg[0]))

        camera = np.asarray(list(camera), dtype=np.float32)
        sketch = np.asarray(list(sketch), dtype=np.float32)

        yield [camera, sketch]

test_datagen = initialize_generator(datagen_constructor, c_pos, s_pos, c_neg, s_neg)

# Load pre-trained model
model = load_model("model.h")

# Evaluating network performance on test dataset
predict = model.predict_generator(test_datagen, steps = 20)

1 Ответ

0 голосов
/ 23 января 2020

Вы можете вручную выполнить итерацию по каждой папке и сделать прогноз, подобный следующему:

  model = load_model("model.h")
  image_paths = [image.path for image in os.scandir(path_to_my_folder)]
  for image_path in image_paths:
      image = cv2.imread(image_path)
      image_to_predict = np.expand_dims(image,axis=0) # this is important to add the batch index, keras only predicts on batches and here we have batch of size 1
      prediction = model.predict(image_to_predict)

Затем вы можете сравнить каждое предсказание с меткой достоверности, которой, как вы знаете, оно принадлежит.

...