Классификация изображений на Python. От классического компьютерного зрения до CNN и AlexNet
Классификация изображений на Python. От классического компьютерного зрения до CNN и AlexNet

Полная версия

Классификация изображений на Python. От классического компьютерного зрения до CNN и AlexNet

Язык: Русский
Год издания: 2026
Добавлена:
Настройки чтения
Размер шрифта
Высота строк
Поля
На страницу:
2 из 2

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 Кошелек, бонусными картами или другим удобным Вам способом.

Конец ознакомительного фрагмента
Купить и скачать всю книгу
На страницу:
2 из 2