Как использовать .predict_generator () на новых изображениях - Keras - PullRequest
0 голосов
/ 11 сентября 2018

Я использовал ImageDataGenerator и flow_from_directory для обучения и проверки.

Это мои каталоги:

train_dir = Path('D:/Datasets/Trell/images/new_images/training')
test_dir = Path('D:/Datasets/Trell/images/new_images/validation')
pred_dir = Path('D:/Datasets/Trell/images/new_images/testing')

Код ImageGenerator:

img_width, img_height = 28, 28
batch_size=32
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    test_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')

Найдено 1852 изображения, относящихся к 4 классам

Найдено 115 изображений, относящихся к 4 классам

Это мой учебный код модели:

history = cnn.fit_generator(
        train_generator,
        steps_per_epoch=1852 // batch_size,
        epochs=20,
        validation_data=validation_generator,
        validation_steps=115 // batch_size)

СейчасУ меня есть несколько новых изображений в тестовой папке (все изображения находятся только в одной папке), которые я хочу предсказать.Но когда я использую .predict_generator, я получаю:

Найдено 0 изображений, принадлежащих к 0 классу

Поэтому я попробовал следующие решения:

1) Keras: Как использовать Предикат_Генератор с ImageDataGenerator? Это не сработало, потому что он пытается только на проверочном наборе.

2) Как предсказать новое изображение с помощью модели.Предсказание? module image not found

3) Как получить прогнозы с помощью предиката_генератора для потоковой передачи тестовых данных в Керасе? Это также не сработало.

МойДанные поезда в основном хранятся в 4 отдельных папках, то есть в 4 конкретных классах, проверка также сохраняется таким же образом и работает довольно хорошо.

Так что в моей тестовой папке у меня есть около 300 изображений, которые я хочу предсказатьи создайте фрейм данных, например:

image_name    class
gghh.jpg       1
rrtq.png       2
1113.jpg       1
44rf.jpg       4
tyug.png       1
ssgh.jpg       3

Я также использовал следующий код:

img = image.load_img(pred_dir, target_size=(28, 28))
img_tensor = image.img_to_array(img)
img_tensor = np.expand_dims(img_tensor, axis=0)
img_tensor /= 255.

cnn.predict(img_tensor)

Но я получаю эту ошибку: [Errno 13] Permission denied: 'D:\\Datasets\\Trell\\images\\new_images\\testing'

НоЯ не смог predict_generator на моих тестовых изображениях.Итак, как я могу предсказать мои новые изображения с помощью Keras.Я много гуглил, искал и в Kaggle Kernels, но не смог найти решение.

Ответы [ 4 ]

0 голосов
/ 05 мая 2019

У меня были некоторые проблемы с predict_generator(). Некоторые посты здесь очень помогли. Я также публикую свое решение здесь и надеюсь, что оно поможет другим. Что я делаю:

  • Создание прогнозов для новых изображений с использованием predict_generator()
  • Получить имя файла для каждого прогноза
  • Сохранить результаты во фрейме данных

Я делаю бинарные предсказания в виде «кошек и собак», как задокументировано здесь . Тем не менее, логика может быть обобщена на случаи мультикласса. В этом случае результат прогноза имеет один столбец на класс.

Сначала я загружаю свою сохраненную модель и настраиваю генератор данных:

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

# Load model
model = load_model('my_model_01.hdf5')

test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
        "C:/kerasimages/pred/",
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary',
        shuffle=False)

Примечание: важно указать shuffle=False, чтобы сохранить порядок имен файлов и предсказаний.

Изображения хранятся в C:/kerasimages/pred/images/. Генератор данных будет искать только изображения в подпапках из C:/kerasimages/pred/ (как указано в test_generator). Важно соблюдать логику генератора данных, поэтому требуется подпапка /images/. Каждая подпапка в C:/kerasimages/pred/ интерпретируется генератором как один класс. Здесь генератор сообщит Found x images belonging to 1 classes (поскольку есть только одна подпапка). Если мы делаем прогнозы, классы (обнаруженные генератором) не имеют значения.

Теперь я могу делать прогнозы, используя генератор:

# Predict from generator (returns probabilities)
pred=model.predict_generator(test_generator, steps=len(test_generator), verbose=1)

Сброс генератора в этом случае не требуется, но если генератор был настроен ранее, может потребоваться перезапустить его, используя test_generator.reset().

Далее я округляю вероятности для получения классов и получаю имена файлов:

# Get classes by np.round
cl = np.round(pred)
# Get filenames (set shuffle=false in generator is important)
filenames=test_generator.filenames

Наконец, результаты могут быть сохранены во фрейме данных:

# Data frame
results=pd.DataFrame({"file":filenames,"pr":pred[:,0], "class":cl[:,0]})
0 голосов
/ 11 сентября 2018

Настоятельно рекомендую сделать родительскую папку в тестовой папке. Затем переместите тестовую папку в родительскую папку.

означает, что если у вас есть тестовая папка таким образом:

/root/test/img1.png
/root/test/img2.png
/root/test/img3.png
/root/test/img4.png

это неправильный способ использовать предикат_генератор. Обновите свою тестовую папку следующим образом:

/root/test_parent/test/img1.png
/root/test_parent/test/img2.png
/root/test_parent/test/img3.png
/root/test_parent/test/img4.png

Используйте эту команду для обновления:

mv /root/test/ ./root/test_parent/test 

И также не забудьте указать путь к модели, подобной этой

"/root/test_parent/"

Этот метод работает для меня.

0 голосов
/ 11 сентября 2018

Итак, в первую очередь тестовые изображения должны быть помещены в отдельную папку внутри тестовой папки. Поэтому в моем случае я создал другую папку внутри папки test и назвал ее all_classes. Затем запустил следующий код:

test_generator = test_datagen.flow_from_directory(
    directory=pred_dir,
    target_size=(28, 28),
    color_mode="rgb",
    batch_size=32,
    class_mode=None,
    shuffle=False
)

Приведенный выше код дает мне вывод:

Найдено 306 изображений, относящихся к 1 классу

И самое главное, вы должны написать следующий код:

test_generator.reset()

иначе будут получены странные результаты. Затем с помощью функции .predict_generator():

pred=cnn.predict_generator(test_generator,verbose=1,steps=306/batch_size)

Запуск приведенного выше кода даст выходные данные с вероятностью, поэтому сначала мне нужно преобразовать их в номер класса. В моем случае это было 4 класса, поэтому номера классов были 0,1,2 и 3.

Код написан:

predicted_class_indices=np.argmax(pred,axis=1)

Следующий шаг - я хочу назвать классы:

labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

Где номера классов будут заменены именами классов. Последний шаг, если вы хотите сохранить его в CSV-файл, расположите его в кадре данных с именами изображений, к которым добавлен предсказанный класс.

filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
                      "Predictions":predictions})

Отображение вашего фрейма данных. Все сделано сейчас. Вы получаете все предсказанные классы для ваших изображений.

0 голосов
/ 11 сентября 2018

Скорее всего, вы делаете ошибку, используя flow_from_directory.Чтение документов:

flow_from_directory (каталог, ...)

Где:

каталог: путь к целевому каталогу.Он должен содержать один подкаталог на класс.Любые изображения PNG, JPG, BMP, PPM или TIF ​​внутри каждого из дерева каталогов подкаталогов будут включены в генератор.

Это означает, что внутри каталога, который вы передаете этой функции, у вас естьсоздавать подкаталоги и размещать изображения внутри этих подкаталогов.В противном случае, когда изображения находятся в каталоге, который вы передаете (а не в подкаталогах), действительно есть 0 изображений и 0 классов.

РЕДАКТИРОВАТЬ

Хорошо, так в случаепредсказания, которое вы хотите выполнить Я полагаю, что вы хотите использовать функцию predict следующим образом: (обратите внимание, что вы должны предоставлять данные в сеть только в том же формате, что и в процессе обучения)

image = img_to_array(load_img(f"{directory}/{foldername}/{filename}"))
# here you prepare the input data, for example here we take the gray image
# gray scale is the 1st channel in the Lab color space
color_me = rgb2lab((1.0 / 255) * color_me)[:, :, 0]
color_me = color_me.reshape(color_me.shape + (1,))
# here data is in the format which is accepted by, in this case, my model
# for your model you have to do the preparation just the same as in the case of learning process
output = model.predict(np.array([color_me]))
# and here you have your predicted output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...