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.