В этом блоге мы реализуем классификацию изображений с использованием глубокой сверточной сети 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, чтобы получить полный исходный код и набор данных. Посмотрите некоторые из моих предыдущих блогов:









Есть сомнения? Нужна помощь? Свяжитесь со мной!

LinkedIn: https://www.linkedin.com/in/dharmaraj-d-1b707898

Github:https://github.com/DharmarajPi