<jupyter_start><jupyter_text>IntroduçãoNo contexto de inteligência artificial e aprendizagem de máquina, uma rede neural convolucional (CNN do inglês Convolutional Neural network ou ConvNet) é uma classe de rede neural artificial do tipo feed-forward, que vem sendo aplicada com sucesso no processamento e análise de imagens digitais.[1] Uma CNN usa uma variação de perceptrons multicamada desenvolvidos de modo a demandar o mínimo pré-processamento possível. Essas redes também são conhecidas como redes neurais artificiais invariantes a deslocamento (shift invariant) ou invariantes a espaço (space invariant), em ambos os casos representadas pela sigla em inglês SIANN.[2][3]Uma imagem preta e branca (grayscale) é representada como uma matrix 2D, em que cada posição da matrix representa um pixel da imagem. Os valores para cada elemento variam entre 0 (preto) até 255 (branco), conforme o exemplo abaixo.Já uma imagem colorida, é normalmente representada por uma matrix 3D de forma que seja possível armazenar uma combinação das cores vermelho, verde e azul (RGB do inglês).ConvoluçõesMatematicamente, uma convolução é uma operação linear que a partir de duas funções, gera uma terceira (normalmente chamada de feature map). No contexto de imagens, podemos entender esse processo como um filtro/kernel que transforma uma imagem de entrada.Um kernel é uma matrix utilizada para uma operação de multiplicação de matrizes. Esta operação é aplicada diversas vezes em diferentes regiões da imagem. A cada aplicação, a região é alterada por um parâmetro conhecido como stride. Normalmente o stride possui o valor 1, o que significa que a transformação será aplicada em todos os pixels da imagem. Um exemplo dessa transformação é ilustrado abaixo. Padding Padding é um processo em que alguns pixels são adicionados ao redor da imagem antes da operação de convolução, de forma a manter a dimensionalidade na imagem resultante durante a operação.Algumas das operações de convolução mais utilizadas com imagens são apresentadas abaixo.Esse processo é utilizado porque essas imagens resultantes podem conter elementos que facilitam a identificação da classe alvo para a rede. Uma CNN utiliza esse processo nas suas camadas iniciais, com a diferença de que a matrix de kernel não possui valores “chumbados” como no exemplo acima, ou seja: eles são parâmetros treinados pelo algoritmo.ReLUUma rede neural sem função de ativação torna-se um modelo linear. Se o seu problema é linear, existem outros modelos mais simples que te atenderão tão bem quanto uma rede neural. Infelizmente a maioria dos problemas complexos não são lineares. Portanto, para adicionar a não linearidade a rede, utilizamos as funções de ativação. Nos dias de hoje, e principalmente no contexto de imagens, a mais utilizada é a função ReLU.Matematicamente a função ReLU é definida como y = max(0, x). O gráfico a seguir é a ilustração desta função.PoolingPooling é um processo de downsamping. É um processo simples de redução da dimensionalidade/features maps. Em uma forma leviana de pensar, podemos entender essa transformação como uma redução do tamanho da imagem.A principal motivação dessa operação no modelo, é de diminuir sua variância a pequenas alterações e também de reduzir a quantidade de parâmetros treinados pela rede.Existem 3 operações diferentes de Pooling (MaxPooling, SumPooling, AvaragePooling). Todas elas seguem o mesmo princípio e só se diferem na forma como calculam o valor final. A mais utilizada nos dias de hoje é a MaxPooling.A operação de MaxPooling retira o maior elemento de determinada região da matrix (considerando o tamanho do pool aplicado). Posteriormente, é feito um deslizamento considerando um parâmetro de stride (similar a a operação de convolução) para aplicação de uma nova operação.DropoutDropout não é uma especificidade de uma CNN, porém a utilizaremos em nossa implementação técnica, portanto abordaremos seu funcionamento.Em resumo, a camada de Dropout é utilizada para evitar que determinadas partes da rede neural tenham muita responsabilidade e consequentemente, possam ficar muito sensíveis a pequenas alterações.Essa camada recebe um hyper-parâmetro que define uma probabilidade de “desligar” determinada área da rede neural durante o processo de treinamento.FlattenEssa camada normalmente é utilizada na divisão das 2 partes da CNN (extração de características / rede neural tradicional ). Ela basicamente opera uma transformação na matrix da imagem, alterando seu formato para um array. Por exemplo, uma imagem em grayscale de 28x28 será transformada para um array de 784 posições. A imagem abaixo ilustra essa operação.Rede Tradicional (Dense Layers) Rede neural é um modelo computacional baseado no sistema nervoso central humano. Elas são capazes de reconhecer padrões em uma massa de dados de forma a classificá-los em alguma categoria ou fazer a regressão de algum valor.<jupyter_code>import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Dropout, Conv2D, MaxPooling2D, Flatten, Dropout, BatchNormalization
from tensorflow.keras.models import Model
from keras.models import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint

from IPython.display import HTML
import numpy as np
import SimpleITK as sitk
import cv2 as cv
import matplotlib.pyplot as plt
import os

from sklearn.model_selection import train_test_split
from mlxtend.plotting import plot_confusion_matrix
from sklearn.metrics import confusion_matrix
image_size = 256       #resize all images to 256*256*

labels = ['Covid', 'Normal', 'PNEUMONIA (BACTERIA)', 'PNEUMONIA (VIRUS)']          #labels from the folders
def create_training_data(data_dir):              #creating the training data
    
    images = []
    
    for label in labels:
        dir = os.path.join(data_dir,label)
        class_num = labels.index(label)
        
        for image in os.listdir(dir):    #going through all the images in different folders and resizing them
            
            image_read = cv.imread(os.path.join(dir,image),cv.IMREAD_GRAYSCALE)
            image_resized = cv.resize(image_read,(image_size,image_size))
            images.append([image_resized,class_num])
            
    return np.array(images)
train = create_training_data(r'C:\Users\Megatron\Desktop\TCC\dados\train')
test = create_training_data(r'C:\Users\Megatron\Desktop\TCC\dados\test')
print('Training Shape',train.shape,'\nTesting Shape', test.shape)<jupyter_output>Training Shape (5526, 2) 
Testing Shape (706, 2)<jupyter_text>Pneumonias são infecções que se instalam nos pulmões, órgãos duplos localizados um de cada lado da caixa torácica. Podem acometer a região dos alvéolos pulmonares onde desembocam as ramificações terminais dos brônquios e, às vezes, os interstícios (espaço entre um alvéolo e outro).Basicamente, pneumonia é provocada pela penetração de um agente infeccioso ou irritante (bactérias, vírus, fungos e por reações alérgicas) no espaço alveolar, onde ocorre a troca gasosa. Esse local deve estar sempre muito limpo, livre de substâncias que possam impedir o contato do ar com o sanguePNEUMONIA BACTERIANAPode ser classificada em 3 grupos principais. De acordo com suascaracterísticas morfológicas: pneumonia lobar, broncopneumonia e pneumoniaintersticial aguda.Essa classificação tem o seu uso limitado, pois ascaracterísticas radiográficas se sobrepõem e não podem ser usadas paraconfirmação de diagnóstico etiológico.Por esse motivo, muitos autorespreferem classificar pneumonias de acordo com o mecanismo de origem:pneumonia adquirida na comunidade (PAC), pneumonia nosocomial epneumonia aspirativa.Abordaremos a seguir a PAC, que é o grupo depneumonias mais prevalente nos atendimentos de emergência.O achado usual na PAC coincide com a apresentação clássica dapneumonia lobar: consolidação do espaço aéreo de um segmento ou lobo,limitada pela superfície pleural (Figura 2).O Streptococcus pneumoniae é omicroorganismo mais frequente causador de PAC. Hoje em dia, o uso deantibióticos mudou a aparência da pneumonia Pneumocócica, que podeaparecer como áreas confluentes desiguais, multilobares ou bilaterais (Figura.3a).O Mycoplasma pneumoniae, outro importante agente causador de PAC,pode se apresentar com sintomas de longa duração e um padrão de infiltraçãoreticulo-nodular difusa (Figura 3b).<jupyter_code>fig, ax = plt.subplots(2, 2,figsize=(15, 12) )
ax[0][0].imshow(train[1000][0], cmap='gray')
ax[0][0].text(12, 12, labels[train[1000][1]], bbox={'facecolor': 'white', 'pad': 10})
#Plot 2
ax[0][1].imshow(train[1][0], cmap='gray')
ax[0][1].text(12, 12, labels[train[1][1]], bbox={'facecolor': 'white', 'pad': 10})
#Plot 3
ax[1][0].imshow(train[5000][0], cmap='gray')
ax[1][0].text(12, 12, labels[train[5000][1]], bbox={'facecolor': 'white', 'pad': 10})
#Plot 4
ax[1][1].imshow(train[3000][0], cmap='gray')
ax[1][1].text(12, 12, labels[train[3000][1]], bbox={'facecolor': 'white', 'pad': 10})
plt.show();
X = []
y = []

for feature, label in train:
    X.append(feature)          #appending all images
    y.append(label)            #appending all labels

for feature, label in test:
    X.append(feature)
    y.append(label)
    
X_new = np.array(X).reshape(-1, image_size, image_size, 1)
y_new = np.array(y)
y_new = np.expand_dims(y_new, axis =1)
X_train, X_test, y_train, y_test = train_test_split(X_new, y_new, test_size=0.25, random_state = 42)
print('X Train Shape',X_train.shape,'\nX Test shape',X_test.shape, '\nY Train Shape',y_train.shape,'\nY Test Shape',y_test.shape)
np.unique(y_train)
X_train[0].shape
model = Sequential()
model.add(Conv2D(32, (3, 3), padding="same", input_shape=X_train[0].shape ))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=(2,2)))
#model.add(Dropout(0.3))


model.summary()
model.compile(optimizer='adam',loss = 'binary_crossentropy',metrics=['accuracy'])
model_trained = model.fit(X_train, y_train,epochs=5,validation_data=(X_test, y_test))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.06769749231836654, 'fraction_numerical': 0.014768559817623154, 'mean_word_length': 5.30625, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '405008', 'license': 'MIT', 'n_tokens_mistral': 3353, 'n_tokens_neox': 3182, 'n_words': 1229, 'path': 'notebook/TCC.ipynb', 'repo_name': 'valeriocardoso/Jiripoca', 'size': '10089'}