Como preparar / aumentar imagens para redes neurais?

41

Eu gostaria de usar uma rede neural para classificação de imagens. Vou começar com o CaffeNet pré-treinado e treiná-lo para o meu aplicativo.

Como devo preparar as imagens de entrada?

Nesse caso, todas as imagens são do mesmo objeto, mas com variações (pense: controle de qualidade). Eles estão em escalas / resoluções / distâncias / condições de iluminação um pouco diferentes (e em muitos casos eu não conheço a escala). Além disso, em cada imagem há uma área (conhecida) ao redor do objeto de interesse que deve ser ignorada pela rede.

Eu poderia (por exemplo) cortar o centro de cada imagem, que é garantido que contém uma parte do objeto de interesse e nenhuma área ignorada; mas parece que isso descartaria informações e também os resultados não seriam realmente da mesma escala (talvez uma variação de 1,5x).

Aumento do conjunto de dados

Já ouvi falar em criar mais dados de treinamento por meio de recorte aleatório / espelho / etc, existe um método padrão para isso? Algum resultado em quanta melhoria ela produz na precisão do classificador?

Alex I
fonte

Respostas:

35

A idéia da Neural Networks é que eles precisam de pouco pré-processamento, uma vez que o trabalho pesado é feito pelo algoritmo responsável por aprender os recursos.

Os vencedores do Data Science Bowl 2015 têm uma excelente descrição em relação à sua abordagem; portanto, a maior parte do conteúdo desta resposta foi extraída de: Classificação de plâncton com redes neurais profundas . Eu sugiro que você leia, especialmente a parte sobre pré-processamento e aumento de dados .

- Redimensionar imagens

Quanto aos tamanhos, resoluções ou distâncias diferentes, você pode fazer o seguinte. Você pode simplesmente redimensionar o lado maior de cada imagem para um comprimento fixo.

Outra opção é usar o openCV ou o scipy. e isso redimensionará a imagem para ter 100 colunas (largura) e 50 linhas (altura):

resized_image = cv2.resize(image, (100, 50)) 

Ainda outra opção é usar o scipy module, usando:

small = scipy.misc.imresize(image, 0.5)

- Aumento de dados

O aumento de dados sempre melhora o desempenho, embora a quantidade dependa do conjunto de dados. Se você deseja aumentar os dados para aumentar artificialmente o tamanho do conjunto de dados, faça o seguinte, se for o caso (não seria aplicável, por exemplo, imagens de casas ou pessoas nas quais, se você girá-los em 180 graus, eles perderão todas as informações mas não se você os girar como um espelho):

  • rotação: aleatória com ângulo entre 0 ° e 360 ​​° (uniforme)
  • tradução: aleatória com deslocamento entre -10 e 10 pixels (uniforme)
  • redimensionamento: aleatório com fator de escala entre 1 / 1,6 e 1,6 (uniforme de log)
  • inversão: sim ou não (bernoulli)
  • cisalhamento: aleatório com ângulo entre -20 ° e 20 ° (uniforme)
  • alongamento: aleatório com fator de alongamento entre 1 / 1,3 e 1,3 (uniforme de log)

Você pode ver os resultados nas imagens do Data Science bowl.

Imagens pré-processadas

Imagens pré-processadas

versões aumentadas das mesmas imagens

insira a descrição da imagem aqui

-Outras técnicas

Elas lidam com outras propriedades da imagem, como iluminação, e já estão relacionadas ao algoritmo principal, mais como uma simples etapa de pré-processamento. Confira a lista completa em: Tutorial da UFLDL

wacax
fonte
1
Também vale a pena observar as cores para aumentar os dados.
David C. Bishop
Você também pode compartilhar o código para rotação e cisalhamento etc? @wacax
Arsenal Fanatic
Vocês podem usar um pacote como o keras para aumentar os dados.
Ricardo Cruz
2
Para qualquer pessoa que tenha problemas com a importação do módulo scipy.misc. Você precisa import scipy.misc. stackoverflow.com/questions/13581593/…
eleijonmarck 26/06
Quanto ao redimensionamento de imagens, que método é geralmente usado nos métodos mais avançados, por exemplo, aqueles usados ​​no ImageNet?
hellogoodbye
2

Embora a resposta de wacax seja completa e realmente explicativa, gostaria de acrescentar algumas coisas, caso alguém se depare com essa resposta.

Primeiro de tudo, mais scipy.miscfunções relacionadas imagem ( imread, imsave, imresizeerc) tornaram-se obsoleto em favor de qualquer ImageIO ou skimage .

Em segundo lugar, eu recomendaria fortemente a imgaug da biblioteca python para qualquer tarefa de aumento. É realmente fácil de usar e possui praticamente todas as técnicas de aumento que você pode querer usar.

John Doe
fonte