УДК 004.032.6 РАЗРАБОТКА И НАСТРОЙКА МОДЕЛИ НЕЙРОННОЙ СЕТИ ДЛЯ РЕШЕНИЯ ЗАДАЧИ МНОГОКЛАССОВОЙ КЛАССИФИКАЦИИ ИЗОБРАЖЕНИЙ Исаченков Александр Сергеевич оператор 5 научной роты, Россия, г. Анапа era_1mil.ru Фролов Никита Владимирович старший оператор 5 научной роты, Россия, г. Анапа era_1mil.ru Эльсессер Григорий Павлович оператор 5 научной роты, Россия, г. Анапа era_1mil.ru Аннотация. В данной статье рассмотрена задача разработки искусственной глубокой сверточной нейронной сети (CNN) для решения задачи многоклассовой классификации изображений, её обучение тестирование и корректировка. Предварительно были сформированы тренировочный и тестовый наборы данных, содержащие 60 и 25 изображений соответственно. По результатам тестирования обученной нейронной сети точность классификации составила 100% на тестовых данных. Ключевые слова. Классификация изображений, Keras, глубокое обучение, сверточная нейронная сеть, СNN. Annotation. This article considers the problem of developing an artificial deep convolutional neural network (CNN) for solving the problem of multiclass image classification, its training, testing and adjustment. The training and test data sets containing 60 and 25 images, respectively, were preliminarily formed. According to the results of testing the trained neural network, the classification accuracy was 100% on the test data. Keywords. Image classification, Keras, deep learning, convolutional neural network, CNN. Введение. Задача классификации изображений представляет собой задачу присвоения входному изображению одной метки из фиксированного набора. Это одна из базовых проблем компьютерного зрения, которая, несмотря на свою простоту, имеет большое разнообразие практических применений. В последние годы для классификации изображений широко применяется множество передовых классификационных подходов, таких как искусственные нейронные сети, нечеткие множества и экспертные системы, но каждый из них имеет свои проблемы и уровень их точности сравнительно меньше. Одним из передовых подходов к классификации является использование архитектуры глубокой сверточной нейронной сети (CNN) глубокого обучения, которая дает успешные результаты в решении многих задач машинного обучения. [1] Целью работы является разработка модели искусственной нейронной сети для решения задачи многоклассовой классификации изображений с точностью выше 95%. Для достижения поставленной цели необходимо решить следующие задачи: 1) подготовить данные (тренировочный и тестовый набор); 2) произвести аугментацию данных; 3) разработать архитектуру нейронной сети; 4) произвести обучение нейронной сети; 5) протестировать обученную модель; 6) скорректировать модель для получения лучших результатов. Объектом исследования являются задача классификации изображений. Предметом исследования является классификация изображений с использованием модели CNN. Для решения данной задачи разработана модель искусственной нейронной сети с использованием архитектуры CNN (свёрточная нейронная сеть). Материалы и методы исследования. Для построения модели нейронной сети разумно использовать подход сверточных нейронных сетей (CNN), так как сверточные нейронные сети – лучший инструмент для решения задач распознавания образов. Сверточные нейронные сети создают иерархию модульных шаблонов и понятий для представления видимого мира [2]. В качестве инструмента для разработки использована библиотека для машинного обучения Keras. Keras – открытая библиотека, написанная на языке Python и обеспечивающая взаимодействие с искусственными нейронными сетями. Она представляет собой надстройку над фреймворком TensorFlow. Нацелена на оперативную работу с сетями глубинного обучения, при этом спроектирована так, чтобы быть компактной, модульной и расширяемой. Она была создана как часть исследовательских усилий проекта ONEIROS, а ее основным автором и поддерживающим является Франсуа Шолле, инженер Google [3]. В данной модели используется три сверточных блока, состоящих из сверточного слоя, слоя пакетной нормализации, слоя пулинга и слоя Dropout. Суть операции свертки заключается в том, что каждый фрагмент изображения умножается на матрицу (ядро) свёртки поэлементно, а результат суммируется и записывается в аналогичную позицию выходного изображения. Пакетная нормализация – это тип слоя (BatchNormalization в Keras). Он может адаптивно нормализовать данные, даже если среднее и дисперсия изменяются во время обучения. Его принцип действия основан на вычислении экспоненциального скользящего среднего и дисперсии данных, наблюдаемых в процессе обучения. Основное назначение пакетной нормализации – помочь распространению градиента подобно остаточным связям и дать возможность создавать более глубокие сети [2]. Суть операции max pooling заключается в агрессивном уменьшении разрешения карты признаков, во многом подобное свертке с пробелами. Операция выбора максимального значения из соседних заключается в следующем: из входной карты признаков извлекается окно, и из него выбирается максимальное значение для каждого канала [2]. Прореживание (dropout) распространенных приемов – один из наиболее эффективных и регуляризации для нейронных сетей. Прореживание, которое применяется к слою, заключается в удалении (присваивании нуля) случайно выбираемым признакам на этапе обучения [2]. Чтобы добавить классификатор поверх сверточной нейронной сети, необходимо преобразовать выход с тремя измерениями (осями), к размерности с одним измерением. Для этого нужно использовать слой Flatten. Так как решается задача множественной классификации, то на последнем слое необходимо использовать полносвязный слой Dense и функцию активации softmax. Функция softmax может гарантировать, что сумма всех выходных нейронов равна 1, а координаты полученного вектора при этом трактуются как вероятности того, что объект принадлежит к классу i. На вход будет подаваться цветное изображения размером 64 x 64 пикселя, поэтому входной слой будет иметь размерность (64, 64, 3). Модель имеет 3 свёрточных блока, каждый из которых состоит из слоя свёртки, слоя пакетной нормализации, слоя пулинга и слоя dropout. Все пулинг-слои имею ядро 2x2. Слои свёртки имеют ядро 3x3, а количество фильтров в них возрастает: 8 в первом слое, 16 во втором и 32 в третьем. Последний полносвязный слой имеет 128 нейронов на входе. model = Sequential() model.add(Conv2D(8, (3, 3), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3))) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(16, (3, 3), activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(32, (3, 3), activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(BatchNormalization()) model.add(Dropout(0.5)) model.add(Dense(train_generator.num_classes, activation='softmax')) На выходе должен быть вектор из 6 значений, соответствующих вероятности того, что изображения принадлежит i-ому классу. Следовательно, выходной слой имеет размерность (, 6). Таким образом, модель имеет 155 126 параметров из которых 154 758 обучаемые. Архитектура нейронной сети представлена на рисунке 1. Рисунок 1 – Архитектура нейронной сети Обучение нейронной сети. На данном этапе необходимо создать генератор изображений и 2 итератора путем вызова метода flow_from_directory – один для обучающей и один для валидационной выборки. Изображения между выборками делятся в соотношении 80/20. Изображения загружаются из папки «augmented Mushrooms», в которую на этапе аугментации были сохранены аугментированные изображения. datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2) batch_size = 16 train_generator = datagen.flow_from_directory( AUGMENTED_DIR, target_size=(IMG_SIZE, IMG_SIZE), batch_size=batch_size, class_mode='categorical', subset='training', shuffle=True ) validation_generator = datagen.flow_from_directory( AUGMENTED_DIR, target_size=(IMG_SIZE, IMG_SIZE), batch_size=batch_size, class_mode='categorical', subset='validation', shuffle=True ) Модуль keras.callbacks включает в себя ряд встроенных обратных вызовов. При обучении данной модели были использованы: ModelCheckpoint, EarlyStopping и ReduceLROnPlateau. Обратный вызов EarlyStopping можно используется для прерывания процесса обучения, если находящаяся под наблюдением целевая метрика не улучшалась на протяжении заданного количества эпох. Обратный вызов ModelCheckpoint позволяет сохранять состояние модели в ходе обучения (и, при необходимости, сохранять только лучшую модель: версию модели, достигшую лучшего качества к концу эпохи). Обратный вызов ReduceLROnPlateau можно использовать для снижения скорости обучения, когда потери на проверочных данных перестают уменьшаться. Уменьшение или увеличение скорости обучения в точке перегиба кривой потерь – эффективная стратегия выхода из локального минимума в ходе обучения [2]: earlystop = EarlyStopping(patience=5) learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', patience=2, verbose=2, factor=0.5, min_lr=0.00001) modelCheckpoint = ModelCheckpoint(MODEL_FILE, monitor='val_accuracy', verbose=2, save_best_only=True) Далее следует запуск процесса обучения сети, для чего в случае использования библиотеки Keras необходимо вызвать метод fit сети – он пытается адаптировать (fit) модель под обучающие данные. Обучение модели будет продолжаться в течение 10 эпох: epochs = 10 STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size STEP_SIZE_VALID = validation_generator.n // validation_generator.batch_size history = model.fit( train_generator, steps_per_epoch=STEP_SIZE_TRAIN, epochs=epochs, validation_data=validation_generator, validation_steps=STEP_SIZE_VALID, callbacks=callbacks ) Рисунок 2 – Точность на этапах обучения и проверки На этапе обучения и на этапе проверки точность растёт с каждой эпохой. Итоговая точность составила 0,99. Признаков переобучения не наблюдается. Можно сделать вывод о том, что модель научилась обобщать данные, как в тренировочном, так и за пределами тренировочного набора. Тестирование. Для того чтобы протестировать обученную модель на новых данных, которые модель еще «не видела», нужно загрузить изображения из папки «Mushrooms Test», и для каждого из них вызвать метод model.predict(x), а затем вывести изображения и предсказанные для них классы на экран. def showTestResults(images): plt.figure(figsize=(12, 12)) from math import sqrt, ceil n = ceil(sqrt(len(images))) for i, img in enumerate(images): resized = cv2.resize(img_to_array(img) * 1./255, (IMG_SIZE, IMG_SIZE)) x = resized.reshape(1, IMG_SIZE, IMG_SIZE, 3) prediction = model.predict(x) ax = plt.subplot(n, n, i+1) plt.imshow(img) ax.set_yticklabels([]) ax.set_xticklabels([]) plt.xticks([]) plt.yticks([]) plt.xlabel(class_map[np.argmax(prediction)]) plt.tight_layout() plt.show() Результаты работы модели на тестовой выборке представлены на рисунке 3. Рисунок 3 – Результаты тестирования модели По рисунку 3 видно, что 2 из 25 изображений были классифицированы неверно. Таким образом, точность предсказания на тестовой выборке составила 92%. Корректировка модели и данных. В результате нескольких циклов обучения в тестовом наборе были выявлены изображения, на которых модель ошибается чаще всего (рис. 4). Рисунок 4 – Изображения, на которых модель ошибается чаще всего Переместим эти изображения из тестового датасета в тренировочный, а в тестовый датасет поместим те, которые более похожи на общую массу изображений. Изменим количество обучаемых параметров. Для этого увеличим количество фильтров в свёрточных слоях с 8, 16 и 32 до 12, 24 и 48 соответственно. Размер входного изображения уменьшим с 64 x 64 до 48 x 48. Таким образом, модель имеет 113,422 параметров, из которых 112,998 обучаемые. Расчёт параметров модели представлен на рисунке 5. Рисунок 5 – Расчёт параметров модели Аналогичным образом обучим и протестируем модель. Рисунок 6 – Точность на этапах обучения скорректированной модели Для автоматизированной оценки точности модели тестовые изображения были распределены по папкам с названиями, соответствующими названиям классов, аналогично тренировочному набору данных, использован метод flow_from_directory для автоматической разметки и model.evaluate для оценки точности модели. datagen = ImageDataGenerator(rescale=1./255) test_generator = datagen.flow_from_directory( TEST_ZIP_NAME, target_size=(IMG_SIZE, IMG_SIZE), class_mode='categorical', ) print('Точность на тестовой выборке:\033[1m', model.evaluate(test_generator, verbose=0)[1] * 100, '%') Рисунок 7 – Оценка точности модели Рисунок 8 – Результаты тестирования скорректированной модели метод По рисунку 8 видно, что 25 из 25 изображений были классифицированы верно. Точность предсказания на тестовой выборке составила 100%, то есть увеличилась на 8%. Таким образом, была доказана важность датасета для обучения с учителем. Заключение. Была разработана модель искусственной свёрточной нейронной сети для многоклассовой классификации изображений. Нейронная сеть была обучена и протестирована. По результатам тестирования обученной нейронной сети точность классификации составила 100% на тестовых данных. СПИСОК ИСТОЧНИКОВ 1. Sangaiah A. K. Deep learning and parallel computing environment for bioengineering systems. Amsterdam: Academic Press, 2019. 2. Шолле Ф. Глубокое обучение на Python. СПб: Питер, 2018. 400 c. 3. Keras [Электронный ресурс] // URL: https://ru.wikipedia.org/wiki/. (дата обращения: 12.04.2023). 4. Keras: the Python deep learning API [Электронный ресурс] // URL: https://keras.io/ (дата обращения: 12.04.2023). 5. Keras-Слои - Русскоязычная документация Keras [Электронный ресурс] // URL: https://ru-keras.com/ (дата обращения: 12.04.2023). 6. TensorFlow [Электронный ресурс] // URL: https://www.tensorflow.org/ (дата обращения: 12.04.2023). 7. Machine Learning Tutorials - Learn Machine Learning and Artificial Intelligence [Электронный ресурс] // URL: https://studymachinelearning.com/ (дата обращения: 12.04.2023). 8. Гафаров Ф.М. Искусственные нейронные сети и приложения: учеб. пособие / Ф.М. Гафаров, А.Ф. Галимянов. Казань: Изд-во Казан. ун-та, 2018. 121 с. 9. Ростовцев В.С. Искусственные нейронные сети: учебник. СанктПетербург: Лань, 2019. 213 с. 10. Чару А. Нейронные сети и глубокое обучение: учебный курс, 2020. – 752 с.