Ieraser Keras com imagens aumentadas e outros recursos


8

Digamos que você tenha um conjunto de dados com imagens e alguns dados em um .csvpara cada imagem. Seu objetivo é criar um NN que tenha um ramo de convolução e outro (no meu caso, um MLP).

Agora, existem muitos guias ( um aqui , outro ) sobre como criar a rede, esse não é o problema.

O problema aqui é como criar um iterador na forma de [[convolution_input, other_features], target]quando convolution_inputé de um fluxo Keras que adiciona imagens aumentadas.ImageDataGenerator

Mais especificamente, quando a n-ésima imagem (que pode ser uma imagem aumentada ou não) é alimentada para o NN, quero que seus recursos sejam originais other_features.

Encontrei poucas tentativas ( aqui e aqui , a segunda parecia promissora, mas não consegui descobrir como lidar com imagens aumentadas) ao fazer exatamente isso, mas elas não parecem levar em conta a possível manipulação de conjunto de dados que o gerador Keras faz.


1
Pergunta: você está de acordo flowou precisa flow_from_directory? ( flowsignifica que você pode manter todas as imagens carregadas na memória)
Daniel Möller

Bem, eu só quero um fluxo que lide automaticamente com a transformação de imagens. No meu caso, eu estava usando, flow_from_dataframejá que tenho nomes de arquivos, recursos e classes
Lamberto Basti

Respostas:


3

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)

insira a descrição da imagem aqui

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)

Mas como if(count==len(df.index))acompanhar a época se o conjunto de dados aumentado é muito mais numeroso que o original?
Lamberto Basti 7/03

1
Aumentos são aplicados de maneira uniforme às imagens. Ele não aumentará o número de imagens, a menos que você as salve separadamente e a use como uma instância exclusiva no conjunto de treinamento. Como o aumento é útil durante cada época O aumento diferente é aplicado aleatoriamente, fazendo com que pareça imagens diferentes
venkata krishnan

Uau, isso é uma informação enorme. Eu recomendo adicioná-lo à resposta também. Além disso, por que essas informações importantes não são escritas explicitamente na documentação do Keras?
Lamberto Basti

1
Até eu mesmo imaginei, porque quando mencionamos etapas por época do treinamento, geralmente dividimos a duração do treinamento pelo tamanho do lote, o que significa que, em uma época, ele passa todas as imagens apenas uma vez. Espero estar certo ..
venkata krishnan 08/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.