мультикатегория Классификация изображений с керасом - PullRequest
1 голос
/ 17 марта 2019

Здравствуйте, я пытаюсь построить классификатор изображений с использованием Keras и CNN.

. Я уже обучил модель для двоичной классификации, и она работает очень хорошо.

Я применил те же знания, чтобы построитьКлассификация изображений с использованием нескольких категорий (что с треском проваливается). У меня есть 5 классов. Я создал 5 папок внутри jpeg dir, и структура директивы выглядит следующим образом:

C: \ Users \ jpeg

1.train

2.test

Внутри папки train У меня по 5 подпапок в каждой папке, соответствующей классу

C: \ Users \ jpeg \ train

1.Auth_Docs
2.Certificates_Reports
3.Document
4.Title
5.communication

, и я поместил соответствующие изображения в каждую папку

.структура в тестовой папке

исходный код:

import matplotlib.pyplot as plt
import cv2
%matplotlib inline
from keras.preprocessing.image import ImageDataGenerator
image_gen.flow_from_directory('C://Users/Jpeg/train')
image_gen.flow_from_directory('C://Users/jpeg/test')
image_shape = (150,150,3)

from keras.models import Sequential
from keras.layers import Activation, Dropout, Flatten, Dense, Conv2D, MaxPooling2D
model = Sequential()

model.add(Conv2D(filters=32, kernel_size=(3,3),input_shape=(150,150,3), activation='relu',))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(filters=64, kernel_size=(3,3),input_shape=(150,150,3), activation='relu',))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(filters=64, kernel_size=(3,3),input_shape=(150,150,3), activation='relu',))
model.add(MaxPooling2D(pool_size=(2, 2)))

# 
model.add(Flatten())

#hidden layer number of neurons
model.add(Dense(256, activation='relu'))

# Here we say randomly turn off 30% of neurons.
model.add(Dropout(0.3))

# Last layer(add number of layers based on number of categories)
model.add(Dense(5, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

#Training the model
batch_size = 16

train_image_gen = image_gen.flow_from_directory('C://Users/jpeg/train',
                                               target_size=image_shape[:2],
                                               batch_size=batch_size,
                                               class_mode='categorical'
                                               )
#Found 2434 images belonging to 5 classes.

test_image_gen = image_gen.flow_from_directory('C://Users/jpeg/test',
                                               target_size=image_shape[:2],
                                               batch_size=batch_size,
                                               class_mode='categorical'
                                              )
#Found 60 images belonging to 5 classes.

train_image_gen.class_indices
#o/p
{'Auth_Docs': 0,
 'Certificates_Reports': 1,
 'Document': 2,
 'Title': 3,
 'communication': 4}

#Fitting the model
from PIL import Image 
Image.MAX_IMAGE_PIXELS = None
results = model.fit_generator(train_image_gen,epochs=50,
                              steps_per_epoch=100,
                              validation_data=test_image_gen,
                             validation_steps=12)

#saving the model
model.save('Document_Classification.h5')
#results.accuracy for my model gives around 80% of accuracy

Теперь проблема с тестированием модели

from keras.models import load_model
new_model = load_model('Document_Classification.h5')
import numpy as np
from keras.preprocessing import image
import os,sys
from PIL import Image 
Image.MAX_IMAGE_PIXELS = None
for a,b,c in os.walk("C:/Users/jpeg/test/communication"):

   for i in c:
     doc_img = image.load_img(os.path.join(a,i), target_size=(150, 150)) 
     doc_img = image.img_to_array(doc_img)  
     doc_img = np.expand_dims(doc_img, axis=0)   
     doc_img = doc_img/255
     #print (a,i)

     prediction_prob = new_model.predict_classes(doc_img)
     print(prediction_prob )

только вывод, который я получаю,

[2]

[2]

[2]

[2]

независимо от того, какую папку я использую для проверки o / p, то же самое, т.е. в приведенном выше примере я использовал изображения папки связи, а o / p равно 2

то же самое o / p, когда я тестирую изображенияиз Auth_Docs, Title и т. д.

Я не вижу ничего плохого в моем коде, так как этот код работает для двоичной классификации.Пожалуйста, сообщите

Кроме того, я хочу выяснить, как связана метка с выводом, который я получаю.

Пожалуйста, сообщите.

Спасибо.

1 Ответ

0 голосов
/ 18 марта 2019

Есть так много вещей, которые вы можете сделать, чтобы устранить неполадки. Количество образцов действительно имеет значение; ты должен это знать. Ну, если бы я думал, что у меня достаточно образцов, я бы сохранил изображения из генераторов, чтобы проверить, в порядке ли они (аргумент flow_from_directory - save_to_dir).

https://keras.io/preprocessing/image/

Кроме того, пока вы тренируетесь, вы можете проверить тензорную панель с помощью обратных вызовов (если вы используете тензорный поток), чтобы увидеть, насколько плохо / хорошо идет ваше обучение. Посмотрите это видео . Видите, что самое важное - это val_acc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...