
Полная версия
Классификация изображений на Python. От классического компьютерного зрения до CNN и AlexNet
model_best_tiny_KNC.fit(train_d_tiny, train_l_tiny) # Обучение модели на обучающих данных
time_mid = time.time()
time_train = time_mid - time_start # Время, затраченное на обучение
label_pred_tiny_KNC = model_best_tiny_KNC.predict(test_d_tiny) # Прогнозирование с помощью модели
time_test = time.time() - time_mid # Время, затраченное на тестирование
acc_tiny_KNC = print_stats(label_pred_tiny_KNC, test_l_tiny, time_train, time_test, "Tiny Images + Nearest Neighbor")
Точность модели «Tiny Images + Nearest Neighbor» составляет 55,20%.
Обучение: Время выполнения: 0,02 секунды.
Тестирование: Время выполнения: 0,73 секунды.
Точность для класса Class01 составляет 21%.
Точность для класса Class02 составляет 38%.
Точность для класса Class03 составляет 76%.
Точность для класса Class04 составляет 50%.
Точность для Class05 составляет 93%.
Точность для класса Class06 составляет 28%.
Точность для класса Class07 составляет 74%.
Точность для класса Class08 составляет 40%.
Точность для класса 09 составляет 53%.
Точность для класса Class10 составляет 87%.
Точность для класса Class11 составляет 29%.
Точность для класса 12 составляет 62%.
Точность для класса Class13 составляет 40%.
Точность для класса Class14 составляет 65%.
Точность для класса 15 составляет 72%.
# Обучение и оценка с помощью классификатора SVM
time_start = time.time() # Время начала
model_best_tiny_SVM = LinearSVC(C=lambda_tiny, random_state=0) # Вызов LinearSVC
model_best_tiny_SVM.fit(train_d_tiny, train_l_tiny) # Обучение SVM
time_mid = time.time()
time_train = time_mid - time_start # Время обучения
label_pred_tiny_SVM = model_best_tiny_SVM.predict(test_d_tiny) # Вызов clf.predict
time_test = time.time() - time_mid # Время тестирования
acc_tiny_SVM = print_stats(label_pred_tiny_SVM, test_l_tiny, time_train, time_test, "Tiny Images + Linear SVC")
Точность модели «Tiny Images + Linear SVC» составляет 41,73%.
Обучение: Время выполнения: 0,19 секунды.
Тестирование: Время выполнения: 0,02 секунды.
Точность для Class01 составляет 26%.
Точность для Class02 составляет 22%.
Точность для Class03 составляет 75%.
Точность для Class04 составляет 11%.
Точность составляет 78% для Class05.
Точность для класса Class06 составляет 21%.
Точность для класса Class07 составляет 63%.
Точность для класса 08 составляет 18%.
Точность для класса Class09 составляет 44%.
Точность для класса Class10 составляет 64%.
Точность для класса Class11 составляет 26%.
Точность для класса Class12 составляет 42%.
Точность для класса Class13 составляет 22%.
Точность для класса Class14 составляет 42%.
Точность для класса 15 составляет 72%.
Последний шаг — использование матрицы путаницы [9] для отображения точности прогнозирования. Нам нужно вызвать функцию plot_confusion_matrix(), чтобы получить две матрицы путаницы.
# Вывод и построение графика матрицы путаницы
def plot_confusion_matrix(cm, classes, normalize=True, title=' ', cmap=plt.cm. Blues):
if normalize: # Нормализация
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
plt.figure(figsize=(10, 8))
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title('Матрица путаницы: ' + title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)
fmt = '.2f', если normalize, иначе 'd'
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, format(cm[i, j], fmt), horizontalalignment="center", color="white", если cm[i, j] > thresh, иначе "black")
plt.ylabel ("Истинные метки")
plt.xlabel («Предсказанные метки»)
plt.tight_layout()
# Алгоритм 1: Представление миниатюрных изображений
# Матрица путаницы (метод ближайшего соседа)
cm11 = confusion_matrix(test_l_tiny, label_pred_tiny_KNC)
plot_confusion_matrix(cm11, c_names, title='Миниатюрные изображения + метод ближайшего соседа')
# Матрица путаницы (линейный SVC)
cm12 = confusion_matrix(test_l_tiny, label_pred_tiny_SVM)
plot_confusion_matrix(cm12, c_names, title='Миниатюрные изображения + линейный SVC')
Матрицы путаницы для обоих классификаторов показаны на рисунках 3 и 4 соответственно.
Диагональ матрицы путаницы показывает точность распознавания каждого класса. Несмотря на то что представление миниатюрных изображений используется здесь лишь как простая базовая модель, для классов 03, 05, 07, 10 и 15 точность превышает 60 % при обоих классификаторах.
Размер миниатюрных изображений последовательно задавался равным (8, 8), (16, 16), (32, 32), (64, 64) и (128, 128). Результаты приведены в таблице 1. В целом при увеличении размера изображения точность растёт как для KNN, так и для SVM; однако при каждом удвоении линейного размера объём вычислений увеличивается примерно в четыре раза, поскольку площадь изображения возрастает в четыре раза.
Что касается представления миниатюрных изображений, максимальная точность прогнозирования классификаторов KNN и SVM составила 59,07 % и 57,13 % соответственно; во всех случаях классификации классификатор KNN показал лучшие результаты, чем SVM.
Табл. 1. Результаты точности прогнозирования при работе с мелкими изображениями.
Размер изображения
(8,8)
(16,16)
(32,32)
(64,64)
(128, 128)
Максимальная точность (%)
KNN
48,73
55,20
55,20
57,47
59,07
SVM
32,93
41,73
48,20
53,40
57,13
Время выполнения (сек.)
KNN
0,25
0,97
3,88
14,97
58,05
SVM
0,19
0,57
1,66
6,10
25,76
Глава 3: Характеристики и классификаторы на основе гистограмм градиента направления
Гистограмма ориентированных градиентов (Histogram of Oriented Gradients, сокращённо HOG) [ [10], [11]] — это полезный инструмент, используемый для извлечения признаков изображения с последующей классификацией изображений.
HOG сначала разбивает изображение на ячейки и блоки, затем вычисляет направления градиентов пикселей и формирует локальные гистограммы направлений. Совокупность этих гистограмм образует дескриптор признаков изображения.
Чтобы использовать HOG-признаки для классификации объектов, сначала при необходимости приводят обучающие и тестовые изображения к заданному размеру. Затем для каждого изображения вычисляют HOG-дескриптор, после чего обучают классификатор, например KNN или SVM, на признаках обучающей выборки и её метках. На заключительном этапе обученный классификатор применяется к HOG-признакам тестовых изображений.
Вызвав функцию load_data(), определённую в главе 2, и установив для её входного параметра is_hog значение True, мы можем извлечь HOG-признаки из каждого изображения в обучающем или тестовом наборе данных, как показано ниже.
# Получить миниатюрные изображения из обучающего и тестового наборов данных
img_size_hog = (64, 64)
train_d_hog, train_l_hog = load_data('data/Train', img_size_hog, flatten=True, shuffle=True, is_hog=True)
test_d_hog, test_l_hog = load_data('data/Test', img_size_hog, flatten=True, shuffle=True, is_hog=True)
Завершена загрузка 1500 изображений за 17,24 секунды для обучения.
Завершена загрузка 1500 изображений для тестирования за 17,21 секунды.
По сравнению с миниатюрными изображениями время загрузки данных в данном случае увеличилось более чем в десять раз, что связано с тем, что вычисление HOG-признаков занимает больше времени.
Теперь мы вызовем функцию get_best_parameter() (см. главу 2), чтобы получить оптимальное значение n_neighbors для KNN-классификатора и оптимальное значение lambda для SVM-классификатора. Результаты вывода приведены ниже. Кривые изменения точности прогнозирования в зависимости от значений входных параметров классификаторов показаны на рисунках 5 и 6.
# Получить значение n_neighbors для KNeighborsClassifier() с максимальной точностью
n_neighbors_hog = get_best_parameter(train_d_hog, train_l_hog, test_d_hog, test_l_hog, "KNC")
Точность модели составляет 61,13% (n_neighbors = 1,00).
Точность модели составляет 56,73% (n_neighbors = 2,00).
Точность модели составляет 56,40% (n_neighbors = 3,00).
Точность модели составляет 56,33% (n_neighbors = 4,00).
Точность модели составляет 55,13% (n_ neighbors = 5,00).
Точность модели составляет 53,60 % (n_neighbors = 6,00).
Точность модели составляет 52,00 % (n_neighbors = 7,00).
Точность модели составляет 51,87% (n_neighbors = 8,00).
Точность модели составляет 51,33% (n_neighbors = 9,00).
Точность модели составляет 50,60 % (n_neighbors = 10,00).
Наивысшая точность модели составляет 61,13% (n_neighbors = 1,000000).
Общее время выполнения: 155,58 секунд.
Когда размер изображения установлен на (64, 64), точность классификатора KNN колеблется в диапазоне от 50,60 % до 61,13 %; точность классификатора SVM — от 47,80 % до 48,73 %. Время выполнения составило 156 секунд и 378 секунд соответственно, то есть на каждое значение ушло 15,6 секунд и 18,9 секунд.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.









