Как назначить метки для образцов, созданных в ImageDataGenerator - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в Convolutional Neural Networks и собираюсь создать свою первую ConvNet, которая представляет собой многоклассовую классификацию изображений ConvNet.

Описание модели

Допустим, у меня есть две папки с изображениями, одна из которых содержит несколько тысяч изображений листьев определенного типа (Листья A) (Набор изображений X), а другая папка содержит такое же количество изображений листьев подобного типа (Листья B) ( Изображение установлено Y). Поэтому мне нужно обучить свою модель различать эти два типа.

Фон проблемы

Поскольку у меня есть два класса выходов Leaves A и Leaves B, у меня либо 0,1 в качестве вывода, либо 1,0 в качестве выхода для данного изображения класса Leaves A или класса Leaves B.

                            Leaves A | Leaves B
If Input is a Class A Leaf,     1         0
If Input is a Class B Leaf,     0         1

Задача

Так, чтобы сделать это, я должен пометить мой набор изображений X, чтобы иметь выходной сигнал 1,0, и набор изображений Y, чтобы иметь выходной сигнал 0,1. Кроме того, поскольку мне нужно увеличивать изображения, чтобы получить больше обучающих образцов, я использовал ImageDataGenerator.

training_imGen.flow_from_directory(
                                'path/to/image_folder_X',
                                target_size=(1100,180),
                                batch_size=batchSize,
                                color_mode='rgb',
                                class_mode='categorical'
                                )

Но здесь я не могу назначить ярлык. Не так, как когда я использую training_imGen.flow. Однако я обнаружил, что classes параметр может быть вызван в flow_from_directory,

classes: optional list of class subdirectories (e.g. ['dogs', 'cats']). Default: None. If not provided, the list of classes will be automatically inferred from the subdirectory names/structure under directory, where each subdirectory will be treated as a different class (and the order of the classes, which will map to the label indices, will be alphanumeric).

Но я не знаю, как указать там две метки класса, поскольку я даю только путь к папке image set X. Есть идеи как это сделать?

Обновление

training_imGen.flow_from_directory(
                                '/Users/user/database/',
                                target_size=(1100,180),                                                 
                                batch_size=batchSize,
                                color_mode='rgb',
                                class_mode='categorical',
                                classes=['Set_A', 'Set_B']
                                )

В пути /Users/user/database/ есть две папки с именами Set_A и Set_B. Как я уже упоминал, каждая папка содержит связанные файлы изображений PNG.

1 Ответ

0 голосов
/ 30 апреля 2018

Проверьте, как реализовано DirectoryIterator . Это очень простой класс.

ImageDataGenerator#flow_from_directory - это просто оболочка для DirectoryIterator конструкции объекта. Вам не нужно указывать метки вручную, поскольку DirectoryIterator автоматически предполагает, что каждый образец связан с классом, названным в честь родительской папки этого образца. Таким образом, до тех пор, пока все образцы листьев A находятся в одной папке с именем A, а образцы листьев B находятся в другой папке, они будут правильно назначены соответствующим классам.

Кроме того, вывод итератора будет уже в горячем виде, как вы определили class_mode как categorical:

g = ImageDataGenerator()
train = g.flow_from_directory('/path/to/dataset/train/',
                              batch_size=32,
                              target_size=(1100, 180))

x_batch, y_batch = next(train)
assert x_batch.shape == (32, 1100, 180, 3) 
assert y_batch.shape == (32, 2)
print(y_batch)
[[0. 1.],
 [1. 0.],
 [1. 0.],
 ...
 [0. 1.]]

Параметр classes используется не для установки меток каждого образца, а вместо этого для указания списка подпапок directory, которые этот итератор должен рассматривать как классы (например, ['A', 'B']). Если оставить значение по умолчанию None, то все подпапки directory будут считаться действительными классами, и все изображения внутри них являются потенциальными выборками для набора. Это полезно, когда вы хотите работать только с подмножеством меток, отлаживать свой код или блокировать классы.

Если вы хотите переопределить метку по умолчанию, вы можете просто заменить содержимое в DirectoryIterator#classes, которое содержит класс, связанный с образцом ith в его элементе ith. Например, допустим, вы хотите добавить третий класс листьев, с которым нет связанной папки:

train = g.flow_from_directory(...)
train.classes = np.asarray([0., 1., 2., ..., 0., 1.])
train.class_indices = {'A': 0, 'B': 1, 'C': 2}
train.num_classes = 3
...