Classificação de imagens errando muito

Home Fóruns Fórum Deep Learning com Python de A a Z: O Curso Completo Classificação de imagens errando muito

Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #39716
    Mateus Scheper
    Participante

      Olá!

      Estou tentando fazer um modelo para identificar três pessoas em um conjuntos de fotos, mas por algum motivo está dando muita divergência.
      Ao realizar o treinamento, vejo a precisão apontar no máximo 0.4643 no “val_accuracy”, que inclusive fica sempre no mesmo número e não aumenta mais. E ao rodar os testes manuais com o model.predict(), ele quase sempre retorna o mesmo resultado, seja 0, 1 ou 2 (pois são três classes). Alguém poderia apontar onde estou errando?

      Código:

      import os
      import numpy as np
      from keras import Sequential
      from keras.layers import Conv2D, BatchNormalization, MaxPooling2D, Flatten, Dense, Dropout
      from keras.preprocessing.image import ImageDataGenerator
      from keras.utils import image_utils
      
      image_size = 128
      images_dir = 'resources/images/'
      train_set_dir = images_dir + '/train_set'
      test_set_dir = images_dir + '/test_set'
      
      model = Sequential()
      model.add(Conv2D(128, (3, 3), input_shape=(image_size, image_size, 3), activation='relu'))
      model.add(BatchNormalization())
      model.add(MaxPooling2D(pool_size=(2, 2)))
      
      model.add(Conv2D(128, (3, 3), input_shape=(image_size, image_size, 3), activation='relu'))
      model.add(BatchNormalization())
      model.add(MaxPooling2D(pool_size=(2, 2)))
      
      model.add(Flatten())
      
      model.add(Dense(512, activation='relu'))
      model.add(Dropout(0.2))
      model.add(Dense(512, activation='relu'))
      model.add(Dropout(0.2))
      model.add(Dense(3, activation='softmax'))
      model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
      
      train_image_generator = ImageDataGenerator(rescale=1. / 255,
      rotation_range=7,
      horizontal_flip=True,
      shear_range=0.2,
      height_shift_range=0.07,
      zoom_range=0.2)
      test_image_generator = ImageDataGenerator(rescale=1. / 255)
      
      updated_train_images = train_image_generator.flow_from_directory(train_set_dir,
      target_size=(image_size, image_size))
      updated_test_images = test_image_generator.flow_from_directory(test_set_dir,
      target_size=(image_size, image_size))
      model.fit(updated_train_images,
      steps_per_epoch=1,
      epochs=15,
      validation_data=updated_test_images,
      validation_steps=1)
      
      
      # Teste manual
      
      images_dir = 'resources\\images\\test_set\\'
      images_dir_classes = ['class1', 'class2', 'class3']
      
      for c in images_dir_classes:
      images_found = os.listdir(images_dir + c)
      images = []
      for img_name in images_found:
      path = images_dir + c + '\\' + img_name
      imagem_teste = image_utils.load_img(path=path, target_size=(image_size, image_size))
      imagem_teste = image_utils.img_to_array(imagem_teste)
      imagem_teste /= 255
      imagem_teste = np.expand_dims(imagem_teste, axis=0)
      previsao = model.predict(imagem_teste)
      previsao = (previsao > 0.5)
      print('Img: {}, result: {}'.format(path, previsao.argmax()))

      Nas imagens de treino, tenho 34 da “class1”, 22 da “class2” e 14 da “class3”.
      Nas imagens de teste, tenho 16 da “class1”, 13 da “class2” e 7 da “class3”.

      Esse é o último teste que fiz:
      Found 55 images belonging to 3 classes.
      Found 28 images belonging to 3 classes.
      Epoch 1/15
      1/1 [==============================] – 8s 8s/step – loss: 2.7526 – accuracy: 0.2174 – val_loss: 4.0583 – val_accuracy: 0.4643
      Epoch 2/15
      1/1 [==============================] – 6s 6s/step – loss: 31.8275 – accuracy: 0.5000 – val_loss: 4.1187 – val_accuracy: 0.2500
      Epoch 3/15
      1/1 [==============================] – 6s 6s/step – loss: 23.6612 – accuracy: 0.3750 – val_loss: 4.5897 – val_accuracy: 0.2500
      Epoch 4/15
      1/1 [==============================] – 6s 6s/step – loss: 8.9260 – accuracy: 0.5625 – val_loss: 4.2077 – val_accuracy: 0.4643
      Epoch 5/15
      1/1 [==============================] – 6s 6s/step – loss: 9.6433 – accuracy: 0.6562 – val_loss: 4.6132 – val_accuracy: 0.4643
      Epoch 6/15
      1/1 [==============================] – 5s 5s/step – loss: 5.2914 – accuracy: 0.6522 – val_loss: 4.2309 – val_accuracy: 0.4643
      Epoch 7/15
      1/1 [==============================] – 6s 6s/step – loss: 9.2544 – accuracy: 0.4375 – val_loss: 4.9251 – val_accuracy: 0.2857
      Epoch 8/15
      1/1 [==============================] – 6s 6s/step – loss: 6.0937 – accuracy: 0.6875 – val_loss: 4.5431 – val_accuracy: 0.4286
      Epoch 9/15
      1/1 [==============================] – 5s 5s/step – loss: 1.4614 – accuracy: 0.7826 – val_loss: 4.9873 – val_accuracy: 0.4286
      Epoch 10/15
      1/1 [==============================] – 6s 6s/step – loss: 4.7670 – accuracy: 0.8125 – val_loss: 5.2148 – val_accuracy: 0.4643
      Epoch 11/15
      1/1 [==============================] – 6s 6s/step – loss: 4.3927 – accuracy: 0.7188 – val_loss: 5.2612 – val_accuracy: 0.4643
      Epoch 12/15
      1/1 [==============================] – 6s 6s/step – loss: 6.5084 – accuracy: 0.7500 – val_loss: 5.2081 – val_accuracy: 0.4286
      Epoch 13/15
      1/1 [==============================] – 5s 5s/step – loss: 3.9349 – accuracy: 0.8696 – val_loss: 5.7533 – val_accuracy: 0.4643
      Epoch 14/15
      1/1 [==============================] – 6s 6s/step – loss: 1.6328 – accuracy: 0.8438 – val_loss: 6.1089 – val_accuracy: 0.4643
      Epoch 15/15
      1/1 [==============================] – 5s 5s/step – loss: 2.4676 – accuracy: 0.7826 – val_loss: 6.3981 – val_accuracy: 0.4643

      #39720
      Denny Ceccon
      Moderador

        Olá Mateus,

        É difícil dizer sem debugar o código, mas nós não costumamos debugar implementações pessoais. As partes mais evidentes (configuração da última camada, função de custo) me parecem estar OK. Eu te recomendo rodar seu código em uma IDE que te permita debugar, assim você executa linha por linha, isso ajuda a encontrar problemas.

        #39722
        Mateus Scheper
        Participante

          Denny,

          Agradeço pelo retorno.
          É possível ver como os pixels mais importantes estão sendo detectados em cada época do treino? Gostaria de saber que tipo de coisa o modelo está identificando para poder ter uma ideia do que está acontecendo de errado.

          #39723
          Denny Ceccon
          Moderador

            Não tem como, lembre-se que as redes neurais são conhecidas como “caixas pretas” porque não é possível entender como funciona seu processo de decisão. Mas mesmo assim, eu desconfio que o problema não seja relacionado ao funcionamento da rede mas sim à formatação dos dados, seria importante observar se a rede está recebendo os rótulos corretos por exemplo.

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.