- Introdução
- Tabela de Conteúdos
- Usar CNNs para Classificar Dígitos Escritos à Mão no Conjunto de Dados MNIST
- Identificando imagens do conjunto de dados CIFAR-10 usando CNNs
- Aqui está o que eu mudei no modelo:
- Categorizando as Imagens da ImageNet usando CNNs
- Sobre o conjunto de dados ImageNet
- É aí que entra o conjunto de dados Imagenette do Fast.ai
- Download the Imagenette Dataset
- Loading Images using ImageDataGenerator
- Construindo um modelo básico CNN para Classificação de Imagens
- Using Transfer Learning (VGGG16) to improve accuracy
- Downloading weights of VGG16
- Gerar características da VGGG16
- Onde ir a partir daqui?
Introdução
Redes Neurais Convolucionais (CNN) – o conceito por trás dos recentes avanços e desenvolvimentos no aprendizado profundo.
CNNs quebraram o molde e ascenderam ao trono para se tornarem a técnica de visão computacional de última geração. Entre os diferentes tipos de redes neurais (outros incluem redes neurais recorrentes (RNN), memória de curto prazo (LSTM), redes neurais artificiais (ANN), etc.), as CNNs são facilmente as mais populares.
Esses modelos de redes neurais convolucionais são onipresentes no espaço de dados de imagem. Eles funcionam fenomenalmente bem em tarefas de visão por computador como classificação de imagens, detecção de objetos, reconhecimento de imagens, etc.
Então – onde você pode praticar suas habilidades CNNs? Bem, 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
- CIFAR-10
- ImageNet
Neste artigo, estaremos construindo modelos de classificação de imagens usando CNN em cada um desses conjuntos de dados. É isso mesmo! Vamos explorar MNSIT, CIFAR-10, e ImageNet para entender, de forma prática, como funcionam as CNNs para a tarefa de classificação de imagens.
Você pode aprender tudo sobre Redes Neurais Convolucionais (CNN) neste curso gratuito: Convolutional Neural Networks (CNN) from Scratch
A minha inspiração para escrever este artigo é ajudar a comunidade a aplicar os conhecimentos teóricos de uma forma prática. Este é um exercício muito importante pois não só o ajudará a construir uma compreensão mais profunda do conceito subjacente, mas também lhe ensinará detalhes práticos que só podem ser aprendidos através da implementação do conceito.
Se você é novo no mundo das redes neurais, CNNs, classificação de imagens, recomendo passar por estes excelentes tutoriais em profundidade:
- Introdução às Redes Neurais (Curso Gratuito!)
- Demistificar a Matemática por trás das Redes Neurais Convolucionais (CNNs)
- Build your First Image Classification Model in just 10 Minutes
E se você está procurando aprender visão computacional e profunda aprendizagem em profundidade, você deve conferir nossos cursos populares:
- Visão por computador usando Aprendizagem Profunda
- AI certificada & Programa ML Blackbelt+
Tabela de Conteúdos
- Utilizar CNNs para Classificar a Mão…Dígitos escritos em MNIST Dataset
- Identificando Imagens do Dataset CIFAR-10 usando CNNs
- Categorizando Imagens do Dataset ImageNet usando CNNs
- Para onde ir a partir daqui?
Nota: Eu estarei usando Keras para demonstrar a classificação de imagens usando CNNs neste artigo. Keras é uma excelente estrutura para aprender quando você está começando no aprendizado profundo.
Usar CNNs para Classificar Dígitos Escritos à Mão no Conjunto de Dados MNIST
MNIST (Modified National Institute of Standards and Technology) é um bem conhecido conjunto de dados usado em Computer Vision que foi construído por Yann Le Cun et. al. É composto de imagens que são dígitos escritos à mão (0-9), divididos em um conjunto de treinamento de 50.000 imagens e um conjunto de teste de 10.000, onde cada imagem tem 28 x 28 pixels de largura e altura.
Este conjunto de dados é frequentemente usado para praticar qualquer algoritmo feito para classificação de imagens, já que o conjunto de dados é bastante fácil de conquistar. Portanto, eu recomendo que este seja o seu primeiro conjunto de dados se você estiver apenas forçando no campo.
MNIST vem com Keras por padrão e você pode simplesmente carregar os arquivos de treinamento e teste usando algumas linhas de código:
Aqui está a forma de X (características) e y (alvo) para os dados de treinamento e validação:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Antes de treinarmos um modelo CNN, vamos construir uma Rede Neural Básica Totalmente Conectada para o conjunto de dados. Os passos básicos para construir um modelo de classificação de imagens usando uma rede neural são:
- Flacionar as dimensões da imagem de entrada para 1D (pixels de largura x pixels de altura)
- Normalizar os valores dos pixels da imagem (dividir por 255)
- Um-Hot Encode a coluna categórica
- Build a model architecture (Sequential) with Dense layers
- Treinar o modelo e fazer previsões
Aqui está como você pode construir um modelo de rede neural para MNIST. Comentei as partes relevantes do código para melhor entendimento:
Depois de executar o código acima, você percebeu que estamos obtendo uma boa precisão de validação de cerca de 97% facilmente.
Vamos modificar o código acima para construir um modelo CNN.
Uma grande vantagem de usar CNNs sobre NNs é que você não precisa aplanar as imagens de entrada para 1D pois elas são capazes de trabalhar com dados de imagem em 2D. Isto ajuda a manter as propriedades “espaciais” das imagens.
Aqui está o código completo para o modelo CNN:
Even embora a nossa precisão máxima de validação usando um modelo de rede neural simples fosse de cerca de 97%, o modelo CNN é capaz de obter 98%+ com apenas uma única camada de convolução!
Você pode ir em frente e adicionar mais camadas Conv2D, e também brincar com os hiperparâmetros do modelo CNN.
Identificando imagens do conjunto de dados CIFAR-10 usando CNNs
MNIST é um conjunto de dados amigável para iniciantes em visão computador. É fácil marcar mais de 90% na validação, usando um modelo CNN. Mas e se você estiver além de iniciante e precisar de algo desafiador para colocar seus conceitos em uso?
É aí que o conjunto de dados CIFAR-10 entra em cena!
Aí está como os desenvolvedores por trás do CIFAR (Canadian Institute For Advanced Research) descrevem o conjunto de dados:
O conjunto de dados CIFAR-10 consiste em 60.000 imagens coloridas de 32 x 32 em 10 classes, com 6.000 imagens por classe. Há 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 no CIFAR-10 em comparação com a textura preta e branca do MNIST
- Cada imagem é 32 x 32 pixel
- 50.000 imagens de treino e 10.000 imagens de teste
Agora, estas imagens são tiradas em diferentes condições de iluminação e em diferentes ângulos, e como são imagens coloridas, você verá que há muitas variações na própria cor de objetos similares (por exemplo, a cor da água do mar). Se você usar a arquitetura CNN simples que vimos no exemplo MNIST acima, você terá uma baixa precisão de validação de cerca de 60%.
Essa é uma razão chave pela qual eu recomendo o CIFAR-10 como um bom conjunto de dados para praticar suas habilidades de ajuste do hiperparâmetro para CNNs. O bom é que assim como o MNIST, o CIFAR-10 também está facilmente disponível em Keras.
Você pode simplesmente carregar o conjunto de dados usando o seguinte código:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Aqui está como você pode construir um modelo CNN decente (cerca de 78-80% na validação) para o CIFAR-10. Observe como os valores das formas foram atualizados de (28, 28, 1) para (32, 32, 3) de acordo com o tamanho das imagens:
Aqui está o que eu mudei no modelo:
- Aumentado o número de camadas Conv2D para construir um modelo mais profundo
- Aumentado o número de filtros para aprender mais características
- Adicionado dropout para regularização
- Adicionado mais camadas densas
Exactidão de treino e validação ao longo das épocas:
Você pode facilmente eclipsar esta performance ao afinar o modelo acima. Uma vez que você tenha dominado o CIFAR-10, há também o CIFAR-100 disponível em Keras que você pode usar para a prática posterior. Como tem 100 classes, não será uma tarefa fácil de alcançar!
Categorizando as Imagens da ImageNet usando CNNs
Agora que você dominou MNIST e CIFAR-10, vamos levar este problema um pouco mais longe. Aqui, vamos dar uma olhada no famoso conjunto de dados ImageNet.
ImageNet é a principal base de dados por trás do Desafio de Reconhecimento em Grande Escala ImageNet (ILSVRC). Isto é como as Olimpíadas de Visão por Computador. Esta é a competição que tornou as CNNs populares pela primeira vez e todos os anos, as melhores equipes de pesquisa entre indústrias e 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, etiquetadas à mão em 20.000 categorias.
>
Tanto, ao contrário dos conjuntos de dados MNIST e CIFAR-10 que já discutimos, as imagens na ImageNet são de resolução decente (224 x 224) e isso é o que nos coloca um desafio: 14 milhões de imagens, cada uma com 224 por 224 pixels. O processamento de um conjunto de dados desse tamanho requer uma grande quantidade de poder de computação em termos de CPU, GPU e RAM.
O lado negativo – isso pode ser demais para um laptop do dia-a-dia. Então, qual é a solução alternativa? Como pode um entusiasta trabalhar com o conjunto de dados ImageNet?
É aí que entra o conjunto de dados Imagenette do Fast.ai
Imagenette é um conjunto de dados extraído da grande colecção de imagens ImageNet. A razão por trás do lançamento da Imagenette é que pesquisadores e estudantes podem praticar em imagens de nível ImageNet sem precisar de tantos recursos computacionais.
Nas palavras do próprio Jeremy Howard:
“Eu (Jeremy Howard, isto é) fiz principalmente Imagenette porque queria um pequeno conjunto de dados de visão que eu pudesse usar para ver rapidamente se minhas idéias de algoritmos poderiam ter uma chance de funcionar. Normalmente não funcionam, mas testá-las no Imagenet leva muito tempo para eu descobrir isso, especialmente porque estou interessado em algoritmos que funcionam particularmente bem no final do treinamento.
Mas acho que este pode ser um conjunto de dados útil também para outros.”
E é isso que também vamos usar para praticar!
Download the Imagenette Dataset
Aqui está como você pode pegar o conjunto de dados (comandos para o seu terminal):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
Após ter baixado o conjunto de dados, você vai notar que ele tem duas pastas – “train” e “val”. Estas 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:
Estas classes têm o mesmo ID no conjunto de dados original da ImageNet. Cada uma das classes tem aproximadamente 1000 imagens, de modo geral, é um conjunto de dados equilibrado.
Loading Images using ImageDataGenerator
Keras tem esta funcionalidade útil para carregar imagens grandes (como temos aqui) sem maximizar a RAM, fazendo-o em lotes pequenos. ImageDataGenerator em combinação com fit_generator fornece esta funcionalidade:
O próprio ImageDataGenerator inferencia as etiquetas das classes e o número de classes a partir dos nomes das pastas.
Construindo um modelo básico CNN para Classificação de Imagens
Construamos um modelo básico CNN para o nosso conjunto de dados Imagenette (para fins de classificação de imagens):
Quando comparamos a exatidão de validação do modelo acima, você perceberá que mesmo sendo uma arquitetura mais profunda do que a que utilizamos até agora, só somos capazes de obter uma exatidão de validação de cerca de 40-50%.
Existem muitas razões para isso, como o nosso modelo não é suficientemente complexo para aprender os padrões subjacentes das imagens, ou talvez os dados de treinamento sejam muito pequenos para generalizar com precisão nas aulas.
Step up – transfer learning.
Using Transfer Learning (VGGG16) to improve accuracy
VGGG16 é uma arquitetura CNN que foi a primeira classificada no Desafio ImageNet 2014. Foi concebida pelo Visual Graphics Group de Oxford e tem 16 camadas no total, com 13 camadas convolucionais. Vamos carregar os pesos pré-treinados deste modelo para que possamos utilizar as características úteis que este modelo aprendeu para a nossa tarefa.
Downloading weights of VGG16
from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
Gerar características da VGGG16
Deixamos extrair características úteis que a VGG16 já conhece das imagens do nosso conjunto de dados:
from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
Note como seu modelo começa a convergir rapidamente. Em apenas 10 épocas, você tem uma precisão de validação de 94%+. Não é fantástico?
Caso tenha dominado o conjunto de dados Imagenette, o fastai também lançou duas variantes que incluem classes que você vai achar difícil de classificar:
- Imagewoof: 10 classes de raças de cães, um problema mais difícil de classificar
- Image网 (“wang”): Uma combinação de Imagenette e Imagewoof e alguns truques que o tornam um problema mais difícil
Onde ir a partir daqui?
Uma parte dos conjuntos de dados que temos acima, você também pode usar os conjuntos de dados abaixo para construir algoritmos de visão por computador. Na verdade, considere isto um desafio. Você pode aplicar o seu conhecimento CNN para bater a pontuação de referência nestes conjuntos de dados?
- Moda MNIST – conjunto de dados do tipo MNIST de roupas e vestuário. Ao invés de dígitos, as imagens mostram um tipo de vestuário (camiseta, 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 ir para a aprendizagem de transferência, tente melhorar seus modelos CNN base. Você pode aprender com as arquiteturas da VGG16, ZFNet, etc. para algumas dicas de ajuste do hiperparâmetro e você pode usar o mesmo ImageDataGenerator para aumentar suas imagens e aumentar o tamanho do conjunto de dados.
Você também pode ler este artigo no nosso APP Móvel