Министерство науки и высшего образования Российской Федерации ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ» Факультет математики и информационных технологий Кафедра программного обеспечения вычислительной техники и автоматизированных систем КУРСОВАЯ РАБОТА по дисциплине «Методы искусственного интеллекта» Программная реализация моделей и методов искусственного интеллекта в информационно - телекоммуникационных системах Пояснительная записка ОГУ 09.04.04. 3022. 967 ПЗ Руководитель канд. техн. наук, доцент ____________ А. М. Семенов «__» _________________2022 г. Исполнитель Студент группы З-21ПИнж(м) РИтС ____________ «__» _________________2022 г. Оренбург 2022 Утверждаю заведующий кафедрой программного обеспечения вычислительной техники и автоматизированных систем ______________ Н.А. Соловьев подпись «____»____________________2022 г. ЗАДАНИЕ на выполнение курсовой работы студенту (фамилия имя отчество) по направлению подготовки (специальности) 09.04.04 Программная инженерия по дисциплине «Методы искусственного интеллекта» наименование дисциплины, модуля 1 Тема работы: Cверточная нейронная сеть для распознавания 2 Срок сдачи студентом работы «__»____________2022 г. 3 Цель и задачи работы Цель: автоматизация процесса решения задачи распознавания документов и программная реализация сверточной нейронной сети для распознавания паспортов. Задачи: изучение теоретических сведений; анализ предметной области; анализ существующих программных средств; выбор моделей данных, метода и инструментальных средств разработки программной системы; проектирование и разработка приложения. 4 Исходные данные к работе: набор из 1000 изображений паспортов и набор из 1000 случайных изображений. 5 Перечень вопросов, подлежащих разработке: подготовить набор данных для обучения сверточной нейронной сети; спроектировать архитектуру сверточной нейронной сети; разработать программное средство; обосновать выбор программных средств разработки. Дата выдачи и получения задания Руководитель «__»____________2022г. __________ подпись Студент «__» ________________ 2022 г. __________ подпись А.М Семенов Аннотация Пояснительная записка содержит 27 страниц текста, включает 17 рисунков, 10 источников и 1 приложение. Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2016. Целью курсовой работы является программная реализация моделей и методов искусственного интеллекта в информационно - телекоммуникационных системах. Курсовая работа состоит из введения, основной части, заключения, списка использованных источников, а также приложения. Основная часть включает в себя 2 раздела. В первом разделе рассматриваются теоретические сведения о сверточных нейронных сетях. Во втором разделе приведена программная реализация сверточной нейронной сети по распознаванию изображения паспорта. ОГУ 09.04.04. 3620. 967 ПЗ Изм. Лист № докум. Подп. Дата Разраб. Пров. Семенов А.М. Н. контр. Зав. каф. Соловьев Н.А. Программная реализация моделей и методов искусственного интеллекта в информационно – телекоммуникационных системах Лит. Лист Листов КР 3 27 20ПИнж(м)РИтС Содержание Введение ........................................................................................................................... 5 1 Исследовательский раздел .......................................................................................... 6 1.1 Теоретические сведения ........................................................................................ 6 1.2 Архитектура и принцип работы ........................................................................... 6 1.3 Слой свертки .......................................................................................................... 8 1.4 Слой активации ...................................................................................................... 9 1.5 Пулинг или слой субдискретизации .................................................................. 10 1.6 Обучение ............................................................................................................... 11 1.7 Преимущества и недостатки ............................................................................... 11 2 Проектный раздел ...................................................................................................... 13 2.1 Используемые технологии .................................................................................. 13 2.2 Подготовка данных .............................................................................................. 13 2.3 Проектирование модели ...................................................................................... 15 2.4 Обучение сверточной нейронной сети .............................................................. 16 2.5 Тестирование сверточной нейронной сети ....................................................... 19 Заключение .................................................................................................................... 22 Список использованных источников .......................................................................... 23 Приложение А (обязательное) Листинг программы ................................................. 24 Лист 4 Введение На сегодняшний день нейронные сети имеют очень большую популярность в различных сферах деятельности. Например, в медицине с помощью нейронных сетей реализовывают распознавание различных болезней по снимкам. В экономике нейронные сети позволяют максимально быстро и качественного обрабатывать огромные массивы данных и выдавать различные прогнозы [1]. Также нейронные сети можно встретить в современных автомобилях, в которых есть система автопилота. Еще нейронные сети могут распознавать объекты, людей, текст. В робототехнике нейронные сети применяются для управления роботами [2]. На самом деле, нейронные сети можно применить где угодно. Главное, правильно подобрать алгоритм решения задачи, правильно спроектировать нейронную сеть, должным образом обучить, и тогда нейронная сеть будет выдавать требуемый результат [3]. В данной курсовой работе рассматривается такая тема, как распознавание образов. Это достаточно сложная задача, но в то же время очень актуальная, так как технологии развиваются очень быстро, и поэтому решение определенных задач и принятие определенных решений требуют особой точности, эффективности и достоверности. Поэтому здесь и применяются нейронные сети, в том числе задача распознавания образов. Задача распознавания образов – большая задача. В данной курсовой работе приведен пример программной реализации распознавания паспортов с помощью сверточных нейронных сетей. Лист 5 1 Исследовательский раздел 1.1 Теоретические сведения Сверточная нейронная сеть – это специальная архитектура искусственных нейронный сетей, нацеленная на эффективное распознавание образов. Идея сверточных нейронных сетей заключается в чередовании сверточных слоёв и субдискретизирующих слоёв [4]. Структура сети – однонаправленная, то есть без обратных связей. В основном сверточные нейронные сети являются многослойными. Для обучения используются стандартные методы, чаще всего метод обратного распространения ошибки. Функция активации нейронов может быть любая, по выбору исследователя. Название архитектура сети получила из-за наличия операции свёртки, суть которой в том, что каждый фрагмент изображения умножается на матрицу (ядро) свёртки поэлементно, а результат суммируется и записывается в аналогичную позицию выходного изображения. Работа свёрточной нейронной сети обычно интерпретируется как переход от конкретных особенностей изображения к более абстрактным деталям, и далее к ещё более абстрактным деталям вплоть до выделения понятий высокого уровня. При этом сеть самонастраивается и вырабатывает сама необходимую иерархию абстрактных признаков (последовательности карт признаков), фильтруя маловажные детали и выделяя существенное. Подобная интерпретация носит скорее метафорический или иллюстративный характер. Фактически «признаки», вырабатываемые сложной сетью, малопонятны и трудны для интерпретации настолько, что в практических системах не особенно рекомендуется пытаться понять содержания этих признаков или пытаться их «подправить», вместо этого рекомендуется усовершенствовать саму структуру и архитектуру сети, чтобы получить лучшие результаты. Так, игнорирование системой каких-то существенных явлений может говорить о том, что либо не хватает данных для обучения, либо структура сети обладает недостатками, и система не может выработать эффективных признаков для данных явлений. 1.2 Архитектура и принцип работы В обычном перцептроне, который представляет собой полносвязную нейронную сеть, каждый нейрон связан со всеми нейронами предыдущего слоя, причём каждая связь имеет свой персональный весовой коэффициент. В свёрточной нейронной сети в операции свёртки используется лишь ограниченная матрица весов небольшого размера, которую «двигают» по всему обрабатываемому слою (в самом начале – непосредственно по входному изображению), формируя после каждого сдвига сигнал активации для нейрона следующего слоя с аналогичной Лист 6 позицией. То есть для различных нейронов выходного слоя используются одна и та же матрица весов, которую также называют ядром свёртки. Её интерпретируют как графическое кодирование какого-либо признака, например, наличие наклонной линии под определённым углом. Тогда следующий слой, получившийся в результате операции свёртки такой матрицей весов, показывает наличие данного признака в обрабатываемом слое и её координаты, формируя так называемую карту признаков. Естественно, в свёрточной нейронной сети набор весов не один, а целая гамма, кодирующая элементы изображения (например, линии и дуги под разными углами). При этом такие ядра свёртки не закладываются исследователем заранее, а формируются самостоятельно путём обучения сети классическим методом обратного распространения ошибки. Проход каждым набором весов формирует свой собственный экземпляр карты признаков, делая нейронную сеть многоканальной (много независимых карт признаков на одном слое). Также следует отметить, что при переборе слоя матрицей весов её передвигают обычно не на полный шаг (размер этой матрицы), а на небольшое расстояние. Так, например, при размерности матрицы весов 5x5 её сдвигают на один или два нейрона (пикселя) вместо пяти, чтобы не «перешагнуть» искомый признак. Операция субдискретизации выполняет уменьшение размерности сформированных карт признаков. В данной архитектуре сети считается, что информация о факте наличия искомого признака важнее точного знания его координат, поэтому из нескольких соседних нейронов карты признаков выбирается максимальный и принимается за один нейрон уплотнённой карты признаков меньшей размерности. За счёт данной операции, помимо ускорения дальнейших вычислений, сеть становится более инвариантной к масштабу входного изображения. Рисунок 1.1 – Архитектура сверточной нейронной сети Лист 7 Рассмотрим типовую структуру свёрточной нейронной сети более подробно. Сеть состоит из большого количества слоёв. После начального слоя (входного изображения) сигнал проходит серию свёрточных слоёв, в которых чередуется собственно свёртка и субдискретизация (пулинг). Чередование слоёв позволяет составлять «карты признаков» из карт признаков, на каждом следующем слое карта уменьшается в размере, но увеличивается количество каналов. На практике это означает способность распознавания сложных иерархий признаков. Обычно после прохождения нескольких слоёв карта признаков вырождается в вектор или даже скаляр, но таких карт признаков становятся сотни. На выходе свёрточных слоёв сети дополнительно устанавливают несколько слоёв полносвязной нейронной сети (перцептрон), на вход которому подаются оконечные карты признаков. Рисунок 1.2 – Пример работы сверточной нейронной сети 1.3 Слой свертки Слой свёртки – это основной блок свёрточной нейронной сети. Слой свёртки включает в себя для каждого канала свой фильтр, ядро свёртки которого обрабатывает предыдущий слой по фрагментам (суммируя результаты поэлементного произведения для каждого фрагмента). Весовые коэффициенты ядра свёртки (небольшой матрицы) неизвестны и устанавливаются в процессе обучения. Особенностью свёрточного слоя является сравнительно небольшое количество параметров, устанавливаемое при обучении. Так, например, если исходное изображение имеет размерность 100x100 пикселей по трём каналам (это значит 30000 входных нейронов), а свёрточный слой использует фильтры c ядром 3x3 пикселя с выходом на 6 каналов, тогда в процессе обучения определяется только 9 весов ядра, однако по всем сочетаниям каналов, то есть 9x3x6 = 162, в таком случае данный слой требует нахождения только 162 параметров, что существенно меньше количества искомых параметров полносвязной нейронной сети. Лист 8 Рисунок 1.3 – Слой свертки 1.4 Слой активации Скалярный результат каждой свёртки попадает на функцию активации, которая представляет собой некую нелинейную функцию. Слой активации обычно логически объединяют со слоем свёртки (считают, что функция активации встроена в слой свёртки). Функция нелинейности может быть любой по выбору исследователя, традиционно для этого использовали функции типа гиперболического тангенса или сигмоиды. Однако в 2000х годах была предложена и исследована новая функция активации – ReLU, которая позволила существенно ускорить процесс обучения и одновременно упростить вычисления (за счёт простоты самой функции), что означает блок линейной ректификации, вычисляющий функцию . То есть по сути это операция отсечения отрицательной части скалярной величины. По состоянию на 2017 год эта функция и её модификации (Noisy ReLU, Leaky ReLU и другие) являются наиболее часто используемыми функциями активации в глубоких нейросетях, в частности, в свёрточных. Существует методика определения оптимального числа блоков линейной ректификации. Рисунок 1.4 – Функция активации ReLU (линейный выпрямитель) Лист 9 1.5 Пулинг или слой субдискретизации Слой пулинга (иначе подвыборки, субдискретизации) представляет собой нелинейное уплотнение карты признаков, при этом группа пикселей (обычно размера 2x2) уплотняется до одного пикселя, проходя нелинейное преобразование. Наиболее употребительна при этом функция максимума. Преобразования затрагивают непересекающиеся прямоугольники или квадраты, каждый из которых ужимается в один пиксель, при этом выбирается пиксель, имеющий максимальное значение. Операция пулинга позволяет существенно уменьшить пространственный объём изображения. Пулинг интерпретируется так: если на предыдущей операции свёртки уже были выявлены некоторые признаки, то для дальнейшей обработки настолько подробное изображение уже не нужно, и оно уплотняется до менее подробного. К тому же фильтрация уже ненужных деталей помогает не переобучаться. Слой пулинга, как правило, вставляется после слоя свёртки перед слоем следующей свёртки. Кроме пулинга с функцией максимума можно использовать и другие функции — например, среднего значения или L2-нормирования. Однако практика показала преимущества именно пулинга с функцией максимума, который включается в типовые системы. В целях более агрессивного уменьшения размера получаемых представлений, всё чаще находят распространение идеи использования меньших фильтров или полный отказ от слоёв пулинга. Рисунок 1.5 – Пулинг с функцией максимума и фильтром 2x2 с шагом 2 После нескольких прохождений свёртки изображения и уплотнения с помощью пулинга система перестраивается от конкретной сетки пикселей с высоким разрешением к более абстрактным картам признаков, как правило на каждом следующем слое увеличивается число каналов и уменьшается размерность изображения в каждом канале. В конце концов остаётся большой набор каналов, хранящих небольшое число данных (даже один параметр), которые интерпретируются как самые абстрактные понятия, выявленные из исходного изображения. Лист 10 Эти данные объединяются и передаются на обычную полносвязную нейронную сеть, которая тоже может состоять из нескольких слоёв. При этом полносвязные слои уже утрачивают пространственную структуру пикселей и обладают сравнительно небольшой размерностью (по отношению к количеству пикселей исходного изображения). 1.6 Обучение Наиболее простым и популярным способом обучения является метод обучения с учителем (на маркированных данных) – метод обратного распространения ошибки и его модификации. Но существует также ряд техник обучения свёрточной сети без учителя. Например, фильтры операции свёртки можно обучить отдельно и автономно, подавая на них вырезанные случайным образом кусочки исходных изображений обучающей выборки и применяя для них любой известный алгоритм обучения без учителя (например, автоассоциатор или даже метод kсредних) – такая техника известна под названием patch-based training. Соответственно, следующий слой свёртки сети будет обучаться на кусочках от уже обученного первого слоя сети. Также можно скомбинировать сверточную нейросеть с другими технологиями глубинного обучения. Например, сделать свёрточный авто-ассоциатор, свёрточную версию каскадных ограниченных машин Больцмана, обучающихся за счёт вероятностного математического аппарата, свёрточную версию разреженного кодирования (sparse coding), названную deconvolutional networks («развертывающими» сетями). Для улучшения работы сети, повышения её устойчивости и предотвращения переобучения применяется также исключение (дропаут) – метод тренировки подсети с выбрасыванием случайных одиночных нейронов. 1.7 Преимущества и недостатки Преимущества сверточных нейронных сетей. один из лучших алгоритмов по распознаванию и классификации изображений; по сравнению с полносвязной нейронной сетью (типа перцептрона) – гораздо меньшее количество настраиваемых весов, так как одно ядро весов используется целиком для всего изображения, вместо того, чтобы делать для каждого пикселя входного изображения свои персональные весовые коэффициенты. Это подталкивает нейросеть при обучении к обобщению демонстрируемой информации, а не попиксельному запоминанию каждой показанной картинки в мириадах весовых коэффициентов, как это делает перцептрон; Лист 11 удобное распараллеливание вычислений, а, следовательно, возможность реализации алгоритмов работы и обучения сети на графических процессорах; относительная устойчивость к повороту и сдвигу распознаваемого изображения; обучение при помощи классического метода обратного распространения ошибки. Недостатки сверточных нейронных сетей – слишком много варьируемых параметров сети; непонятно, для какой задачи и вычислительной мощности какие нужны настройки. Так, к варьируемым параметрам можно отнести: количество слоёв, размерность ядра свёртки для каждого из слоёв, количество ядер для каждого из слоёв, шаг сдвига ядра при обработке слоя, необходимость слоёв субдискретизации, степень уменьшения ими размерности, функция по уменьшению размерности (выбор максимума, среднего и т. п.), передаточная функция нейронов, наличие и параметры выходной полносвязной нейросети на выходе свёрточной. Все эти параметры существенно влияют на результат, но выбираются исследователями эмпирически. Существует несколько выверенных и прекрасно работающих конфигураций сетей, но не хватает рекомендаций, по которым нужно строить сеть для новой задачи. Лист 12 2 Проектный раздел 2.1 Используемые технологии Для реализации сверточной нейронной сети по распознаванию изображений был выбран язык программирования Python версии 3.8.6 64bit. Данная версия языка выбрана потому, что на последней версии Python 3.9.0 нет поддержки библиотеки tensorflow. А сам язык Python был выбран потому, что как раз именно этот язык и предназначен для реализации различных нейронных сетей [5]. Python уже содержит большое количество библиотек по проектированию нейронных сетей, по работе с изображениями, массивами данных и графиками. Для проектирования нейронной сети была выбрана библиотека TensorFlow – открытая программная библиотека для машинного обучения, разработанная компанией Google для решения задач построения и тренировки нейронной сети с целью автоматического нахождения и классификации образов, достигая качества человеческого восприятия [6]. Также для работы с нейронной сетью была выбрана библиотека Keras – открытая нейросетевая библиотека, написанная на языке Python, которая в данном случае используется как надстройка над библиотекой TensorFlow [7]. Для работы с изображениями была выбрана библиотека OpenCV, которая позволяет максимально быстро и просто работать с изображениями, используя всего лишь несколько строк кода на языке Python [8]. Для работы с вычислениями используется библиотека NumPy – это библиотека с открытым исходным кодом для языка программирования Python, которая предоставляет поддержку многомерных массивов и поддержку высокоуровневых математических функций [9]. Для работы с графиками была выбрана библиотека Matplotlib – это библиотека на языке программирования Python для визуализации данных двумерной графикой [10]. 2.2 Подготовка данных Цель – необходимо спроектировать сверточную нейронную сеть, которая будет распознавать, какое фото было загружено: паспорт или не паспорт. Отсюда имеем два класса: паспорт и не паспорт. Эти два класса будут использоваться далее при проектировании сверточной нейронной сети. Как известно, чем больше исходных данных, тем лучше нейронная сеть будет обучена. Поэтому, в качестве обучающих данных было подготовлено 2000 изображений, среди которых 1000 изображений – фотографии паспортов, а остальные 1000 изображений – случайные изображения. Лист 13 Рисунок 2.1 – Обучающий набор данных В качестве тестовых данных, был подготовлен набор из 200 изображений, где 100 из них – фото паспорта, а оставшиеся 100 – случайные изображения. Рисунок 2.2 – Тестовый набор данных Лист 14 Все изображения имеют разное разрешение, что не подходит для обучения. Поэтому необходимо все изображения привести к одному разрешению. Так как необходимо распознавать фото паспорта, то было принято решение привести все изображения к разрешению 200x200 пикселей, чтобы нейросеть выделяла больше признаков с изображений паспортов, иначе при меньшем разрешении есть вероятность того, что нейросеть не сможет распознать некоторые изображения паспортов, например, размытые изображения или изображения с дефектами. Далее все изображения необходимо сделать монохромными, то есть чернобелыми, так как нейронная сеть в данном случае не будет обращать внимание на цвет изображения, а лишь только выделять признаки. На рисунке 2.3 представлена функция обработки изображения. На вход этой функции подается путь, где хранится изображение, затем эта функция считывает изображение по заданному пути, далее с помощью метода cvtColor изображение делается черно-белым, а затем метод resize изменяет разрешение изображения. Последний шаг этой функции – перевести изображение в массив байт с помощью метода img_to_array из пакета keras, который встроен в библиотеку tensorflow. Рисунок 2.3 – Функция обработки изображения 2.3 Проектирование модели За создание модели отвечает функция create_model. На рисунке 2.4 представлен код этой функции. Сначала создаем объект класса Sequential. Затем получаем разрешение изображений из константы IMAGE_MAX_SIZE. И далее поочерёдно добавляем слои в модель. На 80 строке создается первый сверточный слой, где 32 – размер фильтра, (3, 3) – размер ядра, relu – активационная функция, input_shape – размер изображения, 1 – цветовой канал (черно-белый). Второй слой – слой дискретизации, где (2, 2) – размер пулинга. Далее идет второй сверточный слой, но уже с размером фильтра 64, и такой же слой дискретизации. Затем сверточный слой снова повторяется, и происходит преобразование данных в одномерный вектор, после идёт полносвязный слой, а после него – выходной слой, который имеет 2 выхода (паспорт и не паспорт). Во всех слоях использовалась функция активации relu – линейный выпрямитель. После чего модель компилируется и возвращается методом для дальнейшей работы. Лист 15 Рисунок 2.4 – Код функции create_model 2.4 Обучение сверточной нейронной сети Для обучения сверточной нейронной сети был выбран метод обучения с учителем. То есть метод на маркированных данных. На рисунке 2.5 представлена функция, которая готовит данные для обучения. Чтобы разметить данные, эта функция смотрит на название файла. Например, изображение паспорта подписано как «0_passport.png», а случайное изображение подписано как «0_not_passport.png». А далее просто сохраняется метка для каждого файла. Если это фото паспорта, то у него метка «0». Если это любое другое изображение, то у него метка «1». Данная функция проходит по каждому изображению в папке, с помощью функции prepare_image, готовит это изображение для обучения, далее размечает каждое изображение, и возвращает массив данных изображений и массив меток каждого изображения. Рисунок 2.5 - Код функции load_image_dataset Лист 16 После выполнения функции load_image_dataset в папке проекта будет сохранен демонстрационный файл, который показывает, как были подготовлены изображения для обучения. На рисунке 2.6 представлены результаты подготовки данных для обучения. Рисунок 2.6 – Данные для обучения сверточной нейронной сети Как мы видим, изображения были приведены к единому размеру и цветовой гамме, а также были размечены. После этого можно переходить к обучению сверточной нейронной сети. Само обучение сверточной нейронной сети происходит внутри функции train_model, код которой представлен на рисунке 2.7. Эта функция принимает на Лист 17 вход созданную ранее модель, массивы изображений и массивы меток этих изображений, и количество эпох. И с помощью метода fit на этой модели запускается обучение. После чего результаты обучения, а именно веса этой сверточной нейронной сети сохраняются в файл model.h5 для дальнейшего использования, чтобы заново не запускать обучение. Рисунок 2.7 – Код функции train_model Результаты обучения сверточной нейронной сети на 15 эпохах представлены на рисунке 2.8. Как мы видим – точность обучения составила 0,9458. Рисунок 2.8 – Процесс обучения сверточной нейронной сети После обучения в папку проекта будет сохранен файл, показывающий результаты обучения в виде графика. На рисунке 2.9 представлен график обучения сверточной нейронной сети. Зеленая линяя обозначает точность обучения, красная линяя обозначает точность оценивания. Оранжевая линяя обозначает потери при оценивании. Синяя линяя обозначает потери при обучении. По оси X расположены количество эпох. По оси Y расположены значения точности и потерь. Лист 18 Рисунок 2.9 – Результаты обучения сверточной нейронной сети 2.5 Тестирование сверточной нейронной сети Чтобы протестировать работу обученной сверточной нейронной сети, необходимо использовать тестовый набор данных. Код функции recognize, которая проверяет работу сверточной нейронной сети, представлен на рисунке 2.10. Данная функция принимает на вход обученную модель и изображения, которые надо распознать. Чтобы начать распознавание, необходимо вызывать метод predict на объекте модели. Результатом выполнения этого метода будет массив, каждый элемент которого это также массив из двух элементов, где первый элемент, вероятность того, что это паспорт, а второй элемент, вероятность того, что это не пас- Лист 19 порт. Это происходит потому, так как сверточная нейронная сеть имеет два выхода. Рисунок 2.10 – Код функции recognize Рисунок 2.11 – Пример вывода результатов распознавания После того, как метод recognize завершится, в папке проекта будет сохранен файл results.png, который будет содержать результаты работы сверточной нейронной сети. Изображение с результатами работы сверточной нейронной сети представлены на рисунке 2.12. Как видно – сверточная нейронная сеть отлично справилась с поставленной задачей. Среди 25 изображений нейронная сеть нашла 10 изображений паспортов. Полный код сверточной нейронной сети представлен в приложении А. Лист 20 Рисунок 2.12 – Результаты работы сверточной нейронной сети Лист 21 Заключение В данной курсовой работе была поставлена задача – спроектировать сверточную нейронную сеть по распознаванию изображения паспорта. Для решения поставленной задачи были пройдены следующие этапы: были изучены теоретические сведения о сверточных нейронных сетях; рассмотрены преимущества и недостатки таких сетей; были выбраны технологии для реализации сверточной нейронной сети; был собран датасет из 2000 обучающих изображений и из 200 тестовых изображений; была спроектирована архитектура сверточной нейронной сети; далее данная нейронная сеть была обучена методом с учителем (на маркированных данных); было проведено тестирование сверточной нейронной сети на тестовом наборе данных из 200 изображений; был получен результат работы сверточной нейронной сети по распознаванию изображения паспорта. Точность обучения сверточной нейронной сети составила 0,9458 или 95%, что является отличным результатом. Данная нейронная сеть способна отделять изображение паспорта среди любых случайных изображений. Таким образом, цель данной курсовой работы можно считать достигнутой. Лист 22 Список использованных источников 1. Семенов, А. М. Программная реализация моделей и методов искусственного интеллекта в информационно-телекоммуникационных системах [Электронный ресурс] : методические указания для студентов, обучающихся по программам высшего профессионального образования по направлению подготовки 231000.68 Программная инженерия / А. М. Семенов; М-во образования и науки Рос. Федерации, Федер. гос. бюджет. образоват. учреждение высш. проф. образования "Оренбург. гос. ун-т", Каф. прогр. обеспечения вычисл. техники и автоматизир. систем. - Электрон. текстовые дан. (1 файл: 0.58 Мб). - Оренбург : ОГУ, 2013. - 57 с. - Загл. с тит. экрана. -Adobe Acrobat Reader 6.0 2. Семенов, А.М. Интеллектуальные системы [Текст] : учебное пособие для студентов, обучающихся по программам высшего профессионального образования по направлениям подготовки 230100.68 Информатика и вычислительная техника, 231000.68 Программная инженерия / А. М. Семенов, Н. А. Cоловьев, Е. Н. Чернопрудова, А. С. Цыганков; М-во образования и науки Рос. Федерации, Федер. гос. бюджет. образоват. учреждение высш. проф. образования "Оренбург. гос. ун-т". - Оренбург : ОГИМ, 2014. - 237 с. - Библиогр.: с. 218-221. - Прил.: с. 222-236. - ISBN 978-5-9723-0158-4. Издание на др.носителе [Электронный ресурс] 3. Семенов, А.М. Интеллектуальные системы [Электронный ресурс] : учебное пособие для студентов, обучающихся по программам высшего профессионального образования по направлениям подготовки 230100.68 Информатика и вычислительная техника, 231000.68 Программная инженерия / А. М. Семенов [и др.]; М-во образования и науки Рос. Федерации, Федер. гос. бюджет. образоват. учреждение высш. проф. образования "Оренбург. гос. ун-т". - Электрон. текстовые дан. (1 файл: 3.85 Мб). - Оренбург : ОГУ, 2013. - 236 с. - Загл. с тит. экрана. Adobe Acrobat Reader 6.0 - ISBN 978-5-9723-0158-4. Издание на др. носителе [Текст] 4. Гудфеллоу Я., Бенджио И., Курвилль А. Г93 Глубокое обучение / пер. с анг. А. А. Слинкина. – 2-е изд., испр. – М.: ДМК Пресс, 2018. – 652 с.: цв. ил. ISBN 978-5-97060-618-6 5. Python Официальный сайт [Электронный ресурс]. Режим доступа: https://python.org. – 20.12.2020 6. TesnorFlow Официальный сайт [Электронный ресурс]. Режим доступа: https:// tensorflow.org. – 20.12.2020 7. Keras Официальный сайт [Электронный ресурс]. Режим доступа: https://keras.io/. – 20.12.2020 8. OpenCV Официальный сайт [Электронный ресурс]. Режим доступа: https://opencv.org/. – 20.12.2020 9. NumPy Официальный сайт [Электронный ресурс]. Режим доступа: https://numpy.org/. – 20.12.2020 10. Matplotlib Официальный сайт [Электронный ресурс]. Режим доступа: https://matplotlib.org/. – 20.12.2020 Лист 23 Приложение А (обязательное) Листинг программы import os import cv2 import numpy from matplotlib import pyplot as plt from tensorflow.keras.layers import Conv2D, Dense, Flatten, MaxPooling2D from tensorflow.keras.losses import SparseCategoricalCrossentropy from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.preprocessing.image import img_to_array # Settings setup IMAGE_MAX_SIZE = 200, 200 # Witdh and heingt in px TRAIN_PASSPORTS_FOLDER = "passports-training-dataset/" TEST_PASSPORTS_FOLDER = "passports-test-dataset/" CLASS_NAMES = ['passport', 'not_passport'] # Temporarily disable tensorflow logs because we don't use GPU now # os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # os.environ["CUDA_VISIBLE_DEVICES"] = "-1" def prepare_image(path): image = cv2.imread(path) image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image = cv2.resize(image, IMAGE_MAX_SIZE) image = img_to_array(image) return image def load_image_dataset(path_dir): images = [] labels = [] for file in os.listdir(path_dir): try: img = prepare_image(path_dir + file) except Exception: Лист 24 continue images.append(img) if "not_passport" in file: labels.append(1) else: labels.append(0) return numpy.array(images), numpy.array(labels) def save_results(images, labels, filename): plt.clf() plt.figure(figsize=(10, 10)) for i in range(25): plt.subplot(5, 5, i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(images[i], cmap=plt.cm.binary) plt.xlabel(CLASS_NAMES[labels[i]]) plt.savefig(filename) def save_graphics(history, epochs): plt.clf() arange = numpy.arange(0, epochs) plt.plot(arange, history.history['loss'], label='loss') # потери при обучения plt.plot(arange, history.history['val_loss'], label='val_loss') # потери при оценке plt.plot(arange, history.history['accuracy'], label='accuracy') # точность обучения plt.plot(arange, history.history['val_accuracy'], label='val_accuracy') # точность оценивания plt.xlabel('Epoch') plt.ylabel('Loss/Accuracy') plt.legend(loc='lower right') plt.savefig("graphics.png") def create_model(): model = Sequential() width, height = IMAGE_MAX_SIZE model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(width, height, 1))) # Сверточный слой 1 Лист 25 model.add(MaxPooling2D((2, 2))) # слой дискретизации на основе выборки 1 model.add(Conv2D(64, (3, 3), activation='relu')) # Сверточный слой 2 model.add(MaxPooling2D((2, 2))) # слой дискретизации на основе выборки 2 model.add(Conv2D(64, (3, 3), activation='relu')) # Сверточный слой 3 model.add(Flatten()) # преобразование в одномерный вектор model.add(Dense(64, activation='relu')) # Полносвязный слой 1 model.add(Dense(2)) # Полносвязный слой 2 model.compile(optimizer='adam', loss=SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) print(model.summary()) return model def train_model(model, train_images, train_labels, test_images, test_labels, epochs): history = model.fit(train_images, train_labels, epochs=epochs, validation_data=(test_images, test_labels)) model.save('model.h5') return model, history def check_model_accuracy(model, test_images, test_labels): loss, accuracy = model.evaluate(test_images, test_labels) print(f'Model accuracy: {accuracy}. Model loss: {loss}') def recognize(model, images): predictions = model.predict(images) print(predictions) save_results(images, numpy.argmax(predictions, axis=1), "results.png") def main(): print("Prepare train images...") train_images, train_labels = load_image_dataset(TRAIN_PASSPORTS_FOLDER) train_images = train_images / 255.0 save_results(train_images, train_labels, "train_images.png") print("Train images was prepared, you can check train_images.png file.") print("Prepare test images...") test_images, test_labels = load_image_dataset(TEST_PASSPORTS_FOLDER) test_images = test_images / 255.0 save_results(test_images, test_labels, "test_images.png") print("Test images was prepared, you can check test_images.png file.") Лист 26 retrain = True model_file = "model.h5" if os.path.exists(model_file) and not retrain: print("Found model.h5 file. Load existed model.") model = load_model(model_file) else: print("Create new model...") model = create_model() epochs = 15 print(f"Start model training on {epochs} epochs.") model, history = train_model(model, train_images, train_labels, test_images, test_labels, epochs) save_graphics(history, epochs) print("Model training was successfully finished.") check_model_accuracy(model, test_images, test_labels) print("Start recognizing...") recognize(model, test_images) if __name__ == "__main__": main() Лист 27