{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Capítulo 4: Deep Learning na Prática"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Redes Neurais Convolucionais\n",
"\n",
"O ano de 2012 foi um marco na área de visão computacional com a publicação do artigo inovador \"[ImageNet Classification with Deep Convolutional Neural Networks](https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf)\". Nesse trabalho, Alex Krizhevsky, Ilya Sutskever e Geoffrey Hinton apresentaram a arquitetura AlexNet, uma Rede Neural Convolucional (CNN) profunda que superou significativamente os métodos tradicionais na classificação de imagens em larga escala. Utilizando o conjunto de dados ImageNet, essa conquista despertou grande interesse e impulsionou a pesquisa em CNNs, consolidando-as como a principal abordagem em diversas tarefas de visão computacional.\n",
"\n",
"As CNNs surgiram como uma força motriz nessa revolução, promovendo avanços extraordinários em áreas como reconhecimento de imagens, segmentação e muito mais. Inspiradas na estrutura e funcionamento do sistema visual humano, essas redes neurais artificiais possuem uma capacidade impressionante de interpretar e extrair significado de dados visuais.\n",
"\n",
"### Aplicações Transformadoras em Visão Computacional\n",
"\n",
"A versatilidade e o poder das CNNs levaram à sua adoção em uma ampla gama de aplicações de visão computacional, incluindo:\n",
"\n",
"* **Reconhecimento de Objetos:** CNNs identificam e classificam objetos em imagens com alta precisão, mesmo em cenários complexos com múltiplos objetos e fundos confusos.\n",
"\n",
"* **Detecção de Objetos:** Além de reconhecer, as CNNs podem localizar e delinear objetos em uma imagem, fornecendo informações valiosas sobre suas posições e tamanhos.\n",
"\n",
"* **Segmentação de Imagens:** CNNs segmentam imagens em diferentes regiões semânticas, rotulando cada pixel com a classe correspondente, como céu, edifícios, carros e pessoas.\n",
"\n",
"* **Reconhecimento Facial:** CNNs são amplamente utilizadas para identificar e reconhecer rostos em imagens e vídeos, com aplicações em segurança, autenticação e mídia social.\n",
"\n",
"* **Análise de Imagens Médicas:** CNNs auxiliam médicos no diagnóstico de doenças, identificando padrões em radiografias, tomografias e outras imagens médicas.\n",
"\n",
"### Arquitetura em Camadas: Da Percepção à Abstração\n",
"\n",
"Uma CNN típica é composta por várias camadas interconectadas, cada uma com um papel crucial na extração de características e no processo de aprendizagem. Essa estrutura em camadas permite que a rede aprenda representações hierárquicas de dados visuais, evoluindo de padrões simples para características complexas.\n",
"\n",
"**Camadas Convolucionais: Encontrando os Padrões**\n",
"\n",
"No coração de uma CNN estão as camadas convolucionais, responsáveis por identificar e extrair características visuais significativas de uma imagem de entrada. Essas camadas utilizam filtros especializados, conhecidos como kernels, que percorrem a imagem realizando operações matemáticas para detectar padrões como bordas, cantos e texturas. À medida que a informação passa pelas camadas convolucionais, a rede desenvolve a capacidade de reconhecer padrões cada vez mais abstratos e complexos.\n",
"\n",
"Um [experimento interativo](https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html) mostra como diferentes kernels extraem características distintas, ilustrando a capacidade das CNNs de aprender e adaptar-se a diferentes tipos de dados visuais.\n",
"\n",
"A seguir, uma ilustração do que seria uma CNN.\n",
"\n",
"\n",
"\n",
"[Fonte de Figura](https://en.wikipedia.org/wiki/Convolutional_neural_network)\n",
"\n",
"**Camadas de Pooling: Simplificando a Informação Visual**\n",
"\n",
"Após as camadas convolucionais, as camadas de pooling entram em ação para reduzir a dimensionalidade dos mapas de características gerados. Essas camadas agregam informações espaciais, preservando características importantes enquanto descartam variações mínimas. Esse processo torna a representação da imagem mais compacta e aumenta a robustez da rede a pequenas variações na posição e na escala do objeto. Existem diferentes tipos de pooling, sendo os mais comuns o **Max Pooling** e o **Average Pooling**.\n",
"\n",
"* **Max Pooling:** O Max Pooling extrai o valor máximo dentro de uma janela definida pelo kernel, destacando as características mais proeminentes.\n",
"\n",
"
\n",
"\n",
"([Fonte da figura](https://paperswithcode.com/methods/category/convolutional-neural-networks))\n",
"\n",
"\n",
" ```\n",
" Kernel 2x2:\n",
" 1 3 -> Max Pooling -> 3\n",
" 2 3\n",
" ```\n",
"\n",
"* **Average Pooling:** O Average Pooling calcula a média dos valores dentro da janela do kernel, suavizando as características e reduzindo a sensibilidade a pequenas variações.\n",
"\n",
" ```\n",
" Kernel 2x2:\n",
" 1 3 -> Average Pooling -> 2\n",
" 2 3\n",
" ```\n",
"\n",
"**Flattening: Transformando Matrizes em Vetores**\n",
"\n",
"Antes que as características extraídas pelas camadas convolucionais e de pooling sejam passadas para a camada totalmente conectada, elas precisam ser \"achatadas\" em um vetor unidimensional. Esse processo, chamado de **flattening**, organiza os valores dos mapas de características em uma única coluna, como no exemplo a seguir:\n",
"\n",
"```\n",
"Matriz 2x2: Vetor Coluna:\n",
"1 2 1\n",
"3 4 2\n",
" 3\n",
" 4\n",
"```\n",
"\n",
"**Camadas Totalmente Conectadas: Integrando e Classificando**\n",
"\n",
"As camadas totalmente conectadas, também conhecidas como camadas densas, representam a fase final no pipeline de uma CNN. Essas camadas recebem o vetor de características achatado e o utilizam para realizar a tarefa de classificação ou regressão. Em uma camada totalmente conectada, cada neurônio está conectado a todos os neurônios da camada anterior, permitindo que a rede aprenda relações complexas entre as características extraídas e faça previsões finais.\n",
"\n",
"**Recursos extras:**\n",
"\n",
"- [CNN Explainer](https://poloclub.github.io/cnn-explainer/) - Visualização interativa\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset\n",
"\n",
"Um dataset é uma coleção organizada de dados utilizados para fins específicos, como treinamento e avaliação de modelos de machine learning. Esses dados podem incluir informações como imagens, textos, números ou qualquer outro tipo relevante para uma tarefa específica. Os datasets são geralmente divididos em subconjuntos para diferentes estágios do processo de machine learning.\n",
"\n",
"### Conjunto de Treino, Teste e Validação\n",
"\n",
"Ao trabalhar com um dataset, é comum dividi-lo em três subconjuntos principais: conjunto de treino, conjunto de teste e conjunto de validação:\n",
"\n",
"