Digamos que você tenha um csv, de modo que suas imagens e outros recursos estejam no arquivo.
em que id representa o nome da imagem, seguido pelos recursos e seguido pelo seu destino (classe para classificação, número para regeressão)
primeiro vamos definir um gerador de dados e depois podemos substituí-lo.
vamos ler os dados do csv em um dataframe do pandas e usar o flow_from_dataframe de keras para ler o dataframe.
df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(df,directory="out/",x_col="id",y_col=df.columns[1:],class_mode="raw",batch_size=1)
Você sempre pode adicionar seu aumento no ImageDataGenerator.
O que deve ser observado no código acima em flow_from_dataframe é
x_col = o nome da imagem
y_col = normalmente colunas com o nome da classe, mas vamos substituí-lo mais tarde fornecendo primeiro todas as outras colunas no csv. ou seja, feat_1, feat_2 .... até o class_label
class_mode = raw, sugira que o gerador retorne todos os valores em y como estão.
Agora, vamos substituir / herdar o gerador acima e criar um novo, de forma que ele retorne [img, otherfeatures], [target]
Aqui está o código com comentários como explicações
def my_custom_generator():
count = 0 #to keep track of complete epoch
while True:
if(count==len(df.index)):
#if the count is matching with the length of df, the one pass is completed, so reset the generator
generator.reset()
break
count+=1
data = generator.next() #get the data from the generator
#the data looks like this [[img,img] , [other_cols,other_cols]] based on the batch size
imgs = []
cols = []
targets = []
#iterate the data and append the necessary columns in the corresponding arrays
for k in range(batch_size):
imgs.append(data[0][k]) #the first array contains all images
cols.append(data[1][k][:-1]) #the second array contains all features with last column as class, so [:-1]
targets.append(data[1][k][-1]) #the last column in the second array from data is the class
yield [imgs,cols],targets #this will yield the result as you expect.
crie função semelhante para o seu gerador de validação. Use train_test_split para dividir seu quadro de dados, se necessário, e criar 2 geradores e substituí-los.
passe a função no model.fit_generator como este
model.fit_generator(my_custom_generator(),.....other params)
flow
ou precisaflow_from_directory
? (flow
significa que você pode manter todas as imagens carregadas na memória)