Categorias
Algoritmo Deep Learning Reconhecimento de imagem Redes Neurais

Aprenda a Criar e Treinar Uma Rede Neural Convolucional (CNN)

As redes neurais convolucionais (CNN) se utilizam de uma arquitetura especial que é particularmente bem adequada para classificar imagens. O uso dessa arquitetura torna as redes convolucionais rápidas de treinar, o que é vantajoso para trabalhar com redes profundas. Hoje, a CNN ,ou alguma variante próxima, é usada na maioria dos modelos para reconhecimento de imagem.

Neste artigo, vamos entender como criar e treinar uma (CNN) simples para classificar dígitos manuscritos de um conjunto de dados popular.

Figura 1: dataset MNIST ( imagem:en.wikipedia.org/wiki/MNIST_database) 

Pré-requisito

Embora cada etapa seja detalhada neste tutorial, certamente quem já possui algum conhecimento teórico sobre o funcionamento da CNN será beneficiado. Além disso, é bom ter algum conhecimento prévio do TensorFlow2 , mas não é necessário.

Rede Neural Convolucional

Ao longo dos anos, o CNN se popularizou como técnica para a classificação de imagens para visões computacionais e tem sido usada nos domínios da saúde. Isso indica que o CNN é um modelo de deep learning confiável para uma previsão automatizada de ponta a ponta. Ele essencialmente extrai recursos ‘úteis’ de uma entrada fornecida automaticamente, facilitando nosso trabalho.

Figura 2: Processo end to end de CNN

Um modelo que utiliza CNN consiste, em suas versões mais simples, em três camadas principais: Camada Convolucional, Camada de Pooling e Camada Totalmente Conectada.

  1. Camada Convolucional: Esta camada extrai recursos de alto nível dos dados de entrada e os repassa para a próxima camada na forma de mapas de recursos.
  2. Camada de Pooling: É usada para reduzir as dimensões dos dados aplicando camadas de agrupamento (Pooling). Essa camada recebe cada saída do mapa de recursos da camada convolucional e prepara um mapa de características condensadas.
  3. Camada Totalmente Conectada: Finalmente, a tarefa de classificação é feita pela camada totalmente conectada. As pontuações de probabilidade são calculadas para cada rótulo de classe por uma função de ativação popularmente chamada de função softmax.

Dataset

O dataset que está sendo usado aqui é o de classificação de dígitos MNIST. O Keras é uma API de deep learning escrita em Python e ele traz consigo o MNIST. Este conjunto de dados consiste em 60.000 imagens de treinamento e 10.000 imagens de teste, o que o torna ideal para quem precisa experimentar o reconhecimento de padrões, pois ele é executado em apenas um minuto.

Quando a API do Keras é chamada, quatro valores são retornados. São eles: 

x_train,

y_train, 

x_test, 

y_test . 

Não se preocupe, você será orientado(a) sobre isso.

Carregando o dataset

A linguagem usada aqui é Python. Vamos usar o Google Colab para escrever e executar o código. Você também pode escolher um Jupyter notebook. o Google Colab foi escolhido aqui por fornecer acesso fácil a notebooks a qualquer hora e em qualquer lugar. Também é possível conectar um notebook Colab a um repositório GitHub. Você pode aprender mais sobre o Google Colab aqui.

Além disso, o código usado neste tutorial está disponível neste repositório Github. Portanto, se você se sentir confuso em alguma fase, verifique esse repositório. Para manter este tutorial relevante para todos, explicaremos o código mais crítico.

  1. Crie e nomeie um notebook.
  2. Depois de carregar as bibliotecas necessárias, carregue o dataset MNIST conforme mostrado abaixo:
(X_train,y_train),(X_test,y_test)=keras.datasets.mnist.load_data()

Como discutimos anteriormente, este conjunto de dados retorna quatro valores e na mesma ordem mencionada acima: x_train, y_train, x_test e y_test , que são representações para datasets divididos em treinamento e teste.

Muito bem! Você acabou de carregar seu dataset e está pronto para passar para a próxima etapa, que é processar os dados.

Processando o dataset

Os dados devem ser processados e limpos para melhorar sua qualidade. Para que a CNN aprenda é preciso que o dataset não contenha nenhum valor nulo, que tenha todos os dados numéricos e que seja normalizado. Então, aqui vamos realizar algumas etapas para garantir que tudo esteja perfeitamente adequado para um modelo CNN aprender. Daqui em diante, até criarmos o modelo, trabalharemos apenas no dataset de treinamento. 

Se você escrever X_train[0], obterá a 0ª imagem com valores entre 0-255, representando a intensidade da cor (preto ao branco). A imagem é uma matriz bidimensional. É claro, não saberemos o que o dígito manuscrito X_train[0] representa, para saber isso escreva y_train[0] e você obterá 5 como saída. Isso significa que a 0ª imagem deste dataset de treinamento representa o número 5. 

Vamos normalizar este dataset de treinamento e de teste, colocando os valores entre 0 e 1 conforme mostrado abaixo:

X_train=X_train/255
X_test=X_test/255

 

Em seguida, precisamos redimensionar a matriz para se adequar a API do Keras. Ela espera que cada entrada tenha 3 dimensões: uma pra linha, uma para a coluna e uma para a cor. Normalmente, essa 3ª dimensão é usada quando trabalhamos com imagens coloridas e temos múltiplos canais de cor (ex: RGB). Porém, como trabalhamos com imagens monocromáticas, essa terceira dimensão terá apenas um elemento.

X_train=X_train.reshape(-1,28,28,1) #conjunto de treinamento
X_test=X_test.reshape(-1,28,28,1) #conjunto de teste

Agora que está tudo em ordem, é hora de criarmos uma rede neural convolucional.

Criação e treinamento de uma CNN

Vamos criar um modelo CNN usando a biblioteca TensorFlow. O modelo é criado da seguinte maneira:

convolutional_neural_network=models.Sequential([  
layers.Conv2D(filters=25,kernel_size=(3,3),activation='relu',input_shape=(28,28,1)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(filters=64,kernel_size=(3,3),activation='relu'),
layers.MaxPooling2D((2,2)),
layers.Conv2D(filters=64,kernel_size=(3,3),activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(64,activation='relu'),
layers.Dense(10,activation='softmax')]
)

 

Reserve algum tempo para permitir que todo o código seja absorvido. É importante que você entenda cada parte dele. No modelo CNN criado acima, há uma camada CNN de entrada, seguida por duas camadas CNN ocultas, uma camada densa oculta e, finalmente, uma camada densa de saída. Em termos mais simples, as funções de ativação são responsáveis ​​por tomar decisões de passar o que foi identificado adiante ou não. Em uma rede neural profunda como a CNN, existem muitos neurônios e, com base nas funções de ativação, os neurônios disparam e a rede avança. Se você não entende muito sobre as funções de ativação use ‘relu’, pois ele é mais popular devido sua versatilidade.

Uma vez que o modelo foi criado, é hora de compilá-lo e treiná- lo . Durante o processo de treino, o modelo percorrerá o dataset e aprenderá os padrões. Ele treinará quantas vezes for definido (as chamadas épocas). Em nosso exemplo, definimos 10 épocas. Durante o processo, o modelo da CNN vai aprender e também cometer erros. Para cada erro (previsões erradas) que o modelo comete, há uma penalidade (ou um custo) e isso é representado no valor da perda (loss) para cada época (veja o GIF abaixo). Resumindo, o modelo deve gerar o mínimo de perda e a maior precisão possível no final da última época.

 

Modelo de treinamento |  classificação de dígitos manuscritos CNN

GIF 1: Treinamento CNN e as precisões aprimoradas durante cada época

Fazendo previsões

Para avaliar o modelo CNN assim criado, você pode executar:

convolutional_neural_network.evaluate(X_test,y_test)

É hora de usar nosso conjunto de testes para ver o desempenho do modelo CNN.

y_predicted_by_model=convolutional_neural_network.predict(X_test)

O código acima usará o modelo convolutional_neural_network para fazer previsões para o conjunto de teste e armazená-lo no dataframe y_predicted_by_model. Para cada um dos 10 dígitos possíveis, uma pontuação de probabilidade será calculada. A classe com a pontuação de probabilidade mais alta é a previsão feita pelo modelo. Por exemplo, se você quiser ver qual é o dígito na primeira linha do conjunto de teste:

y_predicted_by_model[0]

A saída será mais ou menos assim:

array([3.4887790e-09,3.4696127e-06,7.7428967e-07,2.9782784e-08,6.3373392e-08,6.1983449e-08,7.4500317e-10,9.9999511e-01,4.2418694e-08,3.8616824e-07],dtype=float32)

Como é realmente difícil identificar o rótulo da classe de saída com a pontuação de probabilidade mais alta, vamos escrever outro código:

np.argmax(y_predicted[0])

E com isso, você obterá um dos dez dígitos como saída (0 a 9). Para saber a representação direta do dígito, aplique o resultado do argmax nas classes do modelo.

Em suma

Após aprender como um dataset é dividido em treinamento e teste, utilizando o MNIST para fazer previsões de dígitos manuscritos de 0 a 9, criamos um modelo CNN treinado no dataset de treinamento. Por fim, com o modelo treinado, as previsões são realizadas.

Incentivamos você a experimentar por conta própria a ajustar os hiperparâmetros do modelo na expectativa de saber se eles são capazes de alcançar precisões mais altas ou não. Se você quer aprender sempre mais, acompanhe esta aula de Redes Neurais Convolucionais. Ficamos felizes em colaborar com a sua aprendizagem!

Referências

  1. Equipe, K. (nd). Documentação Keras: conjunto de dados de classificação de dígitos MNIST. Keras. https://keras.io/api/datasets/mnist/.
  2. manav_m. (2021, 1º de maio). CNN para Aprendizado Profundo: Redes Neurais Convolucionais (CNN). Analytics Vidhya. https://www.analyticsvidhya.com/blog/2021/05/convolutional-neural-networks-cnn/.
  3. YouTube. (2020, 14 de outubro). Explicação simples da rede neural convolucional | Tutorial de aprendizado profundo 23 (Tensorflow e Python). YouTube. https://www.youtube.com/watch?v=zfiSAzpy9NM&list=PLeo1K3hjS3uvCeTYTeyfe0-rN5r8zn9rw&index=61. 

 

Artigo traduzido Analytics Vidhya : Classification of Handwritten Digits Using CNN.

Fonte de pesquisa: Deep Learning Book

 

Categorias
Ceará Ciência de Dados Redes Neurais

Conheça o modelo computacional cearense que rastreia sintomas da COVID-19

A pandemia de Covid-19 exigiu dos governos medidas eficientes e aceleradas para o enfrentamento da doença. Nesse contexto, a Ciência de Dados trouxe contribuições fundamentais no entendimento do comportamento do vírus e nas tomadas de decisões de combate.

Uma das soluções desenvolvidas e disponibilizadas para a população no Estado do Ceará foi o Plantão Coronavírus, uma plataforma com mecanismos de triagem que, no primeiro momento, utiliza um chatbot para interagir com o paciente a fim de classificar seu estado de saúde em uma das três categorias: verde, amarelo e vermelho, sendo o nível de criticidade da saúde do paciente leve, moderada ou grave, respectivamente.

 

Trecho da conversa entre o paciente e o chatbot

 

As interações entre os pacientes e os profissionais de saúde por meio do Plantão Coronavírus geraram muitos dados que precisavam ser minerados, analisados e transformados em informação de valor.

Com esse objetivo, pesquisadores do Insight Lab e do Laboratório Íris desenvolveram o Sintomatic, um modelo computacional criado para auxiliar a Secretaria da Saúde do Ceará no acompanhamento dos pacientes que buscavam algum tipo de serviço de saúde. Além disso, ele contribuiu na descoberta de novos sintomas presentes em vítimas do coronavírus, sejam estes mais frequentes ou raros, e na identificação de comportamentos psicológicos alterados, como ansiedade, angústia e tristeza em pacientes positivos ou não para COVID19.

Conheça neste artigo a metodologia usada pelos pesquisadores para desenvolver esse modelo computacional.

 

Sintomatic

No serviço de Tele Atendimento gratuito oferecido pelo Governo do Ceará, o paciente inicialmente trocava mensagens com um robô. A partir daí, era triado de acordo com seus sintomas e, posteriormente, encaminhado para uma consulta com um profissional de saúde.

Todo o ciclo de integração com o paciente registrado por meio de textos é passado ao modelo Sintomatic para que este possa detectar sintomas em todas as etapas do atendimento.

No projeto, foi mapeada a identificação de sintomas em texto como um problema de reconhecimento de entidade (em inglês, Named Entity Recognition – NER). NER corresponde à capacidade de identificar as entidades nomeadas nos documentos e rotulá-las em classes definidas de acordo com o tipo de entidade. De forma geral, o robô de captura de sintomas possui uma rede neural que é capaz de reconhecer entidades. Neste caso, uma entidade é um sintoma.

O Sintomatic é uma rede neural que processa textos em Linguagem Natural, capaz de identificar sintomas a partir de mensagens trocadas entre o chatbot e o paciente. Por meio desse processo, o modelo reconhece novos padrões da doença anteriormente inexistentes ou despercebidos, proporcionando grandes ganhos no entendimento da doença.

Aprendizado por transferência (Transfer Learning) 

A detecção de sintomas no idioma português foi um desafio, pois, até o momento, não havia de forma pública nenhum modelo capaz de realizar essa tarefa, de acordo com o conhecimento dos cientistas envolvidos. O robô desenvolvido foi treinado através de um processo de aprendizado conhecido como Transfer Learning, ou em português, aprendizado por transferência.

A técnica de aprendizagem por transferência utiliza o conhecimento adquirido ao resolver um problema e aplicá-lo em outro problema diferente, porém relacionado, permitindo progresso rápido e desempenho aprimorado ao modelar a segunda tarefa. Em outras palavras, a transferência de aprendizado é a melhoria do aprendizado em uma nova tarefa através da transferência de conhecimento de uma tarefa relacionada que já foi aprendida.

A inovação tecnológica promovida pelo Sintomatic é um modelo neural pioneiro no reconhecimento de sintomas em português, principalmente porque a língua portuguesa carece de modelos NER.

 

Etapas de treinamento

Para treinar o Sintomatic foi utilizado o scispaCy, um pacote Python que contém modelos de spaCy para processar textos biomédicos, científicos ou clínicos.

Em particular, há um tokenizador personalizado que adiciona regras de tokenização baseando-se em regras do spaCy, um etiquetador POS e analisador sintático treinado em dados biomédicos e um modelo de detecção de extensão de entidade. Separadamente, também existem modelos NER para tarefas mais específicas.

Para este trabalho, o modelo utilizado foi o en ner bc5cdr md do SciSpacy, em um processo de transfer learning para treinar um novo modelo de reconhecimento e captura de sintomas em português.

A primeira etapa do processo de treino do rastreador foi traduzir os textos que inicialmente estavam em língua portuguesa para o idioma inglês. Em seguida, inserir como parâmetro de entrada cada texto (em inglês) ao modelo do scispacy, analisar o resultado gerado por este modelo e, logo após, traduzir os sintomas capturados pelo modelo do scispacy em inglês para português.

O conjunto de treinamento para o Sintomatic (novo modelo em português), é composto do texto original e os sintomas capturados pelo modelo do scispacy em português. Esse processo foi executado de forma contínua até que a função de erro da rede se estabilizasse.

Ao final, foi possível atingir para o Sintomatic, F1-score de 85.66, o que é competitivo se comparado ao modelo em inglês, que tem F1-score igual a 85.02.

Etapas do processo:

Fluxo dos dados

 

Nas etapas de translação dos textos foi utilizada a rede de tradução do Google. Atualmente, essas redes de tradução apresentam resultados muito fiéis ao esperado, tornando os ruídos insignificantes quando analisados no contexto deste trabalho.

Um diferencial do Sintomatic é a não necessidade de classificação manual realizada por um humano para reconhecimento de entidades. Em um cenário onde havia vasta quantidade de dados e pouco tempo para processar essas informações, o ganho com a otimização dessa etapa de treino foi crucial no apoio à tomada de decisão.


Boletim Digital

Para o acompanhamento dos dados capturados pelo robô Sintomatic e monitoramento das demais informações sobre a pandemia, foi desenvolvido o Boletim Digital COVID-19 do Ceará. Essa é uma solução tecnológica construída por cientistas de dados onde é feito todo o processo de mineração do dado bruto até sua exposição em painéis gráficos acompanhados de textos explicativos a respeito de cada uma das análises abaixo:

  • número de pacientes atendidos;
  • sintomas mais frequentes e raros;
  • evolução dos sintomas por semana epidemiológica;
  • sintomas ao longo do tempo.

Veja no vídeoabaixo uma demonstração do funcionamento do Sintomatic:

 

Atualmente, o Sintomatic é utilizado na plataforma de Tele Atendimento do Estado do Ceará, onde desempenha papel pioneiro na área da saúde.


Fonte: Rastreador de sintomas da COVID19

 

 

 

Categorias
Ciência de Dados Machine Learning Redes Neurais

Aprendizado de Máquina com Scikit-Learn & TensorFlow

Feriadão chegando e o que temos para você!?

Uma dica de ouro! Um dos melhores livros prático sobre Machine Learning. Seja para você, iniciante na área e que precisa de um guia, ou para quem já atua e precisa de um complemento.

MÃOS À OBRA: APRENDIZADO DE MÁQUINA COM SCIKIT-LEARN & TENSORFLOW. Conceitos, ferramentas e técnicas para a construção de sistemas inteligentes de Aurélien Géron é um livro com ótima avaliação pelos leitores.

De maneira prática, o livro mostra como utilizar ferramentas simples e eficientes para implementar programas capazes de aprender com dados. Utilizando exemplos concretos, uma teoria mínima e duas estruturas Python prontas para produção ― Scikit-Learn e TensorFlow ― o autor Aurélien Géron ajuda você a adquirir uma compreensão intuitiva dos conceitos e ferramentas para a construção de sistemas inteligentes.

Você aprenderá uma variedade de técnicas, desde de uma regressão linear simples até redes neurais profundas. Com exercícios em cada capítulo para ajudá-lo a aplicar o que aprendeu, você só precisa ter experiência em programação para começar.

Segundo Pete Warden, líder  mobile do TensorFlow, o livro é uma ótima introdução à teoria e prática na resolução de problemas com redes neurais abrangendo os pontos-chave necessários para entender novas pesquisas.

Na edição atualizada o livro traz exemplos concretos, teoria mínima e três estruturas Python prontas para produção – scikit-learn, Keras e TensorFlow – para ajudá-lo a obter uma compreensão intuitiva dos conceitos e ferramentas para a construção de sistemas inteligentes.

Curiosidades sobre o autor: Aurélien Géron ensinou seus 3 filhos a contar em binário com os dedos (até 1023), ele estudou microbiologia e genética evolutiva antes de entrar na engenharia de software, e seu paraquedas não abriu no segundo salto.

Categorias
Redes Neurais

Como estimar a idade das pessoas usando redes neurais convolucionais

Nos últimos anos, os pesquisadores criaram um número crescente de técnicas de reconhecimento facial baseadas em aprendizado de máquina (ML), que podem ter inúmeras aplicações interessantes, por exemplo, aprimorando o monitoramento de vigilância, controle de segurança e arte potencialmente forense. Além do reconhecimento facial, os avanços no ML também permitiram o desenvolvimento de ferramentas para prever ou estimar qualidades específicas (por exemplo, sexo ou idade) de uma pessoa, analisando imagens de seus rostos.

Em um estudo recente, pesquisadores da Universidade de Kwazulu-Natal, na África do Sul, desenvolveram um modelo de machine learning para estimar a idade das pessoas analisando imagens de seus rostos tirados em ambientes aleatórios da vida real. Essa nova arquitetura foi introduzida em um artigo publicado no Springer e apresentado há alguns dias na Conferência Internacional sobre Inteligência Coletiva Computacional (ICCCI) 2019.

As abordagens mais tradicionais para classificação etária somente têm bom desempenho ao analisar imagens de rosto tiradas em ambientes controlados, por exemplo, no laboratório ou em estúdios de fotografia. Por outro lado, muito poucos deles são capazes de estimar a idade das pessoas em imagens tiradas em ambientes cotidianos reais.

“Os métodos de aprendizado profundo provaram ser eficazes na solução desse problema, especialmente com a disponibilidade de uma grande quantidade de dados para treinamento e máquinas de ponta”, escreveram os pesquisadores em seu artigo. “Em vista disso, propomos uma solução de aprendizado profundo para estimar a idade a partir de rostos da vida real”.

A equipe de pesquisadores da Universidade de Kwazulu-Natal desenvolveu uma arquitetura baseada em rede neural convolucional profunda (CNN) com seis camadas. Seu modelo foi treinado para estimar a idade dos indivíduos a partir de imagens de rostos tirados em ambientes não controlados. A arquitetura consegue isso aprendendo quais representações faciais são mais cruciais para a estimativa de idade e concentrando-se nesses recursos específicos.

A fase de pré-processamento da imagem. Crédito: Agbo-Ajala e Viriri.

Para melhorar o desempenho de seu modelo baseado na CNN, os pesquisadores o treinaram em um grande conjunto de dados chamado IMDB-WIKI, que contém mais de meio milhão de imagens de rostos tirados do IMDB e da Wikipedia, rotulados com a idade de cada sujeito. este treino inicial permitiu-lhes conformar sua arquitetura para enfrentar o conteúdo da imagem.

Posteriormente, os pesquisadores ajustaram o modelo usando imagens de outros dois bancos de dados, MORPH-II e OUI-Adience, treinando-o para captar peculiaridades e diferenças. O MORPH-II contém aproximadamente 70.000 imagens rotuladas de rostos, enquanto o OUI-Adience contém 26.580 imagens de rostos tiradas em ambientes ideais da vida real.

Quando eles avaliaram seu modelo em imagens tiradas em ambientes não controlados, os pesquisadores descobriram que esse extenso treinamento levou a um desempenho notável. Seu modelo alcançou resultados de última geração, superando vários outros métodos baseados na CNN para estimativa de idade.

“Nossas experiências demonstram a eficácia do nosso método para estimativa de idade na natureza quando avaliadas no benchmark OUI-Adience, que é conhecido por conter imagens de rostos adquiridos em condições ideais e sem restrições “, escreveram os pesquisadores.” O método de classificação etária proposto alcança novos resultados de última geração, com uma melhoria na precisão de 8,6% (exato) e 3,4% (pontual) em relação ao melhor resultado relatado no conjunto de dados OUI-Adience “.

No futuro, a nova arquitetura baseada na CNN desenvolvida por esses pesquisadores poderá permitir implementações de estimativa de idade mais eficazes em uma variedade de configurações da vida real. A equipe também planeja adicionar camadas ao modelo e treiná-lo em outros conjuntos de dados de imagens de rosto tiradas em ambientes não controlados assim que estiverem disponíveis, a fim de melhorar ainda mais seu desempenho.

 

Mais Informações:
Olatunbosun Agbo-Ajala et al. Age Estimation of Real-Time Faces Using Convolutional Neural Network, Computational Collective Intelligence (2019). DOI: 10.1007/978-3-030-28377-3_26
Sair da versão mobile