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?
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?
Respostas:
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
diferentes imagens de tamanho correto.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_pad
essa 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.
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.