Classificação de imagens usando CNN: implementação python

Conteúdo

Este artigo foi publicado como parte do Data Science Blogathon

Oi, pessoal! Neste blog, Vou discutir tudo sobre classificação de imagens.

Nos últimos anos, O Deep Learning provou ser uma ferramenta muito poderosa devido à sua capacidade de lidar com grandes quantidades de dados. O uso de camadas ocultas excede as técnicas tradicionais, especialmente para reconhecimento de padrões. Uma das redes neurais profundas mais populares são as redes neurais convolucionais (CNN).

46151deep_learning_software_de_1380x735px_1150x_-8179956

Uma rede neural convolucional (CNN) é um tipo de Neuronal vermelho artificial (ANN) usado no reconhecimento e processamento de imagem, que é especialmente projetado para processar dados (píxeis).

87612082918_1325_convnetconv1-3625425

Fonte da imagem: Google.com

Antes de seguir em frente, devemos entender o que é a rede neural. Vamos lá…

Neuronal vermelho:

Uma rede neural é construída a partir de vários nós interconectados chamados “Neurônios”. Os neurônios são organizados em camada de entrada, camada oculta e camada de saída. A camada de entrada corresponde aos nossos preditores / características e a camada de saída para nossas variáveis ​​de resposta.

27250rede neural-1719512

Fonte da imagem: Google.com

Perceptron Multicamadas (MLP):

A rede neural com uma camada de entrada, uma ou mais camadas ocultas e uma camada de saída é chamada perceptron multicamadas (MLP). MLP é inventado por Frank Rosenblatt No ano de 1957. MLP mostrado abaixo tem 5 nós de entrada, 5 nós ocultos com duas camadas ocultas e um nó de saída

49705nn-7229061

Fonte da imagem: Google.com

Como esta rede neural?

– Os neurônios da camada de entrada recebem informações dos dados que eles processam e distribuem para o camadas escondidas.

– Essa informação, na sua vez, é processado por camadas ocultas e passado para a saída. neurônios.

– As informações desta rede neural artificial (ANN) é processado em termos de um função de despertar. Esta função realmente imita os neurônios do cérebro.

– Cada neurônio contém um valor de funções de gatilho e um valor limiar.

– o valor limiar é o valor mínimo que a entrada deve ter para ser ativada.

– A tarefa do neurônio é realizar uma soma ponderada de todos os sinais de entrada e aplicar a função de ativação na soma antes de passá-la para a próxima camada. (escondido ou sair).

Vamos entender o que é a soma de ponderação.

Digamos que temos valores 𝑎1, 𝑎2, 𝑎3, 𝑎4 para entrada e pesos como 𝑤1, 𝑤2, 𝑤3, 𝑤4 como entrada para um dos neurônios da camada oculta, digamos 𝑛𝑗, então a soma ponderada é representada como

𝑆𝑗 = σ 𝑖 = 1to4 𝑤𝑖 * 𝑎𝑖 + 𝑏𝑗

onde 𝑏𝑗: viés devido ao nó

33975ws-2271857

Fonte da imagem: Google.com

Quais são as funções de ativação?

Essas funções são necessárias para introduzir uma não linearidade na rede. A função de gatilho é aplicada e a saída é passada para a próxima camada.

* Possíveis funções *

• Sigmoide: função sigmóide é diferenciável. Produz uma saída entre 0 e 1.

• Tangente hiperbólica: A tangente hiperbólica também é diferenciável. Isso produz uma saída entre -1 e 1.

• ReLU: ReLU é a função mais popular. ReLU é amplamente utilizado em aprendizagem profunda.

• Softmax: a função softmax é usada para vários problemas de classificação de classe. É uma generalização da função sigmóide. Ele também produz uma saída entre 0 e 1

Agora, vamos com o nosso tema da CNN …

CNN:

Agora imagine que há uma foto de um pássaro, e você deseja identificá-lo se é realmente um pássaro ou outra coisa. A primeira coisa que você precisa fazer é alimentar os pixels da imagem na forma de matrizes para a camada de entrada da rede neural (Redes MLP são usadas para classificar essas coisas). Camadas ocultas realizam extração de recursos realizando vários cálculos e operações. Existem várias camadas ocultas, como convolução, o ReLU e a camada de agrupamento que executa a extração de recursos de sua imagem. Então, Finalmente, há uma camada totalmente conectada que você pode ver que identifica o objeto exato na imagem. Você pode entender muito facilmente com a figura a seguir:

20451cnn3-7880418

Fonte da imagem: Google.com

Convolução:-

A operação de convolução envolve operações aritméticas de matriz e cada imagem é representada como um array de valores (píxeis).

Vamos entender o exemplo:

a = [2,5,8,4,7,9]

b = [1,2,3]

Na operação de convolução, matrizes são multiplicadas uma a uma em termos de elementos, e o produto é agrupado ou somado para criar uma nova matriz que representa uma * b.

Os primeiros três elementos da matriz uma agora multiplique pelos elementos da matriz B. O produto é adicionado para obter o resultado e é armazenado em uma nova matriz de uma * b.

Este processo permanece contínuo até que a operação seja concluída..

29760cnn-2359666

Fonte da imagem: Google.com

Agrupamento:

Depois da convolução, existe outra operação chamada agrupamento. Então, Na corrente, convolução e agrupamento são aplicados sequencialmente nos dados, a fim de extrair algumas características dos dados. Após as camadas sequenciais agrupadas e convolucionais, os dados são achatados
em uma rede neural de feedback, também chamada de perceptron multicamadas.

80513compreensão20convolucional20neural20networks20through20visualizações20pytorch20image20classificador-9877439

Fonte da imagem: Google.com

Até aqui, vimos conceitos que são importantes para o nosso modelo de construção CNN.

Agora vamos seguir em frente para ver um estudo de caso da CNN.

1) Aqui vamos importar as bibliotecas necessárias que são necessárias para executar tarefas cnn.

import NumPy as np
%matplotlib inline
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import TensorFlow as tf
tf.compat.v1.set_random_seed(2019)

2) Aqui exigimos o seguinte código para formar o modelo CNN

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16,(3,3),ativação = "retomar" , input_shape = (180,180,3)) ,
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(32,(3,3),ativação = "retomar") ,  
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64,(3,3),ativação = "retomar") ,  
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128,(3,3),ativação = "retomar"),  
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(), 
    tf.hard.layers.Dense(550,ativação ="retomar"),      #Adding the Hidden layer
    tf.keras.layers.Dropout(0.1,semente = 2019),
    tf.hard.layers.Dense(400,ativação ="retomar"),
    tf.keras.layers.Dropout(0.3,semente = 2019),
    tf.hard.layers.Dense(300,ativação ="retomar"),
    tf.keras.layers.Dropout(0.4,semente = 2019),
    tf.hard.layers.Dense(200,ativação ="retomar"),
    tf.keras.layers.Dropout(0.2,semente = 2019),
    tf.hard.layers.Dense(5,ativação = "softmax")   #Adicionando a camada de saída
])

Uma imagem complicada pode ser muito grande e, portanto, encolhe sem perder características ou padrões, para que o agrupamento seja feito.

Aqui, Criar uma rede neural é inicializar a rede usando o modelo sequencial Keras.

Achatar (): o achatamento transforma uma matriz bidimensional de recursos em um vetor de características.

3) Agora vamos olhar para um resumo do modelo da CNN

model.summary()

Você imprimirá a seguinte saída

Modelo: "sequencial"
_________________________________________________________________
Camada (modelo)                 Parâmetros de forma de saída #   
=================================================================
conv2d (Conv2D)              (Nenhum, 178, 178, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (Nenhum, 89, 89, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (Nenhum, 87, 87, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (Nenhum, 43, 43, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (Nenhum, 41, 41, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (Nenhum, 20, 20, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (Nenhum, 18, 18, 128)       73856     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (Nenhum, 9, 9, 128)         0         
_________________________________________________________________
flatten (Achatar)            (Nenhum, 10368)             0         
_________________________________________________________________
dense (Denso)                (Nenhum, 550)               5702950   
_________________________________________________________________
dropout (Cair fora)            (Nenhum, 550)               0         
_________________________________________________________________
dense_1 (Denso)              (Nenhum, 400)               220400    
_________________________________________________________________
dropout_1 (Cair fora)          (Nenhum, 400)               0         
_________________________________________________________________
denso_2 (Denso)              (Nenhum, 300)               120300    
_________________________________________________________________
dropout_2 (Cair fora)          (Nenhum, 300)               0         
_________________________________________________________________
denso_3 (Denso)              (Nenhum, 200)               60200     
_________________________________________________________________
dropout_3 (Cair fora)          (Nenhum, 200)               0         
_________________________________________________________________
dense_4 (Denso)              (Nenhum, 5)                 1005      
========================================================== ===============
Params totais: 6,202,295
Parâmetros treináveis: 6,202,295
Params não treináveis: 0

4) Então agora somos obrigados a especificar otimizadores.

de tensorflow.keras.optimizers importar RMSprop,SGD,Adam
adam=Adam(lr=0,001)
model.compile(otimizador ="Adão", perda ="categorical_crossentropy", metrics = ['acc'])

O otimizador é usado para reduzir o custo calculado por entropia cruzada

a função de perda é usada para calcular o erro.

O termo métricas é usado para representar a eficiência do modelo.

5) Nesta etapa, veremos como configurar o diretório de dados e gerar dados de imagem.

bs=30         #Setting batch size
train_dir = "D:/Conjuntos de dados de ciência de dados/imagem/FastFood/trem/"   #Setting training directory
validation_dir = "D:/Data Science/Image Datasets/FastFood/test/"   #Setting testing directory
from tensorflow.keras.preprocessing.image import ImageDataGenerator 
# Todas as imagens serão redimensionadas por 1./255.
train_datagen = ImageDataGenerator( reescalou = 1.0/255. )
test_datagen = ImageDataGenerator( reescalou = 1.0/255. )
# Vaze imagens de treinamento em lotes de 20 using train_datagen generator
#Flow_from_directory function lets the classifier directly identify the labels from the name of the directories the image lies in
train_generator=train_datagen.flow_from_directory(train_dir,batch_size=bs,class_mode="categórico",target_size=(180,180))
# Imagens de validação de fluxo em lotes de 20 using test_datagen generator
validation_generator =  test_datagen.flow_from_directory(validation_dir,
                                                         batch_size=bs,
                                                         class_mode="categórico",
                                                         target_size=(180,180))

La salida será:

Fundar 1465 imagens pertencentes a 5 Classes.
Fundar 893 imagens pertencentes a 5 Classes.

6) Paso final del modelo de ajuste.

history = model.fit(train_generator,
                    validation_data=validation_generator,
                    steps_per_epoch=150 // Bs,
                    épocas=30,
                    validation_steps=50 // Bs,
                    verboso = 2)

La salida será:

Época 1/30
5/5 - 4s - perda: 0.8625 - acc: 0.6933 - val_loss: 1.1741 - val_acc: 0.5000
Época 2/30
5/5 - 3s - perda: 0.7539 - acc: 0.7467 - val_loss: 1.2036 - val_acc: 0.5333
Época 3/30
5/5 - 3s - perda: 0.7829 - acc: 0.7400 - val_loss: 1.2483 - val_acc: 0.5667
Época 4/30
5/5 - 3s - perda: 0.6823 - acc: 0.7867 - val_loss: 1.3290 - val_acc: 0.4333
Época 5/30
5/5 - 3s - perda: 0.6892 - acc: 0.7800 - val_loss: 1.6482 - val_acc: 0.4333
Época 6/30
5/5 - 3s - perda: 0.7903 - acc: 0.7467 - val_loss: 1.0440 - val_acc: 0.6333
Época 7/30
5/5 - 3s - perda: 0.5731 - acc: 0.8267 - val_loss: 1.5226 - val_acc: 0.5000
Época 8/30
5/5 - 3s - perda: 0.5949 - acc: 0.8333 - val_loss: 0.9984 - val_acc: 0.6667
Época 9/30
5/5 - 3s - perda: 0.6162 - acc: 0.8069 - val_loss: 1.1490 - val_acc: 0.5667
Época 10/30
5/5 - 3s - perda: 0.7509 - acc: 0.7600 - val_loss: 1.3168 - val_acc: 0.5000
Época 11/30
5/5 - 4s - perda: 0.6180 - acc: 0.7862 - val_loss: 1.1918 - val_acc: 0.7000
Época 12/30
5/5 - 3s - perda: 0.4936 - acc: 0.8467 - val_loss: 1.0488 - val_acc: 0.6333
Época 13/30
5/5 - 3s - perda: 0.4290 - acc: 0.8400 - val_loss: 0.9400 - val_acc: 0.6667
Época 14/30
5/5 - 3s - perda: 0.4205 - acc: 0.8533 - val_loss: 1.0716 - val_acc: 0.7000
Época 15/30
5/5 - 4s - perda: 0.5750 - acc: 0.8067 - val_loss: 1.2055 - val_acc: 0.6000
Época 16/30
5/5 - 4s - perda: 0.4080 - acc: 0.8533 - val_loss: 1.5014 - val_acc: 0.6667
Época 17/30
5/5 - 3s - perda: 0.3686 - acc: 0.8467 - val_loss: 1.0441 - val_acc: 0.5667
Época 18/30
5/5 - 3s - perda: 0.5474 - acc: 0.8067 - val_loss: 0.9662 - val_acc: 0.7333
Época 19/30
5/5 - 3s - perda: 0.5646 - acc: 0.8138 - val_loss: 0.9151 - val_acc: 0.7000
Época 20/30
5/5 - 4s - perda: 0.3579 - acc: 0.8800 - val_loss: 1.4184 - val_acc: 0.5667
Época 21/30
5/5 - 3s - perda: 0.3714 - acc: 0.8800 - val_loss: 2.0762 - val_acc: 0.6333
Época 22/30
5/5 - 3s - perda: 0.3654 - acc: 0.8933 - val_loss: 1.8273 - val_acc: 0.5667
Época 23/30
5/5 - 3s - perda: 0.3845 - acc: 0.8933 - val_loss: 1.0199 - val_acc: 0.7333
Época 24/30
5/5 - 3s - perda: 0.3356 - acc: 0.9000 - val_loss: 0.5168 - val_acc: 0.8333
Época 25/30
5/5 - 3s - perda: 0.3612 - acc: 0.8667 - val_loss: 1.7924 - val_acc: 0.5667
Época 26/30
5/5 - 3s - perda: 0.3075 - acc: 0.8867 - val_loss: 1.0720 - val_acc: 0.6667
Época 27/30
5/5 - 3s - perda: 0.2820 - acc: 0.9400 - val_loss: 2.2798 - val_acc: 0.5667
Época 28/30
5/5 - 3s - perda: 0.3606 - acc: 0.8621 - val_loss: 1.2423 - val_acc: 0.8000
Época 29/30
5/5 - 3s - perda: 0.2630 - acc: 0.9000 - val_loss: 1.4235 - val_acc: 0.6333
Época 30/30
5/5 - 3s - perda: 0.3790 - acc: 0.9000 - val_loss: 0.6173 - val_acc: 0.8000

La función anterior entrena la red neuronal utilizando el conjunto de entrenamiento y evalúa su rendimiento en el conjunto de prueba. As funções retornam duas métricas para cada época 'acc’ y ‘val_acc’ quais são a precisão das previsões obtidas no conjunto de treinamento e a precisão alcançada no conjunto de teste, respectivamente.

conclusão:

Por tanto, vemos que foi cumprido com precisão suficiente. Porém, qualquer um pode executar este modelo aumentando o número de épocas ou qualquer outro parâmetro.

Espero que tenha gostado do meu artigo. Compartilhe com os seus amigos, colegas.

A mídia mostrada neste artigo não é propriedade da DataPeaker e é usada a critério do autor.

Assine a nossa newsletter

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