В этом блоге мы реализуем классификацию изображений с использованием глубокой сверточной сети VGG-16, используемой в качестве основы для трансферного обучения. Для эксперимента мы будем использовать набор данных Fruits и классифицировать объекты изображения на 3 класса (Apple, Banana, Orange).
Что такое трансферное обучение?
Трансферное обучение обычно относится к процессу, в котором модель, обученная одной проблеме, каким-то образом используется для решения второй связанной проблемы. Например, знания, полученные при обучении распознаванию апельсинов, можно применить при попытке распознать манго. В глубоком обучении трансферное обучение — это метод, при котором модель нейронной сети сначала обучается проблеме, аналогичной решаемой проблеме. Трансферное обучение имеет то преимущество, что сокращает время обучения модели обучения и может привести к меньшей ошибке обобщения.
ВГГ16
VGG-16 — это сверточная нейронная сеть, состоящая из 16 слоев. Вы можете загрузить предварительно обученную версию сети, обученную на более чем миллионе изображений из базы данных ImageNet. Предварительно обученная сеть может классифицировать изображения по 1000 категориям объектов, таким как клавиатура, мышь, карандаш и многие животные. В результате сеть изучила богатые представления функций для широкого спектра изображений. Сеть имеет входной размер изображения 224 на 224.
Реализация с использованием Python
Импорт библиотек
import numpy as np import pandas as pd import matplotlib.pyplot as plt from glob import glob import sklearn.metrics as metrics import tensorflow as tf from keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.models import Model from tensorflow.keras.layers import Flatten, Dense from tensorflow.keras.applications import VGG16
Инициализация
num_classes=3 IMAGE_SHAPE = [224, 224] batch_size=32 #change for better accuracy based on your dataset epochs = 5 #change for better accuracy based on your dataset
Загрузите и скомпилируйте модель VGG
vgg = VGG16(input_shape = (224,224,3), weights = ‘imagenet’, include_top = False) for layer in vgg.layers: layer.trainable = False x = Flatten()(vgg.output) x = Dense(128, activation = ‘relu’)(x) x = Dense(64, activation = ‘relu’)(x) x = Dense(num_classes, activation = ‘softmax’)(x) model = Model(inputs = vgg.input, outputs = x) model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
Генератор данных изображения
Класс ImageDataGenerator позволяет случайным образом поворачивать изображения на любой градус от 0 до 360, предоставляя целочисленное значение в аргументе rotate_range.
trdata = ImageDataGenerator() train_data_gen = trdata.flow_from_directory(directory=”Train”,target_size=(224,224), shuffle=False, class_mode=’categorical’) tsdata = ImageDataGenerator() test_data_gen = tsdata.flow_from_directory(directory=”Test”, target_size=(224,224),shuffle=False, class_mode=’categorical’)
Обучите модель
training_steps_per_epoch = np.ceil(train_data_gen.samples / batch_size) validation_steps_per_epoch = np.ceil(test_data_gen.samples / batch_size) model.fit_generator(train_data_gen, steps_per_epoch = training_steps_per_epoch, validation_data=test_data_gen, validation_steps=validation_steps_per_epoch,epochs=epochs, verbose=1) print(‘Training Completed!’)
Точность
Y_pred = model.predict(test_data_gen, test_data_gen.samples / batch_size) val_preds = np.argmax(Y_pred, axis=1) import sklearn.metrics as metrics val_trues =test_data_gen.classes from sklearn.metrics import classification_report print(classification_report(val_trues, val_preds))
Матрица путаницы
Матрица путаницы — это таблица, которая часто используется для описания производительности модели классификации (или «классификатора») на наборе тестовых данных, для которых известны истинные значения.
Y_pred = model.predict(test_data_gen, test_data_gen.samples / batch_size) val_preds = np.argmax(Y_pred, axis=1) val_trues =test_data_gen.classes cm = metrics.confusion_matrix(val_trues, val_preds) cm
Сохраните модель
keras_file=”Model.h5" tf.keras.models.save_model(model,keras_file)
Прогноз с использованием нового изображения
#create new file test.py and run this file from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions import numpy as np #load saved model model = load_model(‘Model.h5’) img_path = ‘fresh.jpg’ img = image.load_img(img_path, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) preds=model.predict(x) # create a list containing the class labels class_labels = [‘Apple’,’Banana’,’Orange’] # find the index of the class with maximum score pred = np.argmax(preds, axis=-1) # print the label of the class with maximum score print(class_labels[pred[0]])
Заключение
В этом посте вы узнали, как использовать трансферное обучение для классификации изображений. Трансферное обучение является гибким, позволяя использовать предварительно обученные модели непосредственно в качестве предварительной обработки извлечения признаков и интегрировать их в совершенно новые модели. Keras обеспечивает удобный доступ ко многим высокопроизводительным моделям VGG, Inception и ResNet. Вот моя ссылка на Github, чтобы получить полный исходный код и набор данных. Посмотрите некоторые из моих предыдущих блогов:
Есть сомнения? Нужна помощь? Свяжитесь со мной!