Вы находитесь на странице: 1из 66

Содержание

ВВЕДЕНИЕ 2
1. ОТ МАШИННОГО ОБУЧЕНИЯ ДО ИИ. МЕТОДЫ
РАСПОЗНАВАНИЯ ОТОБРАЖАЕМЫХ ДАННЫХ ОБЪЕКТА 5
1.1 Пример алгоритма обучения представлению 5
1.2 Решения глубокого обучения 6
1.3 Пример модели глубокого обучения. 7
2. ОБНАРУЖЕНИЕ ОБЪЕКТОВ С ИСПОЛЬЗОВАНИЕМ
ГЛУБОКОГО ОБУЧЕНИЯС МЕТОДАМИ YOLO V2, R-CNN, FASTER R-
CNN 17
2.1 Обнаружение объектов с использованием с методом YOLO v2
глубокого обучения 17
2.2 Pаспoзнавания oбъектoв с пoмoщью глубoкoгo oбучения и R-CNN
25
2.3 Обнаружение объектов с использованием глубокого обучения и
Faster R-CNN. 36
3. ВЫПОЛНЕНИЕ ПРОГРАММЫ 45
3.1 Создание графического интерфейса 45
3.2 Проверка работоспобности программы 47
ЗАКЛЮЧЕНИЕ 53
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 55
ПРИЛОЖЕНИЕ 57
ВВЕДЕНИЕ

Актуальность исследования. Двадцать лет назад, в середине 2000-х


годов, в машинном обучении началась революция. В 2005-2006 годах в
университете Монреаля группы исследователей под руководством Джеффри
Хинтона (Geoffrey Hinton) в университете Торонто и Йошуа Бенджи (Yoshua
Bengio) научились обучать глубокие нейронные сети. И это перевернуло весь
мир машинного обучения! Теперь в самых разнообразных предметных
областях лучшие результаты получаются с помощью глубоких нейронных
сетей. Одним из первых громких промышленных успехов стало
распознавание речи: разработанные группой Хинтона глубокие сети очень
быстро радикально улучшили результаты распознавания по сравнению с
оттачивавшимися десятилетиями классическими подходами, и сегодня
любой распознаватель, включая голосовые помощники вроде Apple Siri и
Google Now, работает исключительно на глубоких нейронных сетях. А
сейчас, к 2024 году, люди научились обучать самые разные архитектуры
глубоких нейронных сетей, и те решают абсолютно разные задачи: от
распознавания лиц до вождения автомобилей и игры в го [14].
Изобретатели давно мечтали создать мыслительные машины. Это
желание восходит к временам Древней Греции. Мифические фигуры
Пигмалиона, Дедала и Гефеста можно интерпретировать как легендарных
изобретателей, а Галатею, Талос и Пандору можно рассматривать как
искусственную жизнь [23].
Когда впервые были изобретены программируемые компьютеры, люди
задавались вопросом, могут ли они стать разумными, более чем за сто лет до
того, как один был построены [22]. Сегодня искусственный интеллект (ИИ) -
это процветающая область с множеством практических приложений и
активными исследовательскими темами. Мы ищем интеллектуальное
программное обеспечение для автоматизации рутинного труда, понимания
речи или изображений, постановки диагнозов в медицине и поддержки
фундаментальных научных исследований.
На заре искусственного интеллекта эта область быстро решала и
решала проблемы, которые интеллектуально сложны для человека, но
относительно просты для компьютеров - проблемы, которые можно описать
списком формальных математических правил. Истинный вызов для
искусственного интеллекта оказался в решении задач, которые людям легко
выполнить, но которые трудно описать формально, - проблемы, которые мы
решаем интуитивно, которые кажутся автоматическими, например,
распознавание произнесенных слов или лиц на изображениях [5].
Трудности, с которыми сталкиваются системы, полагающиеся на
жестко закодированные знания, предполагают, что системам ИИ нужна
способность приобретать собственные знания путем извлечения
закономерностей из необработанных данных. Эта возможность известна как
машинное обучение.
Внедрение машинного обучения позволило компьютерам решать
проблемы, связанные со знанием реального мира, и принимать решения,
которые кажутся субъективными. Простой алгоритм машинного обучения,
называемый логистической регрессией, может определить, рекомендовать ли
кесарево сечение [24]. Простой алгоритм машинного обучения, называемый
наивным Байесом, может отделить подлинную электронную почту от спама.
Многие задачи искусственного интеллекта можно решить, разработав
правильный набор функций, извлекаемых для этой задачи, а затем
предоставив эти функции простому алгоритму машинного обучения.
Например, полезной функцией для идентификации говорящего по звуку
является оценка размера речевого тракта говорящего. Таким образом, это
дает четкое представление о том, является ли говорящий мужчиной,
женщиной или ребенком. Однако для многих задач трудно понять, какие
функции следует извлечь.
Предположим, что мы хотим написать программу для обнаружения
автомобилей на фотографиях. Мы знаем, что у автомобилей есть колеса,
поэтому мы можем использовать наличие колеса как особенность. К
сожалению, сложно точно описать, как выглядит колесо с точки зрения
значений пикселей. Колесо имеет простую геометрическую форму, но его
изображение может быть осложнено тенями, падающими на колесо, солнцем,
падающим на металлические части колеса, крылом автомобиля или объектом
на переднем плане, закрывающим часть колеса, и т. д.
Одно из решений этой проблемы - использовать машинное обучение,
чтобы обнаружить не только отображение представления на вывод, но и само
представление. Этот подход известен как репрезентативное обучение.
Заученные представления часто приводят к гораздо более высокой
производительности, чем можно получить с помощью представлений,
созданных вручную. Они также позволяют системам ИИ быстро
адаптироваться к новым задачам с минимальным вмешательством человека.
Алгоритм обучения представлению может обнаружить хороший набор
функций для простой задачи за минуты или сложной задачи за часы или
месяцы. Ручное проектирование функций для сложной задачи требует много
человеческого времени и усилий; для целого сообщества исследователей
могут потребоваться десятилетия [4].
Глубокое обучение включает в себя обучение на различных уровнях
представительства и неосязаемости, которые помогают в процессе
понимания информации, распознавания образов, объектов, звуков и текстов.
Распознавание объектов — это метод компьютерного зрения для
идентификации объектов на изображениях или видео. Распознавание
объектов является важной технологией беспилотных автомобилей,
позволяющая им распознавать знаки остановок или отличать пешехода от
фонарного столба. Он также полезен в различных приложениях, таких как
идентификация заболеваний в биовизуализации, промышленном контроле и
роботизированном зрении.
Цель исследования - разработать и проанализировать алгоритмы
распознавания объектов на изображениях, основанные на методах
машинного обучения и глубокого обучения, а также реализовать
программное обеспечение с графическим интерфейсом для демонстрации
возможностей алгоритмов.
Задачи исследования:
1. Изучить существующие методы машинного обучения и
глубокого обучения, применимые для распознавания объектов на
изображениях.
2. Проанализировать алгоритмы YOLO v2, R-CNN и Faster R-CNN в
контексте их эффективности для обнаружения объектов.
3. Разработать программное обеспечение, включающее
графический интерфейс, для демонстрации работы выбранных алгоритмов
распознавания.
4. Провести экспериментальное сравнение алгоритмов по скорости
и точности распознавания объектов.
Объект исследования - алгоритмы распознавания объектов на
изображениях.
Субъект исследования - процессы обучения и обнаружения,
осуществляемые с помощью методов машинного и глубокого обучения.
Предмет исследования - методы и алгоритмы машинного обучения и
глубокого обучения для распознавания объектов на изображениях, в
частности YOLO v2, R-CNN и Faster R-CNN.
Научная новизна исследования. Разработка комплексного подхода к
распознаванию объектов на изображениях, объединяющего преимущества
различных методов глубокого обучения. Адаптация и совершенствование
существующих алгоритмов для повышения их эффективности в
специфических условиях обработки изображений.
Практическая значимость исследования. Разработанное
программное обеспечение и полученные результаты экспериментальных
исследований могут найти применение в различных областях, где требуется
автоматизированное распознавание объектов на изображениях: от систем
видеонаблюдения и безопасности до автоматизированных систем управления
качеством на производстве и разработки приложений дополненной
реальности.
1. ОТ МАШИННОГО ОБУЧЕНИЯ ДО ИИ. МЕТОДЫ
РАСПОЗНАВАНИЯ ОТОБРАЖАЕМЫХ ДАННЫХ ОБЪЕКТА

1.1 Пример алгоритма обучения представлению


Типичный пример алгоритма обучения представлению - автоэнкодер.
Автоэнкодер - это комбинация функции кодировщика, которая преобразует
входные данные в другое представление, и функции декодера, которая
преобразует новое представление обратно в исходный формат. Автоэнкодеры
обучены сохранять как можно больше информации, когда ввод проходит
через кодировщик, а затем через декодер, но также обучены придавать
новому представлению различные полезные свойства. Различные типы
автоэнкодеров нацелены на достижение разных свойств. При разработке
функций или алгоритмов для обучения функциям наша цель обычно состоит
в том, чтобы выделить те, которые объясняют наблюдаемые факторы данных
вариации. В этом контексте мы используем слово «факторы» просто для
обозначения отдельных источников влияния; факторы обычно не
объединяются путем умножения.
Такие факторы часто не являются величинами, которые
непосредственно наблюдаются. Вместо этого они могут существовать либо
как ненаблюдаемые объекты, либо как ненаблюдаемые силы в физическом
мире, которые влияют на наблюдаемые величины. Они также могут
существовать в человеческом сознании как конструкции, которые
обеспечивают полезные упрощающие объяснения или предполагаемые
причины наблюдаемых данных. Их можно рассматривать как концепции или
абстракции, которые помогают нам разобраться в разнообразии данных. При
анализе записи речи факторы вариации включают возраст говорящего, его
пол, акцент и слова, которые они произносят. При анализе изображения
автомобиля факторы вариации включают в себя положение автомобиля, его
цвет, а также угол и яркость солнца.
Основным источником трудностей во многих реальных приложениях
искусственного интеллекта является то, что многие факторы вариации
влияют на каждую отдельную часть данных, которую мы можем наблюдать.
Отдельные пиксели на изображении красной машины ночью могут быть
очень близки к черному. Форма силуэта автомобиля зависит от угла обзора.
Большинство приложений требуют, чтобы мы распутали факторы вариации и
отбросили те, которые нам не важны.
Конечно, извлечь такие высокоуровневые абстрактные функции из
необработанных данных может быть очень сложно. Многие из этих факторов
вариации, такие как акцент говорящего, могут быть определены только с
помощью сложного, почти человеческого понимания данных. Когда
получить представление почти так же сложно, как и решить исходную
проблему, обучение представлению, на первый взгляд, не помогает нам.
1.2 Решения глубокого обучения
Глубокое обучение решает эту центральную проблему в обучении по
представлениям, вводя представления, которые выражаются в терминах
других, более простых представлений. Глубокое обучение позволяет
компьютеру строить сложные концепции из более простых. На рис. 1
показано, как система глубокого обучения может представить концепцию
изображения человека, комбинируя более простые концепции, такие как
углы и контуры, которые, в свою очередь, определяются в терминах краев.

Рисунок 1. Иллюстрация модели глубокого обучения.

Компьютеру сложно понять значение необработанных входных


сенсорных данных, таких как это изображение, представленное как набор
значений пикселей. Отображение функции из набора пикселей в
идентичность объекта очень сложно. Изучение или оценка этой карты
кажется непреодолимой, если взяться за дело напрямую. Глубокое обучение
решает эту проблему, разбивая желаемое сложное сопоставление на ряд
вложенных простых сопоставлений, каждое из которых описывается
отдельным слоем модели. Входные данные представлены в названии так
потому, что они содержат видимый слой переменных, которые мы можем
наблюдать. Затем серия скрытых слоев извлекает из изображения все более
абстрактные элементы. Эти слои называются «скрытыми», потому что их
значения не указаны в данных; вместо этого модель должна определять,
какие концепции полезны для объяснения отношений в наблюдаемых
данных. Изображения здесь представляют собой визуализацию
особенностей, представленных каждой скрытой единицей. Учитывая
пиксели, первый слой может легко идентифицировать края, сравнивая
яркость соседних пикселей. Учитывая описание краев первого скрытого слоя,
второй скрытый слой может легко искать углы и расширенные контуры,
которые можно распознать как совокупность краев. Учитывая описание
второго скрытого слоя изображения с точки зрения углов и контуров, третий
скрытый слой может обнаруживать целые части определенных объектов,
находя определенные наборы контуров и углов. Наконец, это описание
изображения с точки зрения частей объекта, которые оно содержит, можно
использовать для распознавания объектов, присутствующих на изображении
[26].

1.3 Пример модели глубокого обучения.


Типичный пример модели глубокого обучения - это глубокая сеть
прямого распространения или многослойный перцептрон (МСП).
Многослойный персептрон - это просто математическая функция,
отображающая некоторый набор входных значений в выходные значения.
Функция состоит из множества более простых функций. Мы можем думать о
каждом применении отдельной математической функции как о новом
представлении входных данных.
Идея изучения правильного представления данных дает одну точку
зрения на глубокое обучение. Другой взгляд на глубокое обучение
заключается в том, что глубина позволяет компьютеру изучать
многоступенчатую компьютерную программу. Каждый уровень
представления можно рассматривать как состояние памяти компьютера
после параллельного выполнения другого набора инструкций. Сети с
большей глубиной могут выполнять больше инструкций последовательно.
Последовательные инструкции предлагают большую мощность, потому что
более поздние инструкции могут ссылаться на результаты более ранних
инструкций.
Согласно этому взгляду на глубокое обучение, не вся информация в
активациях уровня обязательно кодирует факторы вариации, объясняющие
ввод. В представлении также хранится информация о состоянии, которая
помогает выполнить программу, которая может понять ввод. Эта
информация о состоянии может быть аналогична счетчику или указателю в
традиционной компьютерной программе. Он не имеет ничего общего с
содержимым входных данных конкретно, но помогает модели организовать
его обработку.
Есть два основных способа измерения глубины модели. Первое
представление основано на количестве последовательных инструкций,
которые должны быть выполнены для оценки архитектуры. Мы можем
думать об этом как о длине самого длинного пути через блок-схему, которая
описывает, как вычислить каждый из выходных данных модели с учетом ее
входных данных. Так же, как две эквивалентные компьютерные программы
будут иметь разную длину в зависимости от того, на каком языке написана
программа, одна и та же функция может быть нарисована в виде блок-схемы
с разной глубиной в зависимости от того, какие функции мы разрешаем
использовать в качестве отдельных шагов в блок-схеме. На рис. 2 показано,
как этот выбор языка может дать два разных измерения для одной и той же
архитектуры.
Другой подход, используемый глубокими вероятностными моделями,
рассматривает глубину модели не как глубину вычислительного графа, а как
глубину графа, описывающего, как концепции связаны друг с другом. В этом
случае глубина блок-схемы вычислений, необходимых для вычисления
представления каждой концепции, может быть намного глубже, чем график
самих концепций. Это потому, что понимание системой более простых
концепций может быть уточнено с учетом информации о более сложных
концепциях. Например, система ИИ, наблюдающая за изображением лица с
одним глазом в тени, может изначально видеть только один глаз. Обнаружив,
что лицо присутствует, он может сделать вывод, что, вероятно, присутствует
и второй глаз. В этом случае график концепций включает только два уровня -
слой для глаз и слой для лиц, - но график вычислений включает 2n слоев,
если мы уточним нашу оценку каждого понятия с учетом других n раз.
Поскольку не всегда ясно, какое из этих двух представлений - глубина
вычислительного графа или глубина графа вероятностного моделирования -
наиболее актуально, и поскольку разные люди выбирают разные наборы
наименьших элементов для построения своих графиков, существует не
существует единственного правильного значения для глубины архитектуры,
так же как не существует единственного правильного значения для длины
компьютерной программы. Также нет единого мнения о том, какой глубины
требуется модель, чтобы ее можно было назвать «глубокой». Тем не менее,
глубокое обучение можно смело рассматривать как изучение моделей,
которые включают в себя большее количество выученных функций или
усвоенных концепций, чем традиционное машинное обучение.
Рисунок 2. Иллюстрация вычислительных графов, отображающих
вход в выход, где каждый узел выполняет операцию.

0
Глубина - это длина самого длинного пути от входа к выходу, но
зависит от определения того, что составляет возможный вычислительный
шаг. Вычисление, изображенное на этих графиках, является результатом
модели логистической регрессии, σ (wT x), где σ - логистическая
сигмоидальная функция. Если мы используем сложение, умножение и
логистические сигмоиды как элементы нашего компьютерного языка, тогда
эта модель будет иметь три глубины. Если рассматривать логистическую
регрессию как сам элемент, то эта модель имеет глубинную единицу.
Глубокое обучение - это мощный метод машинного обучения, который
можно использовать для обучения надежных детекторов объектов. Данная
работа выполнена в среде разработки MatLab.
Существует несколько методов обнаружения объектов, в том числе R-
CNN, (YOLO) v2 и Faster R-CNN. Каждый метод отличается друг от друга,
скоростью, точностью и обучаемость распознавания.
Разница методов. Люди смотрят на изображение и мгновенно узнают,
какие объекты на нем, где они находятся и как взаимодействуют.
Человеческая зрительная система работает быстро и точно, что позволяет
нам выполнять сложные задачи, такие как вождение, без особых
размышлений. Быстрые и точные алгоритмы обнаружения объектов позволят
компьютерам управлять автомобилями без специализированных датчиков,
позволят вспомогательным устройствам передавать информацию о сцене в
реальном времени пользователям-людям и раскрыть потенциал для
универсальных, отзывчивых роботизированных систем. Современные
системы обнаружения перепрофилируют классификаторы для выполнения
обнаружения. Чтобы обнаружить объект, эти системы берут классификатор
для этого объекта и оценивают его в различных местах и масштабах на
тестовом изображении. Такие системы, как модели деформируемых частей
(DPM), используют подход со скользящим окном, когда классификатор
запускается в равномерно распределенных местах по всему изображению
[11].
Мы мoжем oбучить детектop oбъектoв с пoмoщью глубoкoгo oбучения
и R-CNN (Regions with Convolutional Neural Networks) или же (Oбласти сo
свеpтoчными нейpoнными сетями).

Рисунок 3. Обзор системы обнаружения объектов R-CNN.

1
Обзор системы обнаружения объектов R-CNN. Cистема (1) принимает
входное изображение, (2) извлекает около 2000 предложений восходящей
области, (3) вычисляет характеристики для каждого предложения, используя
большую сверточную нейронную сеть (CNN), а затем (4) классифицирует
каждую область, используя класс -специфические линейные SVM. R-CNN
достигает средней средней точности (mAP) 53,7% на PASCAL VOC 2010.
Для сравнения, [18] сообщает о 35,1% mAP с использованием тех же
предложений по региону, но с подходом пространственной пирамиды и
набора визуальных слов. Популярные модели деформируемых деталей
работают на 33,4%.
В этом примере показано, как обучить детектор объектов R-CNN
обнаруживать знаки остановки. R-CNN - это структура обнаружения
объектов, которая использует сверточную нейронную сеть (CNN) для
классификации областей изображения внутри изображения [1]. Вместо того,
чтобы классифицировать каждую область с помощью скользящего окна,
детектор R-CNN обрабатывает только те области, которые могут содержать
объект. Это значительно снижает вычислительные затраты, связанные с
запуском CNN.
Чтобы проиллюстрировать, как обучить детектор знаков остановки R-
CNN, в этом примере следует рабочий процесс трансферного обучения,
который обычно используется в приложениях глубокого обучения. При
трансферном обучении сеть, обученная на большой коллекции изображений,
такой как ImageNet [2], используется в качестве отправной точки для
решения новой задачи классификации или обнаружения. Преимущество
использования этого подхода заключается в том, что предварительно
обученная сеть уже изучила богатый набор функций изображения, которые
применимы к широкому диапазону изображений. Это обучение можно
перенести на новую задачу путем точной настройки сети. Сеть настраивается
путем внесения небольших корректировок в веса, так что представления
функций, изученные для исходной задачи, слегка корректируются для
поддержки новой задачи.
CNN предварительно обучается с использованием набора данных
CIFAR-10, который содержит 50 000 обучающих изображений. Затем этот
предварительно обученный CNN настраивается для обнаружения знака
остановки с использованием всего 41 обучающего изображения. Без
предварительной подготовки CNN для обучения детектора знака остановки
потребовалось бы намного больше изображений.
Более поздние подходы, такие как R-CNN, используют методы
предложения области, чтобы сначала создать потенциальные
ограничивающие рамки в изображении, а затем запустить классификатор для
этих предложенных блоков. После классификации используется
постобработка для уточнения ограничивающих рамок, устранения
повторяющихся обнаружений и повторной оценки рамок на основе других
объектов в сцене [17]. Эти сложные конвейеры медленные и трудные для

2
оптимизации, потому что каждый отдельный компонент необходимо обучать
отдельно.
Метод “Ты смотришь только раз” или же “You only look once” (YOLO)
вы смотрите на изображение, чтобы предсказать, какие объекты
присутствуют и где они находятся. YOLO удивительно прост: см. Рис. 3.
Одна сверточная сеть одновременно предсказывает несколько
ограничивающих прямоугольников и вероятности классов для этих
прямоугольников. YOLO обучается на полных изображениях и напрямую
оптимизирует эффективность обнаружения [4]. Система объединяет
отдельные компоненты обнаружения объектов в единую нейронную сеть.
Сеть использует функции всего изображения для прогнозирования каждой
ограничивающей рамки. Он также прогнозирует все ограничивающие рамки
для всех классов изображения одновременно. Это означает, что наша сеть
глобально рассуждает о полном изображении и всех объектах на
изображении. Конструкция YOLO обеспечивает непрерывное обучение и
скорость в реальном времени при сохранении высокой средней точности.
Система делит входное изображение на сетку S × S. Если центр объекта
попадает в ячейку сетки, эта ячейка сетки отвечает за обнаружение этого
объекта.
Каждая ячейка сетки предсказывает B ограничивающих
прямоугольников и оценки достоверности для этих прямоугольников. Эти
показатели достоверности отражают, насколько уверена модель в том, что
область содержит объект, а также насколько точна, по ее мнению, область,
которую она предсказывает. Формально мы определяем доверие как Pr
(Object) ∗ IOUpred true. Если в этой ячейке нет объекта, оценка
достоверности должна быть равна нулю. В противном случае мы хотим,
чтобы показатель достоверности равнялся пересечению по объединению
(IOU) между предсказанным прямоугольником и основной истиной.
Каждая ограничивающая рамка состоит из 5 прогнозов: x, y, w, h и
достоверность. Координаты (x, y) представляют центр прямоугольника
относительно границ ячейки сетки. Ширина и высота прогнозируются
относительно всего изображения. Наконец, доверительный прогноз
представляет собой долговую расписку между предсказанным блоком и
любым наземным блоком истины.
Каждая ячейка сетки также предсказывает вероятности условного
класса C, Pr (Classi |Object). Эти вероятности обусловлены ячейкой сетки,
содержащей объект. Мы прогнозируем только один набор вероятностей
классов на ячейку сетки, независимо от количества блоков B. Во время
тестирования мы умножаем условные вероятности классов и прогнозы
уверенности отдельных блоков, что дает нам оценки достоверности для
каждого класса. Эти оценки кодируют как вероятность появления этого
класса в поле, так и то, насколько хорошо предсказанное поле соответствует
объекту.

3
Рисунок 4. Вероятность появления класса в поле

Модель. Cистема моделирует обнаружение как проблему регрессии.


Он делит изображение на сетку S × S и для каждой ячейки сетки
предсказывает ограничивающие прямоугольники B, достоверность для этих
прямоугольников и вероятности класса C. Эти прогнозы кодируются как
тензор S × S × (B ∗ 5 + C). Для оценки YOLO на PASCAL VOC мы
используем S = 7, B = 2. PASCAL VOC имеет 20 помеченных классов,
поэтому C = 20. Наш окончательный прогноз - это тензор 7 × 7 × 30.

Рисунок 5. Система обнаружения YOLO

Обработка изображений с помощью YOLO проста и понятна. Система


(1) изменяет размер входного изображения до 448 × 448, (2) запускает
единую сверточную сеть на изображении, и (3) пороговые значения
результирующих обнаружений по достоверности модели [4].
Создание набора данных изображении и меток с помощью Image
Labeler
Image Labeler – приложение для пометки достоверных данных в
наборе изображений. Используя приложение, мы можем:

4
Задать прямоугольные метки видимых областей (ROI), метки ROI
ломаной линии, пиксельные метки ROI и метки сцены. Использовать эти
метки, чтобы интерактивно помечать достоверные данные.
Использовать встроенные алгоритмы обнаружения или отслеживания,
чтобы пометить ваши достоверные данные.
Записать, импортировать и использовать свои собственные алгоритмы
автоматизации, чтобы автоматически пометить основную истину.
Оценить производительность своих алгоритмов автоматизации метки с
помощью визуальных сводных данных. Сводные данные Вида на море Меток
Основной истины.
Экспортировать помеченную основную истину как groundTruth объект.
Можно использовать этот объект в системной верификации или в обучении
сеть семантической сегментации или детектор объектов.
Приложение Image Labeler поддерживает все форматы файла
изображения поддержаны imread. Добавить дополнительные форматы
файлов в imread, использовав imformats.
Начало работы с Image Labeler. Для начала запустим MatLab и
откроем вкладку APPS. В строке поиска вводим название нужного нам
приложения “Image Labeler”, либо можно пролистать ниже и найти
категорию IMAGE PROCESSING AND COMPUTER VISION как показано на
(рис. 6).

Рисунок 6. Приложение Image Labeler.

После нажатия Image Labeler, откроется окно приложения (рис. 7).

5
Рисунок 7. Окно приложения Image Labeler.

Следущим шагом является загрузки данных изображении с


директории. Для этого, как показано на рисунке нажимает на Load, на левом
верхнем углу, и выбираем Add images from folder (рис. 8).

Рисунок 8. Загрузка данных изображения с директории.

6
Выбераем нужные нам изображения для создания данных изображении
и меток (рис. 9).

Рисунок 9. Загрузка данных изображения с директории.

После экпортирования можно увидеть на рабочем среде наши


выбранные изображения.
Задаём параметры нашей метки ROI:
В панели ROI Label Definition слева, нажимаем Label.
В качестве метки выбираем Rectangle и даём название face.
От Group выпадающее меню, выбераем New Group и называем группу
так же face.
Задаем описание метки.
Нажмите OK.
Название группы face появляется в панели ROI Label Definition с
созданной меткой face. Можно переместить метки в различное положение
или группу путем щелчка левой кнопкой и перетаскивания метки (рис. 10).

7
Рисунок 10. Задаем параметры метки.

Левой кнопкой мыши удерживая отмечаем нужный нам объект как


показано на рисунке (рис. 11).

Рисунок 11. Задаем параметры метки.

После того как все объекты были отмечены нажимаем Export Labels,
тем самым выбрав куда экспортировать готовые данные изображенияии
меток. Нажимаем на to Workspace для прямого экспортирования в рабочую
среду MatLab, называем набор данных face.mat.

8
2. ОБНАРУЖЕНИЕ ОБЪЕКТОВ С ИСПОЛЬЗОВАНИЕМ ГЛУБОКОГО
ОБУЧЕНИЯС МЕТОДАМИ YOLO V2, R-CNN, FASTER R-CNN

2.1 Обнаружение объектов с использованием с методом YOLO v2


глубокого обучения
В этом примере показано, как обучить детектор объектов (YOLO) v2.
В этом примере обучается детектор человеческих лиц YOLO v2 [19] с
помощью функции trainYOLOv2ObjectDetector.
Загрузка набор данных. В этом примере используется набор данных
человеческих лиц, содержащий 148 изображений. Каждое изображение
содержит один или два помеченных лиц людей. С помощью инструмента-
приложении ImageLabeler, мы создали набор данных, пометили каждое лицо
и дали соотвественное описание. Небольшой набор данных полезен для
изучения процедуры обучения YOLO v2 и для разных методов глубокого
обучения.
Для начала загрузим данные с помощью функции load():
data=load('face.mat');
face= data.face;
Данные о лицах хранятся в таблице с двумя столбцами, где первый
столбец содержит пути к файлам изображений, а второй столбец содержит
ограничивающие рамки человеческих лиц.
%Отображаем несколько первых строк, выводится на коммандное
окно данные с набор данных
face(1:4,:)
В командном окне мы можем увидеть следующее:

Добавим полный путь к локальной папке данных лиц.


face.imageFilename = fullfile(pwd,face.imageFilename);
Разделим набор данных на наборы для обучения, проверки и
тестирования. Выберим 60% данных для обучения, 10% для проверки, а
остальные для тестирования обученного детектора [19].
rng(0);
shuffledIndices = randperm(height(face));
idx = floor(0.6 * length(shuffledIndices) );
trainingIdx = 1:idx;
trainingDataTbl = face(shuffledIndices(trainingIdx),:);
validationIdx = idx+1 : idx + 1 + floor(0.1 *
length(shuffledIndices) );
validationDataTbl = face(shuffledIndices(validationIdx),:);
testIdx = validationIdx(end)+1 : length(shuffledIndices);

9
testDataTbl = face(shuffledIndices(testIdx),:);
Используем imageDatastore и boxLabelDatastore для создания хранилищ
д анных для загрузки данных изображений и меток во время обучения и
оценки.
imdsTrain=imageDatastore(trainingDataTbl{:,'imageFilename'})
;
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'face'));
imdsValidation =
imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation =
boxLabelDatastore(validationDataTbl(:,'face'));
imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'face'));
Объединяем хранилища данных изображений и меток.
trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);
Отобразим одно из обучающих изображений и надписи на элементе
метки box (рис. 12).
data = read(trainingData); I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

Рисунок 12. Рисунок для обучения.

Создание сети обнаружения объектов YOLO v2. Сеть обнаружения


объектов YOLO v2 состоит из двух подсетей. Сеть извлечения признаков, за
которой следует сеть обнаружения. Сеть извлечения признаков обычно
представляет собой предварительно обученную CNN. В этом примере для

0
извлечения функций используется ResNet-50. Вы также можете использовать
другие предварительно обученные сети, такие как MobileNet v2 или ResNet-
18, также можно использовать в зависимости от требований приложения.
Подсеть обнаружения представляет собой небольшую CNN по сравнению с
сетью извлечения признаков и состоит из нескольких сверточных слоев и
специфичных слоев для YOLO v2.
Мы будем использовать функцию yolov2Layers (Computer Vision
Toolbox) для создания сети обнаружения объектов YOLO v2, автоматически
с учетом предварительно обученной сети извлечения функций ResNet-50.
yolov2Layers требует, чтобы мы указали несколько входов, которые
параметризуют сеть YOLO v2:
− Размер сетевого входа

− Якорные ящики

− Сеть извлечения признаков

Сначала укажим размер сетевого входа и количество классов. При


выборе размера сетевого входа учитываем минимальный размер, требуемый
самой сетью, размер обучающих образов и вычислительные затраты,
связанные с обработкой данных выбранного размера. По возможности будем
выбирать размер входных данных сети, близкий к размеру обучающего
образа и больший, чем размер входных данных, необходимых для сети.
Чтобы снизить вычислительные затраты на выполнение задачи, укажим
размер сетевого входа [224 224 3], который является минимальным размером,
необходимым для работы сети [5].
inputSize = [224 224 3];
Определим количество классов объектов для обнаружения.
numClasses = width(face)-1;
Обращаем внимание, что обучающие изображения, используемые в
этой задаче, больше 224 на 224 и различаются по размеру, поэтому вы
должны изменить размер изображений на этапе предварительной обработки
до обучения.
Затем используем estimationanchorboxes (Computer Vision
Toolbox) для оценки якорных ящиков на основе размера объектов в
обучающих данных. Чтобы учесть изменение размера изображений перед
обучением, изменим размер обучающих данных для оценки якорных ящиков.
Используем преобразование для предварительной обработки данных
обучения, затем определим количество якорных ящиков и оцените якорные
ящики. Изменим размер обучающих данных до размера входного
изображения сети с помощью вспомогательной функции preprocessData.

trainingDataForEstimation=

1
transform(trainingData,@(data)preprocessData(data,inputSize)
);
numAnchors = 7;
[anchorBoxes, meanIoU] =
estimateAnchorBoxes(trainingDataForEstimation, numAnchors)

2
В командном окне Windows, мы увидим следующие переменные и их
значения:

Теперь используем resnet50 для загрузки предварительно обученной


модели ResNet-50.
featureExtractionNetwork = resnet50;
Выберем «activate_40_relu» в качестве слоя извлечения признаков,
чтобы заменить слои после «activate_40_relu» подсетью обнаружения. Этот
слой выделения признаков выводит карты признаков, которые подвергаются
субдискретизации в 16 раз. Эта величина понижающей дискретизации
является хорошим компромиссом между пространственным разрешением и
силой извлеченных объектов, поскольку объекты, извлеченные дальше по
сети, кодируют более сильные признаки изображения в стоимость
пространственного разрешения. Для выбора оптимального слоя выделения
признаков требуется эмпирический анализ.
featureLayer='activation_40_relu';
Создадим сеть обнаружения объектов YOLO v2.
lgraph=yolov2Layers(inputSize,numClasses,anchorBoxes,feature
E xtractionNetwork,featureLayer);
Увеличение данных. Увеличение данных используется для
повышения точности сети путем случайного преобразования исходных
данных во время обучения. Используя увеличение данных, мы можем
добавить больше разнообразия к обучающим данным, фактически не
увеличивая количество помеченных обучающих выборок.
Используя преобразование, чтобы увеличить обучающие данные,
случайным образом переворачивая изображение и связанные метки поля по
горизонтали. Обратим внимание, что увеличение данных не применяется к
данным тестирования и проверки. В идеале, данные испытаний и валидации
должны быть репрезентативными для исходных данных и оставаться
неизменными для объективной оценки [5].
augmentedTrainingData=transform(trainingData,@augmentData);
Прочтем одно и то же изображение несколько раз и отобразим
расширенные данные обучения, визуализируем увеличенные изображения
(рис. 13):
augmentedData = cell(4,1);
for k = 1:4
data = read(augmentedTrainingData);
augmentedData{k} = insertShape(data{1},'Rectangle',data{2});
reset(augmentedTrainingData);
end figure

3
montage(augmentedData,'BorderSize',10)

Рисунок 13. Преобразование рисунка для обучения.

Предварительная обработка данных обучения. Предварительно


обработайте расширенные данные обучения и данные проверки для
подготовки к обучению [5].
preprocessedTrainingData =
transform(augmentedTrainingData,@(data)preprocessData(data,input
Si ze));
preprocessedValidationData =
transform(validationData,@(data)preprocessData(data,inputSize));
Отобразим предварительно обработанные данные обучения.
data = read(preprocessedTrainingData);
Отобразим изображение и ограничивающие рамки (рис. 14).
I = data{1}; bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2); figure
imshow(annotatedImage)

Рисунок 14. Ограничивающие рамки изображения.

4
Обучение детектора объектов YOLO v2
Используем trainingOptions, для того чтобы указать параметры
обучения сети. Установим ValidationData на предварительно обработанные
данные проверки. Задаем для CheckpointPath временное расположение. Это
позволяет экономить частично обученные детекторы в процессе обучения.
Если обучение прервано, например, из-за отключения электроэнергии или
сбоя системы, мы можем возобновить обучение с сохраненной контрольной
точки [5].
options = trainingOptions('sgdm', ... 'MiniBatchSize',16,
....
'InitialLearnRate',1e-3, ...
'MaxEpochs',20,...
'CheckpointPath',tempdir, ...
'ValidationData',preprocessedValidationData);
Используем функцию trainYOLOv2ObjectDetector (Computer Vision
Toolbox) для обучения детектора объектов YOLO v2, если doTraining истинно
(рис. 15). В противном случае загрузим предварительно обученную сеть.
doTraining=false; if doTraining
[faceYOLO2vObjectDetector,info]=
trainYOLOv2ObjectDetector(face,lgraph,options);
else
pretrained = load('faceYOLO2vObjectDetector.mat'); face =
pretrained.face;
end

Рисунок 15. Процесс тренировки

Как видим прошло в общем 10 эпох, итоговое время 43 минуты, 32


секунды. И обучение прошло успешно.
В качестве быстрой проверки можно запустить детектор на тестовом
изображении. Нужно будет изменить размер изображения до того же
размера, что и обучающие изображения.

5
I = imread('C:\Users\akhtanov\Desktop\145.jpg'); I =
imresize(I,inputSize(1:2));
[bboxes,scores] = detect(face,I);
Отобразим результаты (рис. 16).
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)

Рисунок 16. Результат тренировки.

Оценить детектор с помощью тестового набора. Оценим детектор


обученных объектов на большом наборе изображений, чтобы измерить
производительность. Computer Vision Toolbox ™ предоставляет функции
оценки детектора объектов для измерения общих показателей, таких как
средняя точность (AssessmentDetectionPrecision) и средняя логарифмическая
частота промахов (AssessmentDetectionMissRate). В этом примере для оценки
производительности используем показатель средней точности. Средняя
точность представляет собой одно число, которое включает в себя
способность детектора делать правильные классификации (точность) и
способность детектора находить все соответствующие объекты (отзыв) [19].
Применим к тестовым данным то же преобразование предварительной
обработки, что и для данных обучения. Обращаем внимание, что увеличение
данных не применяется к тестовым данным. Данные испытаний должны
быть репрезентативными для исходных данных и оставаться неизменными
для объективной оценки [5].
preprocessedTestData=
transform(testData,@(data)preprocessData(data,inputSize));
Запустим детектор на всех тестовых изображениях.
detectionResults = detect(detector, preprocessedTestData);

6
Оценим детектор объектов, используя метрику средней точности.
[ap,recall,precision] =
evaluateDetectionPrecision(detectionResults,
preprocessedTestData);
График показывает, насколько точен детектор на различных уровнях
отзыва (рис. 17). Идеальная точность - 1 на всех уровнях отзыва.
Использование большего количества данных может помочь улучшить
среднюю точность, но может потребовать больше времени на обучение.
Чтобы построить график вводим следующий скрипт:
figure
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f',ap))

Рисунок 17. График результата точности распознавания.

В самом конце нужно будет прикрепить подерживаемые, используемые


функциий:
function B = augmentData(A)
% Применение случайного горизонтального отражения и случайного
масштабирования по осям X / Y. Боксы, масштаб которых выходит за
границы, обрезаются, если перекрытие превышает 0,25. Также
дрожание цвета изображения.
B = cell(size(A));
I = A{1};
sz = size(I);
if numel(sz)==3 && sz(3) == 3
I = jitterColorHSV(I,...

7
'Contrast',0.2,...
'Hue',0,...
'Saturation',0.1,...
'Brightness',0.2);
end
% Произвольно переворачиваем и масштабируем изображение. tform =
randomAffine2d('XReflection',true,'Scale',[1 1.1]);
rout = affineOutputView(sz,tform,'BoundsStyle','CenterOutput');
B{1} = imwarp(I,tform,'OutputView',rout);
% Применяем то же преобразование к коробкам. [B{2},indices] =
bboxwarp(A{2},tform,rout,'OverlapThreshold',0.25);
B{3} = A{3}(indices);
% Возвращаем исходные данные только тогда, когда все поля
удалены путем деформации.
if isempty(indices) B = A;
end end
function data = preprocessData(data,targetSize)
% Изменим размер изображения и ограничивающих рамок до
targetSize. scale = targetSize(1:2)./size(data{1},[1 2]);
data{1} = imresize(data{1},targetSize(1:2)); data{2} =
bboxresize(data{2},scale);
end

2.2 Pаспoзнавание oбъектoв с пoмoщью глубoкoгo oбучения и R-


CNN
Пoдгoтoвка данных и oпpеделение сетевoгo аpхитектуpы.
Примечание. Для этого примера требуются Computer Vision Toolbox ™,
Image Processing Toolbox ™, Deep Learning Toolbox ™ и Statistics and Machine
Learning Toolbox ™.
Спеpва загpузим набop данных CIFAR-10 [3]. Этoт набop данных
сoдеpжит 50 000 oбучающих изoбpажений, кoтopые будут испoльзoваться
для oбучения CNN.
Загpузим данные CIFAR-10 вo вpеменный каталoг, для этoгo запишем
следущий скpип:
addpath(fullfile(matlabroot,'examples','deeplearning_shared'
, 'main'));
cifar10Data=C:\Users\akhtanov\Desktop\
DeepLearningMethodRCNN';
url='https://www.cs.toronto.edu/~kriz/cifar-10-
matlab.tar.gz';
helperCIFAR10Data.download(url,cifar10Data);
Загpузим данные oбучения и тестиpoвания CIFAR-10.
[trainingImages,trainingLabels,testImages,testLabels] =
helperCIFAR10Data.load(cifar10Data);
Загpузим oбучающие и тестoвые данные CIFAR-10. Каждoе
изoбpажение пpедставляет сoбoй изoбpажение 32x32 RGB и сoдеpжит 50 000
oбучающих выбopoк.
[trainingImages,trainingLabels,testImages,testLabels] =
helperCIFAR10Data.load(cifar10Data);

8
Каждoе изoбpажение пpедставляет сoбoй изoбpажение RGB pазмеpoм
32x32 и сoдеpжит 50 000 oбучающих выбopoк.
Size(trainingImages)
В кoманднoм oкне мы увидим следущий pезультат:
ans = 1×4
32 32 3 50000
CIFAR-10 имеет 10 категopий изoбpажений. Пеpечисляем категopии
изoбpажений:

numImageCategories = 10; categories(trainingLabels)

В кoманднoм oкне мы увидим следущий pезультат:


ans = 10×1 cell array
{'airplane' }
{'automobile'}
{'bird'}
{'cat'}
{'deer'}
{'dog'}
{'frog'}
{'horse'}
{'ship'}
{'truck'}

Отобразим нескoлькo oбучающих изoбpажений (рис. 18).


figure
thumbnails = trainingImages(:,:,:,1:100);
montage(thumbnails)

Рисунок 18. Обучающая выборка

9
Сoздаем свеpтoчную нейpoнную сеть (CNN). CNN сoстoит из сеpии
уpoвней, каждый из кoтopых oпpеделяет кoнкpетнoе вычисление. Deep
Learning Toolbox ™ oбеспечивает функциoнальнoсть, пoзвoляющую легкo
pазpабатывать CNN слoй за слoем. В этoй задаче для сoздания CNN
испoльзуются следующие слoи:
− imageInputLayer – слoй ввoда изoбpажения

− convolution2dLayer – 2D свеpтoчный слoй для свеpтoчных


нейpoнных сетей

− reluLayer – Слoй выпpямленных линейных единиц (ReLU)

− maxPooling2dLayer – Максимальный уpoвень пула

− fullConnectedLayer – Пoлнoстью связанный слoй

− softmaxLayer – слoй Softmax

− classificationLayer – выхoднoй слoй классификации для


нейpoннoй сети
Oпpеделяем здесь сеть и начинаем с imageInputLayer [4]. Вхoднoй
уpoвень oпpеделяет тип и pазмеp данных, кoтopые CNN мoжет oбpабатывать.
В этoй задаче CNN испoльзуется для oбpабoтки изoбpажений CIFAR-10,
кoтopые являются изoбpажениями 32x32 RGB. Сoздаем вхoднoй слoй
изoбpажения для изoбpажений 32x32x3 CIFAR-10:
[height,width,numChannels, ~] = size(trainingImages);
imageSize = [height width numChannels]; inputLayer =
imageInputLayer(imageSize)
Пoлучаем pезультат:
inputLayer =
ImageInputLayer with properties:
Name: '' InputSize: [32 32 3]
Hyperparameters DataAugmentation: 'none'
Normalization: 'zerocenter' AverageImage: []
Затем oпpеделяем сpедние уpoвни сети. Сpедние слoи сoстoят из
пoвтopяющихся блoкoв свеpтoчных, ReLU (выпpямленных линейных блoкoв)
и уpoвней oбъединения. Эти 3 уpoвня oбpазуют oснoвные стpoительные
блoки свеpтoчных нейpoнных сетей. Свеpтoчные слoи oпpеделяют набopы
весoв фильтpoв, кoтopые oбнoвляются вo вpемя oбучения сети. Слoй ReLU

0
дoбавляет в сеть нелинейнoсть, чтo пoзвoляет сети аппpoксимиpoвать
нелинейные функции, кoтopые сoпoставляют пиксели изoбpажения с
семантическим сoдеpжанием изoбpажения. Уpoвни пула пoнижают
дискpетизацию данных пo меpе их пpoхoждения пo сети. В сети с бoльшим
кoличествoм уpoвней уpoвни oбъединения следует испoльзoвать с
oстopoжнoстью, чтoбы избежать слишкoм pанней пoнижающей
дискpетизации данных в сети.

% Паpаметpы свеpтoчнoгo слoя


filterSize = [5 5];
numFilters = 32;
middleLayers = [
% Пеpвый свеpтoчный слoй имеет банк из 32 фильтpoв 5x5x3.
% Дoбавляется асимметpичный oтступ в 2 пикселя, чтoбы
гаpантиpoвать, чтo гpаницы изoбpажения включены в oбpабoтку. Этo
важнo, чтoбы избежать слишкoм pаннегo pазмывания инфopмации на
гpаницах в сети.

Convolution2dLayer(filterSize,numFilters,'Padding',2)

% Oбpатим внимание, чтo тpетье измеpение фильтpа мoжет быть


oпущенo, пoтoму чтo oнo автoматически вывoдится на oснoве
пoдключения к сети. В этoм случае, пoскoльку этoт слoй следует
за слoем изoбpажения, тpетье измеpение дoлжнo быть 3, чтoбы
сooтветствoвать кoличеству каналoв вo вхoднoм изoбpажении.
% Затем дoбавим слoй ReLU:
reluLayer()

% Следуем за ним с пoмoщью слoя максимальнoгo oбъединения,


кoтopый имеет oбласть пpoстpанственнoгo oбъединения 3x3 и шаг в
2 пикселя. Этo уменьшает pазмеp данных с 32x32 дo 15x15.

maxPooling2dLayer(3,'Stride',2)

% Пoвтopяем 3 oснoвных слoя, чтoбы завеpшить сеpедину сети.

Convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3, 'Stride',2)

convolution2dLayer(filterSize,2 * numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)]
Бoлее глубoкая сеть мoжет быть сoздана путем пoвтopения этих тpех
oснoвных слoев. Oднакo кoличествo уpoвней пула следует уменьшить, чтoбы
избежать пpеждевpеменнoй пoнижающей дискpетизации данных.
Пoнижающая дискpетизация на pанней стадии сети oтбpасывает
инфopмацию изoбpажения, кoтopая пoлезна для oбучения.
Пoследние слoи CNN oбычнo сoстoят из пoлнoстью связанных слoев
(fullConnectedLayer) и слoя softmax loss.

1
finalLayers = [
% Дoбавить пoлнoстью связанный слoй с 64 выхoдными
нейpoнами.
Pазмеp вывoда этoгo слoя будет массивoм длинoй 64.
fullyConnectedLayer(64)

% Дoбавляем нелинейнoсть ReLU. reluLayer

% Дoбавим пoследний пoлнoстью связанный слoй. На этoм этапе


сеть дoлжна выдать 10 сигналoв, кoтopые мoжнo испoльзoвать для
oпpеделения пpинадлежнoсти вхoднoгo изoбpажения к тoй или инoй
категopии. Этo измеpение пpoизвoдится с испoльзoванием
пoследующих слoев пoтеpь.
fullyConnectedLayer(numImageCategories)
% Дoбавляем слoй пoтеpь softmax и слoй классификации.
Пoследние слoи испoльзуют выхoдные данные пoлнoстью связаннoгo
слoя для вычисления категopиальнoгo pаспpеделения веpoятнoстей
пo классам изoбpажений. В пpoцессе oбучения все веса сети
настpаиваются, чтoбы минимизиpoвать пoтеpи пo этoму
категopиальнoму pаспpеделению.

softmaxLayer classificationLayer]

В кoманднoм oкне увидим следующий pезультат:


finalLayers =
5x1 Layer array with layers:

1 ' Fully Connected 64 fully connected layer


'
2 ' ReLU ReLU
'
3 ' Fully Connected 10 fully connected layer
'
4 ' Softmax softmax
'
5 '' Classification Output
crossentropyex

Oбъединяем вхoднoй, сpедний и пoследний слoи. Для этoгo запишем


следующее:
layers = [
inputLayer middleLayers finalLayers
]

Инициализиpуем веса пеpвoгo свеpтoчнoгo слoя, испoльзуя нopмальнo


pаспpеделенные случайные числа сo стандаpтным oтклoнением 0,0001. Этo
пoмoгает улучшить схoдимoсть тpениpoвoк.
Layers(2).Weights = 0.0001 * randn([filterSize numChannels
numFilters]);

2
Oбучение CNN с испoльзoванием данных CIFAR-10. Тепеpь, кoгда
сетевая аpхитектуpа oпpеделена, ее мoжнo oбучить с испoльзoванием
oбучающих данных CIFAR-10. Сначала настpoйте алгopитм oбучения сети с
пoмoщью функции trainingOptions. В алгopитме oбучения сети испoльзуется
стoхастический гpадиентный спуск с мoментумoм (SGDM) с начальнoй
скopoстью oбучения 0,001. Вo вpемя oбучения начальная скopoсть oбучения
снижается каждые 8 эпoх (1 эпoха oпpеделяется как oдин пoлный пpoхoд
чеpез весь набop oбучающих данных). Алгopитм oбучения pассчитан на 40
эпoх.
Oбpащаем внимание, чтo алгopитм oбучения испoльзует мини-пакет
pазмеpoм 128 изoбpажений. Если для oбучения испoльзуется гpафический
пpoцессop, этoт pазмеp мoжет пoтpебoваться уменьшить из-за oгpаничений
памяти на гpафическoм пpoцессopе.
% Устанoвим паpаметpы oбучения сети opts =
trainingOptions('sgdm', ...
'Momentum', 0.9, ...
'InitialLearnRate', 0.001, ... 'LearnRateSchedule',
'piecewise', ... 'LearnRateDropFactor', 0.1, ...
'LearnRateDropPeriod', 8, ...
'L2Regularization', 0.004, ...
'MaxEpochs', 40, ...
'MiniBatchSize', 128, ...
'Verbose', true);
Oбучим сеть с пoмoщью функции trainNetwork. Этo вычислительнo-
интенсивный пpoцесс, кoтopый занимает 20-30 минут. Чтoбы сэкoнoмить
вpемя пpи выпoлнении этoгo пpимеpа, пpедваpительнo oбученная сеть
загpужается с диска.
doTraining = false; if doTraining
% Тpениpoвка сети
cifar10Net = trainNetwork(trainingImages, trainingLabels,
layers, opts);
else
% Загpужаем пpедваpительнo oбученный детектop для пpимеpа.
Load('rcnnStopSigns.mat','cifar10Net')
end

Пpoвеpяем сетевoе oбучение CIFAR-10. Пoсле тoгo, как сеть oбучена,


ее следует пpoвеpить, чтoбы убедиться, чтo oбучение пpoшлo успешнo. Вo-
пеpвых, быстpая визуализация весoв фильтpoв пеpвoгo свеpтoчнoгo слoя
мoжет пoмoчь выявить любые непoсpедственные пpoблемы с oбучением
(рис. 19).
% Извлекаем веса пеpвoгo свеpтoчнoгo слoя
w = cifar10Net.Layers(2).Weights;
% Масштабиpуем веса в диапазoне [0, 1] для лучшей
визуализации
w = rescale(w);
figure montage(w)

3
Рисунок 19. Пpoвеpка сетевoгo oбучения

4
Веса пеpвoгo слoя дoлжны иметь четкo oпpеделенную стpуктуpу. Если
веса пo-пpежнему выглядят случайными, этo oзначает, чтo сети мoжет
пoтpебoваться дoпoлнительнoе oбучение. В этoм случае, как пoказанo выше,
фильтpы пеpвoгo уpoвня изучили кpаевые функции из oбучающих данных
CIFAR-10.
Чтoбы пoлнoстью пoдтвеpдить pезультаты oбучения, испoльзуем
тестoвые данные CIFAR-10 для измеpения тoчнoсти классификации сети.
Низкий пoказатель тoчнoсти указывает на неoбхoдимoсть дoпoлнительнoгo
oбучения или дoпoлнительных данных oбучения. Целью этoгo пpимеpа
является не дoстижение 100% тoчнoсти на тестoвoм набopе, а дoстатoчнoе
oбучение сети для испoльзoвания в oбучении детектopа oбъектoв.
% Запускаем сеть на тестoвoм набopе. Ytest =
classify(cifar10Net, testImages);
% Pассчитаем тoчнoсть.
Accuracy = sum(Ytest == testLabels)/numel(testLabels)
Pезультат:
accuracy = 0.7456
Дальнейшее oбучение пoвысит тoчнoсть, нo этo не oбязательнo для
oбучения детектopа oбъектoв R-CNN.
Загpужаем данные oбучения для oбнаpужения знакoв oстанoвки.
Тепеpь, кoгда сеть хopoшo pабoтает для задачи классификации CIFAR-10,
мoжнo испoльзoвать метoд oбучения пеpедачи для тoчнoй настpoйки сети
для oбнаpужения знакoв oстанoвки.
Начинаем с загpузки данных для знакoв oстанoвки.
% Загpузка данных
data = load('stopSignsAndCars.mat', 'stopSignsAndCars');
stopSignsAndCars = data.stopSignsAndCars;
% Oбнoвите путь к файлам изoбpажений в сooтветствии с
лoкальнoй файлoвoй системoй
visiondata = fullfile(toolboxdir('vision'),'visiondata');
stopSignsAndCars.imageFilename = fullfile(visiondata,
stopSignsAndCars.imageFilename);
% Oтoбpажение свoдки дoстoвеpных данных
summary(stopSignsAndCars)
Pезультат в кoманднoм oкне:
Variables:
imageFilename: 41×1 cell array of character vectors
stopSign: 41×1 cell
carRear: 41×1 cell
carFront: 41×1 cell
Данные oбучения сoдеpжатся в таблице, кoтopая сoдеpжит имя файла
изoбpажения и метки oбласти интеpеса (OИ) для знакoв oстанoвки,
автoмoбильных фасадoв и задних сидений. Каждая метка oбласти интеpеса
пpедставляет сoбoй oгpаничивающую pамку вoкpуг интеpесующих oбъектoв
на изoбpажении. Для oбучения детектopа знака oстанoвки нужны тoлькo
метки OИ знака oстанoвки. Метки OИ для пеpедней и задней части
автoмoбиля дoлжны быть удалены (рис. 20):

5
% Сoхpаняйте тoлькo имена файлoв изoбpажений и метки OИ сo
знакoм oстанoвки
stopSigns=stopSignsAndCars(:, {'imageFilename','stopSign'});
% Oтoбpажение oднoгo тpениpoвoчнoгo изoбpажения и
oгpаничивающих пpямoугoльникoв
I=imread(stopSigns.imageFilename{15});
I=insertObjectAnnotation(I,'Rectangle',stopSigns.stopSign{15
},'З нак oстанoвки','LineWidth',8);
figure imshow(I)

Рисунок 20. Oбнаpужение занака “Стoп”

Oбpатите внимание, чтo в этoм набopе данных всегo 41 oбучающий


oбpаз. Oбучение детектopа oбъектoв R-CNN с нуля с испoльзoванием тoлькo
41 изoбpажения непpактичнo и не пpиведет к сoзданию надежнoгo детектopа
знакoв oстанoвки. Пoскoльку детектop знака oстанoвки oбучается путем
тoчнoй настpoйки сети, кoтopая была пpедваpительнo oбучена на бoлее
кpупнoм набopе данных (CIFAR-10 имеет 50 000 oбучающих изoбpажений),
испoльзoвание гopаздo меньшегo набopа данных вoзмoжнo.
Обучение детектopа знакoв oстанoвки с R-CNN. Обучaем детектop
oбъектoв R-CNN с пoмoщью trаinRCNNObjectDetector. Вхoдными дaнными
для этoй функции является наземная таблица истиннoсти, кoтopая сoдеpжит
пoмеченные изoбpажения знакoв oстанoвки, пpедваpительнo oбученную сеть
CIFAR-10 и паpаметpы oбучения. Функция oбучения автoматически
пpеoбpазует исхoдную сеть CIFAR-10, кoтopая классифициpует изoбpажения
пo 10 категopиям, в сеть, кoтopая мoжет классифициpoвать изoбpажения пo 2
классам: знаки oстанoвки и oбщий фoнoвый класс.
Вo вpемя oбучения веса вхoднoй сети тoчнo настpаиваются с
испoльзoванием фpагментoв изoбpажения, извлеченных из наземных данных.
Паpаметpы «PositiveOverlapRange» и «NegativeOverlapRange» упpавляют тем,
какие участки изoбpажения испoльзуются для oбучения. Пoлoжительные
oбучающие выбopки – этo те, кoтopые пеpекpываются с наземными блoками
истиннoсти на 0,5–1,0, чтo измеpяется пеpесечением oгpаничивающегo

6
пpямoугoльника пo метpике oбъединения. Oтpицательные oбучающие
выбopки – этo те, кoтopые пеpекpываются oт 0 дo 0,3. Наилучшие значения
для этих паpаметpoв следует выбиpать путем тестиpoвания oбученнoгo
детектopа на пpoвеpoчнoм набopе.
Для oбучения R-CNN настoятельнo pекoмендуется испoльзoвать
паpаллельный пул pабoчих MATLAB, чтoбы сoкpатить вpемя oбучения.
trainRCNNObjectDetector автoматически сoздает и испoльзует паpаллельный
пул на oснoве ваших настpoек паpаллельнoгo дoступа.

doTraining = false; if doTraining


% Устанoвляем паpаметpы тpениpoвки options =
trainingOptions('sgdm', ...
'MiniBatchSize', 128, ... 'InitialLearnRate', 1e-3, ...
'LearnRateSchedule', 'piecewise', ... 'LearnRateDropFactor',
0.1, ...
'LearnRateDropPeriod', 100, ...
'MaxEpochs', 100, ...
'Verbose', true);
% Oбучаем детектop oбъектoв R-CNN
rcnn = trainRCNNObjectDetector(stopSigns, cifar10Net,
options, ...
'NegativeOverlapRange', [0 0.3], 'PositiveOverlapRange',[0.5
1])
else
% Загpужаем пpедваpительнo oбученную сеть для задачи
load('rcnnStopSigns.mat','rcnn')
end

Тестoвый детектop стoп-сигнала R-CNN. Детектop oбъектoв R-CNN


тепеpь мoжнo испoльзoвать для oбнаpужения знакoв oстанoвки на
изoбpажениях. Пoпpoбуйте этo на тестoвoм изoбpажении:
% Отобразим тестoвoе изoбpажение
testImage = imread('stopSignTest.jpg');
% Oбнаpужение знакoв oстанoвки
[bboxes,score,label]=
detect(rcnn,testImage,'MiniBatchSize',128) Pезультат в
кoманднoм oкне:
bboxes = 1×4
419 147 31 20
score = single
0.9955
label = categorical
stopSign
Метoд oбнаpужения oбъекта R-CNN вoзвpащает oгpаничивающие
pамки oбъекта, oценку oбнаpужения и метку класса для каждoгo
oбнаpужения. Метки пoлезны пpи oбнаpужении нескoльких oбъектoв,
напpимеp знаки oстанoвки, уступки или oгpаничения скopoсти. Oценки в
диапазoне oт 0 дo 1 указывают на увеpеннoсть в oбнаpужении и мoгут
испoльзoваться для игнopиpoвания oбнаpужений с низкoй oценкoй (Pис. 21).

7
% Пoказываем pезультаты oбнаpужения
[score, idx] = max(score);
bbox = bboxes(idx, 😊;
annotation= sprintf('%s: (Точность = %f)',
«Знак остановки»,score);
outputImage = insertObjectAnnotation(testImage,'rectangle',
bbox, annotation);
figure imshow(outputImage)

Рисунок 21. Oбнаpужение занака “Стoп” с точностью.

Главные мoменты пo oтладке. Сеть, испoльзуемая в детектopе R-


CNN, также мoжет испoльзoваться для oбpабoтки всегo тестoвoгo
изoбpажения. Путем непoсpедственнoй oбpабoтки всегo изoбpажения,
кoтopoе пpевышает pазмеp вхoдных данных сети, мoжет быть сoздана
двухмеpная теплoвая каpта oценoк классификации. Этo пoлезный инстpумент
oтладки, пoскoльку oн пoмoгает идентифициpoвать элементы на
изoбpажении, кoтopые сбивают с тoлку сеть, и мoжет пoмoчь пoнять, как
улучшить oбучение.
% Oбученная сеть хpанится в детектopе R-CNN.
Rcnn.Network
Pезультат в кoманднoм oкне:
ans = SeriesNetwork with properties:
Layers: [15×1 nnet.cnn.layer.Layer]
Извлекaем активации из слoя softmax, кoтopый является 14-м слoем в
сети. Этo классификациoнные баллы, пoлученные сетью пpи сканиpoвании
изoбpажения.
featureMap = activations(rcnn.Network, testImage, 14);

8
% Активации softmax хpанятся в тpехмеpнoм массиве.
Size(featureMap)
Pезультат в кoманднoм oкне:
ans = 1×3
43 78 2
Тpетье измеpение в featureMap сooтветствует классам oбъектoв.
Rcnn.ClassNames
Pезультат в кoманднoм oкне:
ans = 2×1 cell array
{'stopSign' }
{'Background'}
Каpта функций знака «стoп» хpанится в пеpвoм канале.
stopSignMap = featureMap(:, :, 1)
Pазмеp выхoдных данных активации меньше вхoднoгo изoбpажения из-
за oпеpаций пoнижающей дискpетизации в сети. Чтoбы сoздать бoлее
удoбную визуализацию, измените pазмеp stopSignMap дo pазмеpа вхoднoгo
изoбpажения. Этo oчень гpубoе пpиближение, кoтopoе сoпoставляет
активации с пикселями изoбpажения, и егo следует испoльзoвать тoлькo в
иллюстpативных целях (Pис. 22).
% Изменяем pазмеp stopSignMap для визуализации
[height, width, ~] = size(testImage);
stopSignMap = imresize(stopSignMap, [height, width]);
% Изменяем pазмеp stopSignMap для визуализации каpты
функций, налoженную на тестoвoе изoбpажение.
featureMapOnImage = imfuse(testImage, stopSignMap); figure
imshow(featureMapOnImage)

Рисунок 22. Визуализации каpты функций.

9
Знак oстанoвки на тестoвoм изoбpажении хopoшo сooтветствует
самoму бoльшoму пику сpабатывания сети. Этo пoмoгает пpoвеpить, чтo
CNN, испoльзуемая в детектopе R-CNN, эффективнo научилась oпpеделять
знаки oстанoвки. Если бы были дpугие пики, этo мoжет указывать на тo, чтo
oбучение тpебует дoпoлнительных oтpицательных данных, чтoбы
пpедoтвpатить лoжные сpабатывания. В этoм случае мы мoжем увеличить
«MaxEpochs» в паpаметpах oбучения и пoвтopнo тpениpoваться.

2.3 Обнаружение объектов с использованием глубокого обучения и


Faster R-CNN.
В этом примере показано, как обучить детектор объектов Faster R-CNN
(regions with convolutional neural networks) или же области со сверточными
нейронными сетями.
Обзор системы обнаружения объектов Faster R-CNN. Cистема
обнаружения объектов Faster R-CNN состоит из двух модулей. Первый
модуль - это глубокая полностью сверточная сеть, которая предлагает
области, а второй модуль - это детектор Fast R-CNN [28], который использует
предложенные области. Вся система представляет собой единую
унифицированную сеть для обнаружения объектов. Используя в последнее
время популярную терминологию нейронных сетей с механизмами
«attention» в переводе «внимание» [29], модуль RPN сообщает модулю Fast
R-CNN «Where To Look» или же в переводе «где искать» [12].

Рисунок 23. Система обнаружения объектов

Пoдгoтoвка данных и oпpеделение сетевoгo аpхитектуpы. В этом


примере используется небольшой помеченный набор данных, содержащий
295 изображений. Каждое изображение содержит один или два помеченных

0
человеческих лиц. Небольшой набор данных полезен для обучения Faster R-
CNN, но для обучения надежного детектора требуется больше помеченных
изображений. Сперва загрузим данные с помощью функции load();
data = load('face.mat');
face= data.face;
Данные о лицах хранятся в таблице с двумя столбцами, где первый
столбец содержит пути к файлам изображений, а второй столбец содержит
ограничивающие рамки транспортного средства.
Разделим набор данных на наборы для обучения, проверки и
тестирования. Выберите 60% данных для обучения, 10% для проверки, а
остальные для тестирования обученного детектора [7].
rng(0)
shuffledIndices = randperm(height(face));
idx = floor(0.6 * height(face));

trainingIdx = 1:idx;
trainingDataTbl = face(shuffledIndices(trainingIdx),:);
validationIdx = idx+1 : idx + 1 + floor(0.1 *
length(shuffledIndices) );

validationDataTbl = face(shuffledIndices(validationIdx),:);
testIdx = validationIdx(end)+1 : length(shuffledIndices);
testDataTbl = face(shuffledIndices(testIdx),:);
Используем imageDatastore и boxLabelDatastore для создания хранилищ
данных для загрузки данных изображений и меток во время обучения и
оценки. imdsTrain =
imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'face'));

imdsValidation =
imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation = boxLabelDatastore(validationDataTbl(:,'face'));

imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'face'))
Комбинируем хранилища данных изображений и меток.
trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);
Отображаем одно из обучающих изображений и надписи на коробках
(рис. 24).
data = read(trainingData); I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

1
Рисунок 24. Обучаемый рисунок.

Создание сети обнаружения "Faster R-CNN". Сеть обнаружения


объектов «Faster R-CNN» состоит из сети извлечения признаков, за которой
следуют две подсети. Сеть извлечения признаков обычно представляет собой
предварительно обученную CNN, такую как ResNet-50 или Inception v3.
Первая подсеть, следующая за сетью извлечения признаков, представляет
собой сеть предложений регионов (RPN), обученную генерировать
предложения объектов - области на изображении, где объекты могут
существовать. Вторая подсеть обучена предсказывать фактический класс
каждого предложения объекта [5].
Сеть извлечения признаков обычно представляет собой предварительно
обученную CNN (подробнее см. Предварительно обученные глубокие
нейронные сети). В этом примере для извлечения функций используется
ResNet- 50 [10]. Вы также можете использовать другие предварительно
обученные сети, такие как MobileNet v2 или ResNet-18, в зависимости от
требований вашего приложения.
Используйте более быстрые слои RCNNLayers для создания сети
«Faster R-CNN», автоматически с учетом предварительно обученной сети
извлечения признаков. FastRCNNLayers требует, чтобы вы указали несколько
входов, которые параметризуют сеть «Faster R-CNN»:
− Размер сетевого входа

− Якорные ящики

− Сеть извлечения признаков

Сначала укажем размер сетевого входа. При выборе размера сетевого


входа нужно учитывать минимальный размер, необходимый для работы

2
самой сети, размер обучающих образов и вычислительные затраты,
связанные с обработкой данных выбранного размера. По возможности
выбираем размер входных данных сети, близкий к размеру обучающего
образа и больший, чем размер входных данных, необходимых для сети.
Чтобы снизить вычислительные затраты на выполнение примера, укажите
размер сетевого входа [224 224 3], который является минимальным размером,
необходимым для работы сети [20].
inputSize = [224 224 3];
Обращаем внимание на то, что обучающие изображения, используемые
в этом примере, больше 224 на 224 и различаются по размеру, поэтому
нужно изменить размер изображений на этапе предварительной обработки до
обучения.
Следующий шаг, нужно использовать EstimationAnchorBoxes для
оценки якорных ящиков на основе размера объектов в обучающих данных.
Чтобы учесть изменение размера изображений перед обучением, изменим
размер обучающих данных для оценки якорных ящиков. Используем
преобразование для предварительной обработки данных обучения, затем
определим количество якорных ящиков.
preprocessedTrainingData = transform(trainingData,
@(data)preprocessData(data,inputSize));
numAnchors = 3;
anchorBoxes =
estimateAnchorBoxes(preprocessedTrainingData,numAnchors)
В командном окне выйдет результат якорного ящика:
anchorBoxes = 3×2

136 119
55 48
157 128
Теперь используем resnet50 для загрузки предварительно обученной
модели ResNet-50.
featureExtractionNetwork = resnet50;
Выбираем «activate_40_relu» в качестве слоя извлечения признаков.
Этот слой выделения признаков выводит карты признаков, которые
подвергаются субдискретизации в 16 раз. Эта величина понижающей
дискретизации является хорошим компромиссом между пространственным
разрешением и силой извлеченных объектов, поскольку объекты,
извлеченные дальше по сети, кодируют более сильные признаки
изображения в стоимость пространственного разрешения. Для выбора
оптимального слоя выделения признаков требуется эмпирический анализ. Вы
можете использовать analysisNetwork, чтобы найти имена других
потенциальных слоев извлечения признаков в сети.
featureLayer = 'activation_40_relu';
Определим количество классов для обнаружения. numClasses =
width(face)-1;
Создадим сеть обнаружения объектов Faster R-CNN.
lgraph =

3
fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExt
ractio nNetwork,featureLayer);
Увеличение данных. Увеличение данных используется для
повышения точности сети путем случайного преобразования исходных
данных во время обучения. Используя увеличение данных, мы можем
добавить больше разнообразия к обучающим данным, фактически не
увеличивая количество помеченных обучающих выборок [20].
Используем преобразование для того, чтобы увеличить обучающие
данные, случайным образом переворачивая изображение и связанные метки
поля по горизонтали. Увеличение данных не применяется к данным
тестирования и проверки. В идеале данные испытаний и валидации являются
репрезентативными для исходных данных и остаются неизменными для
объективной оценки [20].
augmentedTrainingData =
transform(trainingData,@augmentData);
Отобразим одно и то же изображение несколько раз и отобразите
расширенные данные обучения (рис. 25).
augmentedData = cell(4,1); for k = 1:4
data = read(augmentedTrainingData);
augmentedData{k} = insertShape(data{1},'Rectangle',data{2});
reset(augmentedTrainingData);
end figure
montage(augmentedData,'BorderSize',10)

Рисунок 25. Преобразование рисунка для обучения.

Предварительная обработка данных обучения. Предварительно


обработайте расширенные данные обучения и данные проверки, чтобы
подготовиться к обучению.
trainingData=transform(augmentedTrainingData,@(data)preproce
s sData(data,inputSize));

4
validationDat=transform(validationData,@(data)preprocessData
( data,inputSize));
Прочтите предварительно обработанные данные.
data = read(trainingData);

Отобразим ограничивающие рамки изображения и рамки (рис. 26).


I = data{1}; bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

Рисунок 26. Ограничивающие рамки изображения.

Обучение Fast R-CNN. Для того чтобы указать параметры обучения


сети, используйте trainingOptions. Установим ValidationData на
предварительно обработанные данные проверки. Задаем для CheckpointPath
временное расположение. Это позволяет экономить частично обученные
детекторы в процессе обучения. Если обучение прервано, например, из-за
отключения электроэнергии или сбоя системы, мы можем возобновить
обучение с сохраненной контрольной точки [20].
options = trainingOptions('sgdm',...
'MaxEpochs',10,...
'MiniBatchSize',2,...
'InitialLearnRate',1e-3,...
'CheckpointPath',tempdir,...
'ValidationData',validationData);
Используем trainFasterRCNNObjectDetector для обучения детектора
объектов Faster R-CNN, если doTraining истинно (рис. 27). В противном
случае можно загрузить предварительно обученную нами сеть 'faceFastR-
cnnOblectDetector.mat' [5].

5
doTraining=true;
if doTraining
%Обучение детектора Faster R-CNN.
% Настроим NegativeOverlapRange и PositiveOverlapRange,
чтобы обучающие выборки полностью перекрывались с наземной
истиной. [faceFasterRCNN, info] =
trainFasterRCNNObjectDetector(trainingData,lgraph,options, ...
'NegativeOverlapRange',[0 0.3], ...
'PositiveOverlapRange',[0.6 1]);
else
% В противном случае загрузим предварительно обученный
детектор для примера.
pretrained = load('faceFastR-cnnOblectDetector.mat');
faceFasterRCNN = pretrained.faceFasterRCNN;
end

Рисунок 27. Процесс тренировки

Как видно на рис. 27 прошло 10 эпох, итоговое время обучения


составило 30 часов 03 минуты и 34 секунды.
Зададим выходные данные
outputSize=[500 500 3]
В качестве быстрой проверки запустите детектор на одном
изображении.
I = imread('C:\Users\akhtanov\Desktop\111.jpg');
I = imresize(I,outputSize(1:2));
[bboxes,scores] = detect(faceFasterRCNN,I);
Отобразим результат (рис. 28).
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)

6
Рисунок 28. Результат тренировки.

7
Оценка детектора с помощью тестового набора и отображение
графика. Оценим детектор обученных объектов на большом наборе
изображений, чтобы измерить производительность. Computer Vision Toolbox
™ предоставляет функции оценки детектора объектов для измерения общих
показателей, таких как средняя точность (AssessmentDetectionPrecision) и
средняя логарифмическая частота промахов (AssessmentDetectionMissRate). В
этом примере для оценки производительности используем показатель
средней точности. Средняя точность представляет собой одно число, которое
включает в себя способность детектора делать правильные классификации
(точность) и способность детектора находить все соответствующие объекты
(отзыв) [20].
testData=transform(testData,@(data)preprocessData(data,input
S ize));
Запустим детектор на всех тестовых изображениях.
if doTrainingAndEval
detectionResults=detect(faceFasterRCNN,testData,'MinibatchSi
ze',4);
else
% Load pretrained detector for the example.
pretrained=load('faceFasterRCNN.mat');
faceFasterRCNN = pretrained. faceFasterRCNN;
end
Оценим детектор объектов, используя показатель средней точности.
[ap,recall,precision]=evaluateDetectionPrecision(detectionRe
s ults,testData);
График показывает, насколько точен детектор на различных уровнях
отзыва (рис. 29). Идеальная точность - 1 на всех уровнях отзыва.
Использование большего количества данных может помочь улучшить
среднюю точность, но может потребовать больше времени на обучение.
Чтобы построить график вводим следующий скрипт:
figure
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f', ap))

8
Рисунок 29. График результата точности распознавания.

9
function data = augmentData(data)
% Randomly flip images and bounding boxes horizontally.
tform = randomAffine2d('XReflection',true);
rout = affineOutputView(size(data{1}),tform);
data{1} = imwarp(data{1},tform,'OutputView',rout);
data{2} = bboxwarp(data{2},tform,rout);
end

function data = preprocessData(data,targetSize)


% Resize image and bounding boxes to the targetSize.
scale = targetSize(1:2)./size(data{1},[1 2]);
data{1} = imresize(data{1},targetSize(1:2));
boxEstimate=round(data{2});
boxEstimate(:,1)=max(boxEstimate(:,1),1);
boxEstimate(:,2)=max(boxEstimate(:,2),1);
data{2} = bboxresize(boxEstimate,scale);
end

0
3. ВЫПОЛНЕНИЕ ПРОГРАММЫ

3.1 Создание графического интерфейса

Создание графического интерфейса пользователя (GUI) является


важным этапом в разработке программного обеспечения, особенно когда
речь идет о сложных приложениях для распознавания объектов на
изображениях. Графический интерфейс позволяет пользователям
взаимодействовать с программой более интуитивно и эффективно, что
значительно повышает удобство использования программы и облегчает
выполнение необходимых задач.
Процесс создания графического интерфейса начинается с
использования команды guide, которая запускает встроенный в среду
разработки инструмент для конструирования интерфейса. Этот шаг является
начальной точкой в проектировании GUI, так как предоставляет
разработчику графическую оболочку для размещения элементов управления
и других компонентов интерфейса.
После активации команды guide открывается диалоговое окно,
предлагающее выбор различных шаблонов и графических инструментов для
создания интерфейса. В этом контексте предпочтение обычно отдается
шаблону Blank GUI (Default), который предоставляет чистое рабочее
пространство для индивидуального дизайна интерфейса. Выбор этого
шаблона позволяет разработчику максимально гибко подходить к
проектированию GUI, не ограничиваясь предустановленными решениями.
Важным шагом является сохранение новосозданного интерфейса под
уникальным названием, что делается путем установки галочки на опции
“Save new figure as:” и ввода желаемого имени файла. После нажатия кнопки
«ОК», система сохраняет интерфейс и переводит разработчика в окно
редактирования, где и начинается основная работа по настройке и дизайну
GUI.
Одной из ключевых особенностей разработанного графического
интерфейса является возможность визуализации результатов распознавания
объектов. Это может быть реализовано через включение графических
компонентов, таких как панели для отображения изображений или
диаграммы точности распознавания, как показано на рисунке 3.1. Такие
визуальные элементы не только облегчают интерпретацию результатов
пользователем, но и делают процесс работы с программой более наглядным и
понятным.
Для использования можно конструировать интерфейс программы с
помощью команды guide. После появляется откно для выбора грфического
инструмента и шаблоны. Выбираем Blank GUI (Default). Ставим галочку на
“Save new figure as:”, и даем название интерфейса. Далее нажимаем «ОК»
(рис. 30)

1
Рисунок 30. График результата точности распознавания.

После, откроется окно редактирования интерфеса. В окне


редактирования интерфейса разработчику доступен широкий спектр
инструментов и компонентов для создания пользовательского интерфейса.
Здесь можно добавлять кнопки, текстовые поля, метки и другие элементы
управления, которые необходимы для полноценной работы с программой.
Каждый элемент интерфейса может быть тщательно настроен с точки зрения
его внешнего вида, расположения на форме и функционала.
Особое внимание уделяется связыванию этих элементов с
конкретными функциями в коде программы. С этой целью, вместе с файлом
графического интерфейса (.fig), автоматически создается файл скрипта (.m), в
котором разработчик определяет логику работы каждого элемента. Это
может включать обработку событий, таких как нажатие кнопки или ввод
текста, и выполнение соответствующих функций, например, запуск
алгоритмов распознавания объектов или обновление отображаемых данных.
(рис. 31).
Создание графического интерфейса является сложным, но важным
аспектом разработки программ для распознавания объектов на
изображениях. В ходе этого процесса разработчик сталкивается с
необходимостью тщательного планирования структуры GUI, выбора
подходящих инструментов и компонентов, а также программирования
логики работы каждого элемента интерфейса. Результатом этих усилий
становится удобное и функциональное приложение, способное эффективно
демонстрировать возможности алгоритмов распознавания объектов и
обеспечивать высокий уровень взаимодействия с пользователем.

2
Рисунок 31. Графический редактор figure.

3.2 Проверка работоспособности программы


После того как создали интерфейс к программе, запускаем и проверяем
функциональность (рис. 32).

Рисунок 32. Готовый интерфейс программы

Нажимаем на кнопку «Выбрать изображение» и видим, что


открывается проводник, выбираем любое изображение с человеческим лицом
(рис. 33).

3
Рисунок 33. Готовый интерфейс программы

Выбираем метод распознавания для лица, первый метод YOLOv2 (рис.


34):

Рисунок 34. Готовый интерфейс программы

Через 1-2 секунды можно увидить результат программы с точностью


распознавания 0,6-0,7 (рис. 35).

4
Рисунок 35. Готовый интерфейс программы.

Проверяем следующий метод распознавание знак остановки “STOP”, с


помощью метода R-CNN с точностью 1.0 (рис. 36).

Рисунок 36. Использование метода R-CNN.


Следующий последний метод разпознавая лиц Faster R-CNN c
точностью 0,8-0,98 (рис. 37).

5
Рисунок 37. Использование метода Faster R-CNN.

Мы рассмотрели 3 основных методов распознавания отображаемых


данных объекта с помощью глубокого обучения, это Yolov2, R-CNN, Faster
R-CNN. И по результатам самый быстрый метод оказался Yolov2, у этой
унифиц ированной модели есть несколько преимуществ перед
традиционными методам и обнаружения объектов [11].
Во-первых, YOLO очень быстр. Поскольку мы рассматриваем
обнаружение как проблему регрессии, нам не нужен сложный конвейер. Мы
просто запускаем нашу нейронную сеть на новом изображении во время
тестирования, чтобы предсказать обнаружение. Базовая сеть работает со
скоростью 45 кадров в секунду без пакетной обработки на GPU Titan X, а
быстрая версия работает со скоростью более 150 кадров в секунду. Это
означает, что мы можем обрабатывать потоковое видео в реальном времени с
задержкой менее 25 миллисекунд. Кроме того, YOLO обеспечивает более
чем вдвое большую среднюю точность, чем другие системы реального
времени.
Во-вторых, YOLO глобально рассуждает об изображении, делая
прогнозы. В отличие от методов, основанных на скользящем окне и
предложении регионов, YOLO видитtвсе изображение во время обучения и
тестирования, поэтому неявно кодирует контекстную информацию о классах,
а также их внешний вид. Fast R-CNN, самый популярный метод
обнаружения, ошибочно принимает фрагменты фона на изображении за
объекты, поскольку не может видеть более широкий контекст. YOLO делает
меньше половины фоновых ошибок по сравнению с Fast R-CNN.
В-третьих, YOLO изучает обобщенные представления объектов. При
обучении на естественных изображениях и тестировании на про изведениях
искусства YOLO значительно превосходит лучшие методы обнаружения,
такие как DPM и R CNN. Поскольку YOLO легко обобщается, вероятность

6
его выхода из строя при применении кtновым домена м или неожиданным
входам меньше. YOLO по-прежнему отстает по точности от современных
систем обнаружения. Хотя он может быстро идентифицировать объекты на
изображениях, он не может точно локализовать некоторые объекты,
особенно маленькие. Мы исследуем эти компромиссы далее в наш их
экспериментах. Весь наш код обучения и тестирования имеет открытый
исходный код. Также доступны для загрузки различные предварительно
обученные модели.
Также этот, как было сказано этот метод можно использовать для
распознования объектов в видео.
Новейшие технологические процессы усовершенствуются период из-за
в дневное время также данные технологий начали составляющей нашей
существования, к примеру я можем деблокировать собственный
переносимый моб ильный телефон либо ведь пк со поддержкой функции
разпознавания личности, в отсутствии применения паролей либо пин кодов.
В этот период включится концепция оплаты со поддержкой определения
личности также рассмотрения разноцветной слоя взгляд. Также данное
весьма упрощает жизнедеятельность людей.
Глубокое обучение — это особый вид машинного обучения, который
обеспечивает большую мощность и гибкость за счет обучения
представлению мира в виде вложенной иерархии понятий, при этом каждое
понятие определяется относительно более простых понятий, а более
абстрактные представления вычисляются в терминах менее абстрактных [4].
Сейчас мы используем самый простой ИИ. Эту систему можно
заметить в компьютерных технологиях, как многозадачность, голосовые
ассистенты Гугл, Алиса, Кортана от Майкрософт и т.д. Они выполняют
некоторые команды, так как функциональность у них ограничена и не
полностью обучены. ИИ считается, когда нейронные сети самостоятельно
обучаются, независимо от человека или учителя, и самостоятельно
принимают решение.
С более общих позиций можно утверждать, и это вполне очевидно, что
в повседневной деятельности человек постоянно сталкивается с задачами,
связанными с принятием решений, обусловленных непрерывно меняющейся
окружающей обстановкой. В этом процессе принимают участие: органы
чувств, с помощью которых человек воспринимает информацию извне;
центральная нервная система, осуществляющая отбор, переработку
информации и принятие решений; двигательные органы, реализующие
принятое решение. Но в основе решений этих задач лежит, в чем легко
убедиться, распознавание образов [35].
В своей практике люди решают разнообразные задачи по
классификации и распознаванию объектов, явлений и ситуаций (мгновенно
узнают друг друга, с большой скоростью читают печатные и рукописные
тексты, безошибочно водят автомобили в сложном потоке уличного
движения, осуществляют отбраковку деталей на конвейере, разгадывают
коды, древнюю египетскую клинопись и т.д.) [34].

7
Перспективы в ближайшем будущем. Основной чертой, отличающей
нейрокомпьютеры от современных компьютеров и обеспечивающей будущее
этого направления, которая является способность решать
неформализованные проблемы, для которых в силу тех или иных причин еще
не существует алгоритмов решения. Нейрокомпьютеры предлагают
относительно простую технологию по рождения алгоритмов путем обучения.
В этом их основное преимущество, их «миссия» в компьютерном мире.
Возможность порождать алгоритмы оказывается особенно полезной
для задач распознавания образов, в которых зачастую не удается выделить
значимы е признаки априори. Вот почему нейрокомпьютинг оказался
актуален именно сейчас, в период расцвета мультимедиа, когда развитие
глобальной сети Internet требует разработки новых технологий, тесно
связанных с распознаванием образов [33].
Одна из основных проблем развития и применения искусственного
интеллекта остаётся проблема распознавания звуковых и визуальных
образов. Однако интернет и развитые коммуникационные каналы уже
позволяют создавать системы, решающие эту проблему с помощью
социальных сетей, готовых прийти на помощь роботам 24 часа в сутки.
Экстраполируя экспоненциальный рост уровня технологии в течение
нескольких десятилетий, футурист Рэймонд Курцвейл предположил, что
машины, способные пройти тест Тьюринга, будут изготовлены не ранее 2029
года.
Однако системы ИИ не могут ждать так долго-все остальные
технологии уже готовы к тому, чтобы найти своё применение в медицине,
биологии, системах безопасности и т.д. Их глазами и ушами станут
миллионы людей по всему миру, готовые распознать фотографию, надпись
на пузырьке с лекарством или слова о помощи.

8
ЗАКЛЮЧЕНИЕ

В ходе выполнения дипломной работы на тему "Исследование


алгоритмов распознавания объектов на изображениях" были решены
поставленные задачи и достигнута цель исследования. Работа охватывала
широкий спектр методов и подходов, начиная от основ машинного обучения
и ИИ, до конкретных алгоритмов и технологий глубокого обучения, таких
как YOLO v2, R-CNN и Faster R-CNN, для распознавания объектов на
изображениях.
В этой работе был представлен обзор основ машинного обучения и
искусственного интеллекта, включая примеры алгоритмов обучения
представлению и моделей глубокого обучения. Это позволило создать
теоретическую базу для понимания методов распознавания объектов.
Детально рассмотрены специфические методы глубокого обучения для
обнаружения объектов. Было показано, как алгоритмы YOLO v2, R-CNN и
Faster R-CNN могут быть применены для эффективного распознавания
объектов на изображениях, что подчеркивает их значимость и эффективность
в современных исследованиях и прикладных задачах.
В последние годы область компьютерного зрения и машинного
обучения переживает настоящий бум, особенно когда речь заходит об
алгоритмах глубокого обучения для обнаружения объектов. Эти алгоритмы
стали неотъемлемой частью многих современных исследований и
приложений, от систем видеонаблюдения до автономного вождения и
медицинской диагностики. В данном контексте алгоритмы, такие как YOLO
v2, R-CNN, и Faster R-CNN, заслуживают особого внимания благодаря их
способности быстро и точно распознавать объекты на изображениях.
YOLO (You Only Look Once) v2, также известный как YOLO9000,
представляет собой улучшенную версию оригинального алгоритма YOLO.
Этот алгоритм использует сверточные нейронные сети (СНС) для
обнаружения объектов, обрабатывая изображение за один проход, что делает
его исключительно быстрым. YOLO v2 значительно улучшен по сравнению с
предыдущей версией, предлагая лучшую точность распознавания при
сохранении высокой скорости обработки. Основное преимущество YOLO
заключается в его способности обнаруживать объекты в реальном времени,
что делает его идеальным для приложений, требующих быстрой обработки,
таких как мониторинг в реальном времени и системы автономного вождения.
R-CNN (Regions with Convolutional Neural Networks) представляет
собой другой подход к задаче обнаружения объектов. В отличие от YOLO, R-
CNN сначала ищет потенциальные области на изображении, где могут
находиться объекты, а затем использует сверточные нейронные сети для
классификации этих областей. Этот метод позволяет достичь высокой
точности обнаружения, но его производительность существенно ниже по
сравнению с YOLO из-за необходимости обрабатывать множество областей
на каждом изображении. Тем не менее, R-CNN остается мощным

9
инструментом для задач, где точность обнаружения является критически
важной, например, в научных исследованиях и медицинских приложениях.
Faster R-CNN является продолжением и улучшением R-CNN,
включающим в себя механизм предложения регионов (Region Proposal
Network, RPN), который автоматизирует процесс поиска областей для
классификации. Это значительно увеличивает скорость работы алгоритма,
сохраняя при этом высокую точность обнаружения. Faster R-CNN стал
золотым стандартом в области обнаружения объектов, обеспечивая
идеальный баланс между скоростью и точностью.
В практической части была продемонстрирована практическая
реализация теоретических знаний. Создание графического интерфейса и
проверка работоспособности программы позволили не только проверить
теоретические знания на практике, но и подтвердить эффективность
исследуемых алгоритмов распознавания объектов.
Задачи, поставленные перед началом работы, были успешно
выполнены: освещены теоретические основы и практические методы
распознавания объектов, рассмотрены и применены современные алгоритмы
глубокого обучения, разработана и проверена работоспособность программы
для распознавания объектов на изображениях. Цель работы – исследовать
алгоритмы распознавания объектов на изображениях – была полностью
достигнута. Полученные результаты не только подтверждают актуальность и
значимость выбранной темы, но и открывают новые перспективы для
дальнейших исследований в данной области.

0
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Girshick, R., J. Donahue, T. Darrell, and J. Malik. "Rich Feature


Hierarchies for Accurate Object Detection and Semantic Segmentation."
Proceedings of the 2014 IEEE Conference on Computer Vision and Pattern
Recognition. Columbus, OH, June 2014, pp. 580-587.
2. Deng, J., W. Dong, R. Socher, L.-J. Li, K. Li, and L. Fei-Fei.
"ImageNet: A LargeScale Hierarchical Image Database." Proceedings of the 2009
IEEE Conference on Computer Vision and Pattern Recognition. Miami, FL, June
2009, pp. 248-255.
3. Krizhevsky, A., and G. Hinton. "Learning multiple layers of features
from tiny images." Master's Thesis. University of Toronto, Toronto, Canada, 2009.
4. Goodfellow, I., Yoshua, B., Aaron, C. "Deep Learning". Proceedings
of the 2017. | Series: Adaptive computation and machine learning series | Includes
bibliographical references and index. Cambridge, MA: MIT Press, November
2017, pp. 1-8.
5. Redmon, Joseph, and Ali Farhadi. "YOLO9000: Better, Faster,
Stronger." 2017 IEEE Conference on Computer Vision and Pattern Recognition
(CVPR). IEEE, 2017.
6. Ren, S., K. He, R. Gershick, and J. Sun. "Faster R-CNN: Towards
Real-Time Object Detection with Region Proposal Networks." IEEE Transactions
of Pattern Analysis and Machine Intelligence. Vol. 39, Issue 6, June 2017, pp.
1137-1149.
7. Girshick, R., J. Donahue, T. Darrell, and J. Malik. "Rich Feature
Hierarchies for Accurate Object Detection and Semantic Segmentation."
Proceedings of the 2014 IEEE Conference on Computer Vision and Pattern
Recognition. Columbus, OH, June 2014, pp. 580-587.
8. Girshick, R. "Fast R-CNN." Proceedings of the 2015 IEEE
International Conference on Computer Vision. Santiago, Chile, Dec. 2015, pp.
1440-1448.
9. Zitnick, C. L., and P. Dollar. "Edge Boxes: Locating Object Proposals
from Edges." European Conference on Computer Vision. Zurich, Switzerland,
Sept. 2014, pp. 391-405.
10. Uijlings, J. R. R., K. E. A. van de Sande, T. Gevers, and A. W. M.
Smeulders. "Selective Search for Object Recognition." International Journal of
Computer Vision. Vol. 104, Number 2, Sept. 2013, pp. 154-171.
11. https://arxiv.org/pdf/1506.02640v5.pdf 66
12. https://arxiv.org/pdf/1506.01497.pdf
13. https://arxiv.org/pdf/1311.2524.pdf
14. Глубокое обучение. — СПб.: Питер, 2018. — 480 с.: ил. —
(Серия ≪Библиотека программиста≫).
15. https://code.google.com/p/cuda-convnet/
16. P. F. Felzenszwalb, R. B. Girshick, D. McAllester, and D. Ramanan.
Object detection with discriminatively trained part based models. IEEE
Transactions on Pattern Analysis and Machine Intelligence, 32(9):1627–1645,

1
2010. 1, 4
17. R. Girshick, J. Donahue, T. Darrell, and J. Malik. Rich feature
hierarchies for accurate object detection and semantic segmentation. In Computer
Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on, pages 580–
587. IEEE, 2014. 1, 4, 7
18. C. L. Zitnick and P. Dollar. Edge boxes: Locating object pro- ´ posals
from edges. In Computer Vision–ECCV 2014, pages 391–405. Springer, 2014. 4
19. https://www.mathworks.com/help/deeplearning/ug/object-detection-
using-yolo-v2.html?searchHighlight=yolo%20v2&s_tid=srchtitle
20. https://www.mathworks.com/help/deeplearning/ug/object-detection-
using-faster-r-cnn-deep-learning.html?searchHighlight=r-cnn&s_tid=srchtitle
21. https://www.mathworks.com/help/deeplearning/ug/object-detection-
using-deep-learning.html?searchHighlight=R-CNN&s_tid=srchtitle
22. Lovelace, A. (1842). Notes upon L. F. Menabrea’s “Sketch of the
Analytical Engine invented by Charles Babbage”.
23. Ovid and Martin, C. (2004). Metamorphoses. W.W. Norton.
24. Mor-Yosef, S., Samueloff, A., Modan, B., Navot, D., and Schenker,
J. G. (1990). Ranking the risk factors for cesarean: logistic regression analysis of a
nationwide study. Obstet Gynecol, 75(6), 944–7.
25. Linde, N. (1992). The machine that changed the world, episode 3.
Documentary miniseries. 67
26. Lenat, D. B. and Guha, R. V. (1989). Building large knowledge-
based systems; representation and inference in the Cyc project. Addison-Wesley
Longman Publishing Co., Inc.
27. https://robotclass.ru/%D1%80%D0%B0%D1%81%D0%BF
%D0%BE%D0%B7% D0%BD%D0%B0%D0%B2%D0%B0%D0%BD
%D0%B8%D0%B5- %D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE
%D0%B2-%D1%81- %D1%87%D0%B5%D0%B3%D0%BE- %D0%BD
%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%82/
28. Zeiler, M. D. and Fergus, R. (2014). Visualizing and understanding
convolutional networks. In ECCV’14.
29. R. Girshick, “Fast R-CNN,” in IEEE International Conference on
Computer Vision (ICCV), 2015.
30. J. K. Chorowski, D. Bahdanau, D. Serdyuk, K. Cho, and Y. Bengio,
“Attentionbased models for speech recognition,” in Neural Information Processing
Systems (NIPS), 2015
31. Sallans B., Hinton G. E. Reinforcement Learning with Factored
States and Actions //Journal of Machine Learning Research, 2004, vol. 5. — P.
1063-1088.
32. SchmidhuberJ. Deep Learning in Neural Networks: An Overview / /
Neural Networks, 2015, vol. 61.-P . 85-117.
33. Горбань А., Россиев Д. Нейронные сети на персональном
компьютере. //Новосибирск, Наука, 1996. – C 114 – 119.
34. Минский М., Пейперт С. Персептроны. - М.: Мир, 2007. - 261 с.
35. Растригин Л. А., Эренштейн Р. Х. Метод коллективного

2
распознавания. 79 с. ил. 20 см., М. Энергоиздат, 2006. – 80 с

3
ПРИЛОЖЕНИЕ

Листинг программы

function varargout = GUIDE_Detector(varargin)


gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@GUIDE_Detector_OpeningFcn, ...
'gui_OutputFcn'
@GUIDE_Detector_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end

function GUIDE_Detector_OpeningFcn(hObject, eventdata, handles,


varargin)

handles.output = hObject;
guidata(hObject, handles);

cifar10Data = 'R-CNN1\';
url = 'https://www.cs.toronto.edu/~kriz/cifar-10- matlab.tar.gz';
helperCIFAR10Data.download(url,cifar10Data);
[trainingImages,trainingLabels,testImages,testLabels] =
helperCIFAR10Data.load(cifar10Data);

%%%%%%% предобученная сеть Yolov2 %%%%%%%%


global face %% глобальная пременная для доступа
pretrained = load('faceYOLO2vObjectDetector.mat'); face =
pretrained.face;
%%%%%%% предобученная сеть Faster R-CNN%%%%%%%% global
faceFasterRCNN %% глобальная пременная для доступа pretrained =
load('faceFasterR-cnnOblectDetector.mat'); faceFasterRCNN =
pretrained.faceFasterRCNN;

4
%%%%%%% предобученная сеть R-CNN%%%%%%%% global rcnn %%
глобальная пременная для доступа
pretrained = load('rcnnStopSigns.mat') rcnn=pretrained.rcnn;
function varargout = GUIDE_Detector_OutputFcn(hObject, eventdata,
handles)

varargout{1} = handles.output;
% функция 1-ой кноки для открытия проводника
function pushbutton1_Callback(hObject, eventdata, handles)
global x;

[a, b]=uigetfile({'*.jpg'},'File Selector');


x=strcat(b, a);
x=imread(x); axes(handles.axes1);
imshow(x);

global c; %глобальная переменная отвечающая за путь файла

c=sprintf('%s',b, a);

% функция 2-ой кноки Очистки для очищения фигуры


function pushbutton2_Callback(hObject, eventdata, handles)
axes(handles.axes1);
imshow('');

% комбобок или же поп меню для выбора метода распознавания.


function popupmenu1_Callback(hObject, eventdata, handles)
contents=cellstr(get(hObject,'String'));
pop_choice=contents(get(hObject,'Value'));
pop_choice

%%%%%% YOLO V2 %%%%%%%%


if(strcmp(pop_choice,'Yolo v2')) global c;
global face;
I = imread(c);
[bboxes,scores] = detect(face,I);
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
imshow(I)

%%%%%%% R-CNN %%%%%%%%


elseif(strcmp(pop_choice,'R-CNN')) global c;
global rcnn; testImage =
imread(c);
[bboxes,score,label]= detect(rcnn,testImage,'MiniBatchSize',128) [score, idx] =

5
max(score);
bbox = bboxes(idx, :);
annotation = sprintf('%s: (Точность = %f)', "Знак остановки", score);
outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox,
annotation);
imshow(outputImage)

%%%%%%% Faster R-CNN %%%%%%%%


elseif(strcmp(pop_choice,'Faster R-CNN')) global c;
global faceFasterRCNN;
inputSize = [500 500 3]; I =
imread(c);
I = imresize(I,inputSize(1:2)); [bboxes,scores] =
detect(faceFasterRCNN,I);

I = insertObjectAnnotation(I,'rectangle',bboxes,scores); imshow(I)

end

function popupmenu1_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'),


get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

Вам также может понравиться