Classificação de imagens CNN | Classificação de imagens usando CNN

Conteúdo

Introdução

Redes neurais convolucionais (CNN): o conceito por trás dos avanços e desenvolvimentos recentes em aprendizagem profunda.

A CNN quebrou o molde e ascendeu ao trono para se tornar a mais recente tecnologia. visão de computador técnica. Entre os diferentes tipos de Redes neurais (outros incluem redes neurais recorrentes (RNN), memória de curto prazo de longo prazo (LSTM), redes neurais artificiais (ANN), etc.), CNNs são facilmente as mais populares.

Esses modelos de rede neural convolucional são onipresentes no espaço de dados de imagens. Eles funcionam fenomenalmente bem em tarefas de visão computacional, como classificação de imagens, detecção de objeto, reconhecimento de imagem, etc.

Então, Onde você pode praticar suas habilidades na CNN? Nós vamos, Você veio ao lugar certo!

Existem vários conjuntos de dados que você pode aproveitar para aplicar redes neurais convolucionais. Aqui estão três conjuntos de dados populares:

mnist-1-3907316

Neste artigo, vamos criar modelos de classificação de imagem usando CNN em cada um desses conjuntos de dados. Está certo! Vamos explorar o MNSIT, CIFAR-10 e ImageNet para entender, de uma forma prática, como funciona a CNN para a tarefa de classificação de imagens.

Você pode aprender tudo sobre redes neurais convolucionais (CNN) neste curso grátis: Redes neurais convolucionais (CNN) Desde cedo

Minha inspiração para escrever este artigo é ajudar a comunidade a aplicar o conhecimento teórico de maneira prática. Este é um exercício muito importante, pois não só ajuda a desenvolver uma compreensão mais profunda do conceito subjacente, também irá ensinar detalhes práticos que só podem ser aprendidos através da implementação do conceito.

Se você é novo no mundo das redes neurais, CNN, classificação de imagem, Eu recomendo que você siga estes excelentes tutoriais detalhados:

E se você está procurando aprender visão computacional e aprendizado profundo em profundidade, você deve verificar nossos cursos populares:

Tabela de conteúdo

  1. Usando CNN para classificar dígitos manuscritos no conjunto de dados MNIST
  2. Identificação de imagem do conjunto de dados CIFAR-10 usando CNN
  3. Categorização de imagens do conjunto de dados ImageNet usando CNN
  4. Para onde ir a partir daqui?

Observação: Vou usar Keras para demonstrar a classificação de imagens usando CNN neste artigo. Keras é uma excelente estrutura para aprender quando você está apenas começando no aprendizado profundo..

Usando CNN para classificar dígitos manuscritos no conjunto de dados MNIST

mnist-8721761

MNIST (Instituto Nacional de Padrões e Tecnologia Modificado) é um conjunto de dados bem conhecido que é usado em Visão computacional que foi construído por Yann Le Cun et. Alabama. É feito de imagens que são dígitos manuscritos (0-9), dividido em um conjunto de treinamento de 50,000 fotos e um conjunto de teste de 10,000 onde cada imagem tem 28 x 28 largura e altura de pixels.

Este conjunto de dados é freqüentemente usado para praticar qualquer algoritmo criado para classificação de imagens., já que o conjunto de dados é muito fácil de conquistar. Portanto, Eu recomendo que este seja o seu primeiro conjunto de dados se você estiver apenas se aventurando no campo.

MNIST vem com Keras por padrão e você pode simplesmente carregar o trem e testar os arquivos usando algumas linhas de código:

de keras.datasets import mnist

# carregando o conjunto de dados
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# vamos imprimir a forma do conjunto de dados
imprimir("Forma X_train", X_train.shape)
imprimir("forma y_train", y_train.shape)
imprimir("Forma X_test", X_test.shape)
imprimir("forma y_test", y_test.shape)

Aqui está a forma de X (caracteristicas) e e (objetivo) para treinamento e validação de dados:

Forma X_train (60000, 28, 28) 
forma y_train (60000,) 
Forma X_test (10000, 28, 28) 
forma y_test (10000,)

Antes de treinar um modelo CNN, vamos construir um modelo básico Rede neural totalmente conectada para o conjunto de dados. As etapas básicas para construir um modelo de classificação de imagem usando uma rede neural são:

  1. Achate as dimensões da imagem de entrada para 1D (pixels de largura x pixels de altura)
  2. Normalizar valores de pixel de imagem (dividido por 255)
  3. One-Hot Codifique a coluna categórica
  4. Construir uma arquitetura modelo (sequencial) com camadas densas
  5. Treine o modelo e faça previsões

A seguir, mostramos como você pode criar um modelo de rede neural para MNIST. Comentei as partes relevantes do código para melhor compreensão:

Depois de executar o código acima, percebemos que estamos obtendo uma boa precisão de validação de cerca de 97% facilmente.

Vamos modificar o código acima para construir um CNN modelo.

Uma das principais vantagens de usar CNN em vez de NN é que não é necessário nivelar as imagens de entrada para 1D, uma vez que podem trabalhar com dados de imagem 2D. Isso ajuda a manter as propriedades “espacial” das imagens.

Aqui está o código completo para o modelo CNN:

Embora nossa precisão máxima de validação usando um modelo de rede neural simples estivesse em torno 97%, O modelo da CNN é capaz de obter mais do que 98% com uma única camada de convolução.

dwd-5880365

Você pode ir em frente e adicionar mais camadas Conv2D, e também brincar com os hiperparâmetros do modelo CNN.

Identificação de imagem do conjunto de dados CIFAR-10 usando CNN

MNIST é um conjunto de dados amigável para iniciantes em visão computacional. É fácil obter uma pontuação de mais de 90% na validação usando um modelo CNN. Mas, E se você for além de um iniciante e precisar de algo desafiador para colocar seus conceitos em prática?

É onde o Conjunto de dados CIFAR-10 entra em cena!

1_sgochnlz-qfesdyjadgxnw-5399297

Veja como os desenvolvedores por trás do CIFAR (Instituto Canadense de Pesquisa Avançada) descreva o conjunto de dados:

O conjunto de dados CIFAR-10 consiste em 60.000 imagens coloridas de 32 x 32 sobre 10 aulas, com 6.000 imagens por aula. Existem 50.000 imagens de treinamento e 10.000 imagens de teste.

Os pontos importantes que distinguem este conjunto de dados do MNIST são:

  • As imagens são coloridas em CIFAR-10 em comparação com a textura em preto e branco do MNIST
  • Cada imagem é de 32 x 32 píxeis
  • 50.000 imagens de treinamento e 10.000 imagens de teste

Agora, Essas fotos são tiradas em diferentes condições de iluminação e em diferentes ângulos, e como essas são imagens coloridas, você verá que existem muitas variações na própria cor de objetos semelhantes (por exemplo, a cor da água do oceano). Se você usar o simples CNN arquitetura que vimos no exemplo MNIST acima, você obterá uma baixa precisão de validação de cerca de 60%.

Esse é um dos principais motivos pelos quais recomendo o CIFAR-10 como um bom conjunto de dados para praticar suas habilidades de ajuste de hiperparâmetros para a CNN.. O bom é que, como MNIST, CIFAR-10 também está disponível em Keras.

Você pode simplesmente carregar o conjunto de dados usando o seguinte código:

de keras.datasets import cifar10
# carregando o conjunto de dados 
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

A seguir, mostramos como você pode construir um modelo decente da CNN (em volta do 78-80% em validação) para CIFAR-10. Observe como os valores das formas foram atualizados a partir de (28, 28, 1) uma (32, 32, 3) de acordo com o tamanho das imagens:

Isso é o que eu mudei no modelo:

  • Aumentou o número de camadas Conv2D para construir um modelo mais profundo
  • Maior número de filtros para conhecer mais funções
  • Abandono adicionado para regularização
  • Camadas mais densas adicionadas

Precisão de treinamento e validação em todas as idades:

screenshot-from-2020-02-06-12-03-34-5292096

Você pode facilmente ofuscar esse desempenho ajustando o modelo mais antigo. Depois de dominar o CIFAR-10, há também CIFAR-100 disponível em Keras que você pode usar para praticar mais. Uma vez que tem 100 aulas, Não será uma tarefa fácil de realizar!

Categorizar imagens ImageNet usando CNN

Agora que você dominou o MNIST e o CIFAR-10, vamos levar este problema para um nível superior. Aqui, vamos dar uma olhada no famoso conjunto de dados ImageNet.

imagenet-title-pic-6861924

ImageNet é o principal banco de dados por trás do Desafio Recon de grande escala da ImageNet (ILSVRC). Isso é como as olimpíadas Visão computacional. Esta é a competição que fez CNN popular pela primeira vez e todos os anos, as principais equipes de pesquisa da indústria e da academia competem com seus melhores algoritmos em tarefas de visão computacional.

Sobre o conjunto de dados ImageNet

O conjunto de dados ImageNet tem mais de 14 milhões de imagens, rotulado à mão em 20.000 categorias.

O que mais, ao contrário dos conjuntos de dados MNIST e CIFAR-10 que já discutimos, imagens no ImageNet têm resolução decente (224 x 224) e é isso que nos desafia: 14 milhões de imagens, cada um de 224 por 224 píxeis. O processamento de um conjunto de dados deste tamanho requer uma grande quantidade de poder de computação em termos de CPUs, GPU y RAM.

A desvantagem: isso pode ser demais para um laptop comum. Então, Qual é a solução alternativa? Como um entusiasta pode trabalhar com o conjunto de dados ImageNet?

É aí que entra o conjunto de dados Imagenette de Fast.ai.

Imagenette é um conjunto de dados retirado da grande coleção de imagens da ImageNet. A razão por trás do lançamento do Imagenette é que pesquisadores e alunos podem praticar com imagens de nível ImageNet sem a necessidade de tantos recursos de computação..

Nas próprias palavras de Jeremy Howard:

"Mim (Jeremy Howard, quer dizer) Eu criei o Imagenette principalmente porque queria um pequeno conjunto de dados de visão que pudesse usar para ver rapidamente se minhas ideias de algoritmo poderiam ter alguma chance de funcionar. Eles geralmente não, mas testá-los no Imagenet leva muito tempo para descobrir, especialmente porque estou interessado em algoritmos que funcionam particularmente bem no fim de treinamento.

Mas acho que também pode ser um conjunto de dados útil para outros “.

E é isso que também usaremos para praticar!

1. Baixe o conjunto de dados Imagenette

É assim que você pode obter o conjunto de dados (comandos para o seu terminal):

$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz
$ tar -xf imagenette2.tgz

Depois de baixar o conjunto de dados, você notará que tem duas pastas: “Comboio” e “val”. Eles contêm o conjunto de treinamento e validação, respectivamente. Dentro de cada pasta, existem pastas separadas para cada classe. Aqui está o mapeamento das classes:

Essas classes têm o mesmo ID no conjunto de dados ImageNet original. Cada uma das classes tem aproximadamente 1000 imagens, pelo que, em geral, é um conjunto de dados balanceado.

ddd-6836177

2. Carregando imagens com ImageDataGenerator

Keras tem esta funcionalidade útil para carregar imagens grandes (como o que temos aqui) sem maximizar a RAM, fazendo isso em pequenos lotes. ImageDataGenerator em combinação com fit_generator fornece esta funcionalidade:

O próprio ImageDataGenerator deduz os rótulos das classes e o número de classes dos nomes das pastas.

screenshot-from-2020-02-06-11-25-54-6363232

3. Criação de um modelo básico da CNN para classificação de imagens

Vamos construir um modelo CNN básico para nosso conjunto de dados Imagenette (para fins de classificação de imagens):

Quando comparamos a precisão de validação do modelo anterior, vai perceber que, embora seja uma arquitetura mais profunda do que a que usamos até agora, só podemos obter uma precisão de validação de cerca de 40-50%.

mmm-7938868

Pode haver muitas razões para isso, como nosso modelo não é complexo o suficiente para aprender os padrões subjacentes das imagens, ou talvez os dados de treinamento sejam muito pequenos para generalizar com precisão entre as aulas.

Um passo adiante: transferir aprendizagem.

4. Uso de Transfer Learning (VGG16) para melhorar a precisão

VGG16 é uma arquitetura cnn que foi o primeiro finalista no 2014 Desafio ImageNet. É projetado pelo Visual Graphics Group em Oxford e tem 16 camadas totais, com 13 camadas convolucionais. Vamos carregar os pesos previamente treinados deste modelo para que possamos usar os recursos úteis que este modelo aprendeu para nossa tarefa..

Download de pesos VGG16

de keras.applications importar VGG16

# include top should be False to remove the softmax layer
pretrained_model = VGG16(include_top=Falso, pesos ="imagenet")
pretrained_model.summary()

Aqui está a arquitetura do modelo:

mmm-1-7044075

Gerar funções a partir de VGG16

Vamos extrair recursos úteis que o VGG16 já conhece a partir das imagens em nosso conjunto de dados:

from keras.utils import to_categorical
# extract train and val features
vgg_features_train = pretrained_model.predict(Comboio)
vgg_features_val = pretrained_model.predict(val)
# OHE target column
train_target = to_categorical(train.labels)
val_target = to_categorical(val.labels)
Una vez que las funciones anteriores estén listas, podemos usá-los para treinar um sistema totalmente conectado Neuronal vermelho e Keras:

Observe a rapidez com que seu modelo começa a convergir. Em solo 10 épocas, tem uma precisão de validação de mais de 94%. Não é incrível?

screenshot-from-2020-02-06-11-56-11-9911896

Caso você tenha dominado o conjunto de dados Imagenette, fastai também lançou duas variantes que incluem classes que você achará difícil de classificar:

  • Imagewoof: 10 tipos de raças de cães, um problema mais difícil de classificar
  • Imagen Net (“wang”): Uma combinação de Imagenette e Imagewoof e alguns truques que tornam o problema mais complicado

Para onde ir a partir daqui?

Além dos conjuntos de dados que mencionamos acima, Você também pode usar os seguintes conjuntos de dados para criar visão de computador algoritmos. De fato, considere isso um desafio. Você pode aplicar seu conhecimento CNN para bater a pontuação de referência nesses conjuntos de dados?

  • Moda MNIST – Conjunto de dados do tipo MNIST para roupas e vestuários. Em vez de dígitos, as fotos mostram um tipo de roupa (Camisa, calça, Bolsa, etc.)
  • Caltech 101 – Outro conjunto de dados desafiador que encontrei para classificação de imagens

Eu também sugiro que antes de optar por transferência de aprendizagem, tente melhorar seus modelos básicos da CNN. Você pode aprender com as arquiteturas VGG16, ZFNet, etc. para obter algumas dicas sobre ajuste de hiperparâmetros e você pode usar o mesmo ImageDataGenerator para ampliar suas imagens e aumentar o tamanho do conjunto de dados.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.