como formatar os dados da imagem para treinamento / previsão quando as imagens são diferentes em tamanho?

87

Estou tentando treinar meu modelo que classifica imagens. O problema que tenho é que eles têm tamanhos diferentes. como devo formatar minhas imagens / ou arquitetura do modelo?

Asif Mohammed
fonte
2
Mostre o que você tentou até agora e o que parece não estar funcionando para você.
Keith John Hutchison
16
E bam lá se vai o código do Inception v4. Eu discordo desse comentário comercial. Um pouco mais de entrada seria bom - como de que tipo de rede estamos falando - mas os votos negativos não são justificados de forma alguma. Esse é um problema real aí.
sol em
4
A questão é como o ImageNet formata seus dados de imagem para serem úteis para o treinamento?
mskw de

Respostas:

147

Você não disse de que arquitetura está falando. Como você disse que deseja classificar as imagens, presumo que seja uma rede parcialmente convolucional e parcialmente conectada como AlexNet, GoogLeNet etc. Em geral, a resposta à sua pergunta depende do tipo de rede com a qual você está trabalhando.

Se, por exemplo, sua rede contém apenas unidades convolucionais - ou seja, não contém camadas totalmente conectadas - ela pode ser invariável para o tamanho da imagem de entrada. Tal rede poderia processar as imagens de entrada e, por sua vez, retornar outra imagem ("totalmente convolucional"); você teria que ter certeza de que a saída corresponde ao que você espera, já que você tem que determinar a perda de alguma forma, é claro.

Porém, se você estiver usando unidades totalmente conectadas, terá problemas: aqui você tem um número fixo de pesos aprendidos com os quais sua rede deve trabalhar, portanto, entradas variáveis ​​exigiriam um número variável de pesos - e isso não é possível.

Se esse for o seu problema, aqui estão algumas coisas que você pode fazer:

  • Não se preocupe em esmagar as imagens. Uma rede pode aprender a entender o conteúdo de qualquer maneira; escala e perspectiva significam alguma coisa para o conteúdo?
  • Corte as imagens no centro para um tamanho específico. Se você tem medo de perder dados, faça vários cortes e use-os para aumentar seus dados de entrada, de modo que a imagem original seja dividida em Ndiferentes imagens de tamanho correto.
  • Encha as imagens com uma cor sólida até um tamanho quadrado e redimensione.
  • Faça uma combinação disso.

A opção de preenchimento pode introduzir uma fonte de erro adicional para a previsão da rede, já que a rede pode (leia-se: provavelmente será) tendenciosa para imagens que contenham essa borda preenchida. Se você precisar de algumas ideias, dê uma olhada na seção Imagens da documentação do TensorFlow, há peças como resize_image_with_crop_or_padessa que levam ao trabalho maior.

Quanto a simplesmente não se importar com a compactação, aqui está um pedaço do pipeline de pré-processamento da famosa rede Inception:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Eles estão totalmente cientes disso e o fazem de qualquer maneira.

Dependendo de quão longe você deseja ou precisa ir, existe um artigo aqui chamado Spatial Pyramid Pooling em Deep Convolution Networks para Visual Recognition que lida com entradas de tamanhos arbitrários processando-as de uma maneira muito especial.

lado do sol
fonte
11
Este tópico parece muito mais complicado quando você está lidando com detecção de objeto e segmentação de instância, porque os tamanhos da caixa de âncora que também são hiperparâmetros precisam ser ajustados se você tiver um conjunto de dados com alta variação nos tamanhos de imagem.
CMCDragonkai
As relações de aspecto desempenham um papel muito importante para uma rede que distingue entre círculos e elipses.
HelloGoodbye
1
Outra observação geral é que os lotes não precisam necessariamente ter as mesmas dimensões; o primeiro lote pode lidar com imagens 4: 3, o segundo com 16: 9 etc., desde que as camadas densas sejam cuidadas.
sol
1
@Tobitor, sempre faça as entradas da rede o mais próximo possível dos dados reais (teste ou tempo de inferência). Se todas as suas imagens forem muito mais largas do que altas, você também deve modelar sua rede para processar suas imagens desta forma. Dito isso, se você não puder dizer como serão os seus dados de "uso", você terá que fazer alguns sacrifícios durante o treinamento. E, nesse caso, redimensionar uma imagem de 1000x200 para 256x256 é geralmente aceitável (imagine olhar para aquela placa em um ângulo de 60 graus - é quase um quadrado agora).
sol,
2
@Tobitor Não há nenhum requisito para que as imagens sejam quadradas, apenas acontece que é a troca menos ruim se você não souber os tamanhos reais das imagens durante a inferência. : ^) Quanto ao tamanho, quanto menor melhor, mas as imagens precisam ser grandes o suficiente para ainda capturar os melhores detalhes necessários - de modo geral, apenas tenha em mente que se você, como um especialista humano, não puder determinar o que está no imagem, a rede também não conseguirá.
sol
11

Tente fazer uma camada de pooling da pirâmide espacial. Em seguida, coloque-o após sua última camada de convolução para que as camadas FC sempre obtenham vetores dimensionais constantes como entrada. Durante o treinamento, treine as imagens de todo o conjunto de dados usando um tamanho de imagem específico para uma época. Então, para a próxima época, mude para um tamanho de imagem diferente e continue o treinamento.

Pranay Mukherjee
fonte
Você poderia elaborar um pouco sobre o que é "pooling da pirâmide espacial" comparado ao pool regular?
Matthieu
leia o agrupamento da pirâmide espacial em redes convolucionais profundas para reconhecimento visual em blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed