python - pyimagesearch - santa not santa keras
¿Cómo especificar manualmente las etiquetas de clase en keras flow_from_directory? (2)
Problema: estoy entrenando un modelo para el reconocimiento de imágenes de varias etiquetas. Por lo tanto, mis imágenes están asociadas con múltiples etiquetas y. Esto está en conflicto con el conveniente método keras "flow_from_directory" del ImageDataGenerator, donde se supone que cada imagen está en la carpeta de la etiqueta correspondiente ( https://keras.io/preprocessing/image/ ).
Solución alternativa: Actualmente, estoy leyendo todas las imágenes en una matriz numpy y utilizo la función de "flujo" desde allí. Pero esto resulta en cargas de memoria pesadas y un proceso de lectura lento.
Pregunta: ¿Hay alguna forma de usar el método "directorio_de_flujo" y de suministrar manualmente las etiquetas de clase (múltiples)?
Actualización : terminé extendiendo la clase DirectoryIterator para el caso de varias etiquetas. Ahora puede establecer el atributo "class_mode" en el valor "multilabel" y proporcionar un diccionario "multlabel_classes" que asigna nombres de archivos a sus etiquetas. Código: https://github.com/tholor/keras/commit/29ceafca3c4792cb480829c5768510e4bdb489c5
Podría escribir una clase de generador personalizado que lea los archivos desde el directorio y aplique el etiquetado. Ese generador personalizado también podría incluir una instancia de ImageDataGenerator que produciría los lotes utilizando flow ().
Estoy imaginando algo como esto:
class Generator():
def __init__(self, X, Y, img_data_gen, batch_size):
self.X = X
self.Y = Y # Maybe a file that has the appropriate label mapping?
self.img_data_gen = img_data_gen # The ImageDataGenerator Instance
self.batch_size = batch_size
def apply_labels(self):
# Code to apply labels to each sample based on self.X and self.Y
def get_next_batch(self):
"""Get the next training batch"""
self.img_data_gen.flow(self.X, self.Y, self.batch_size)
Entonces simplemente:
img_gen = ImageDataGenerator(...)
gen = Generator(X, Y, img_gen, 128)
model.fit_generator(gen.get_next_batch(), ...)
* Descargo de responsabilidad: en realidad no he probado esto, pero debería funcionar en teoría.
Simplemente puede usar el flow_from_directory
y extenderlo a una multiclase de la siguiente manera:
def multiclass_flow_from_directory(flow_from_directory_gen, multiclasses_getter):
for x, y in flow_from_directory_gen:
yield x, multiclasses_getter(x, y)
Donde multiclasses_getter
está asignando un vector multiclase / su representación multiclase a sus imágenes. Tenga en cuenta que x
no son solo ejemplos, sino lotes de ejemplos, por lo que esto debería incluirse en su diseño multiclasses_getter
.