Как написать программу распознавания изображений
Перейти к содержимому

Как написать программу распознавания изображений

Создаём нейронную сеть InceptionV3 для распознавания изображений

Привет, Хабр! Под катом пойдёт речь о реализации свёрточной нейронной сети архитектуры InceptionV3 с использованием фреймворка Keras. Статью я решил написать после ознакомления с туториалом «Построение мощных моделей классификации с использованием небольшого количества данных». С одобрения автора туториала я немного изменил содержание своей статьи. В отличие от предложенной автором нейронной сети VGG16, мы будем обучать гугловскую глубокую нейронную сеть Inception V3, которая уже предустановлена в Keras.

  1. Импортировать нейронную сеть Inception V3 из библиотеки Keras;
  2. Настраивать сеть: загружать веса, изменять верхнюю часть модели (fc-layers ), таким образом, приспосабливая модель под бинарную классификацию;
  3. Проводить тонкую настройку нижнего свёрточного слоя нейронной сети;
  4. Применять аугментацию данных при помощи ImageDataGenerator;
  5. Обучать сеть по частям для экономии ресурсов и времени;
  6. Оценивать работу модели.

1. Данные:

В нашем примере мы будем использовать изображения с соревнования по машинному обучению под названием «Dogs vs Cats» на kaggle.com. Данные будут доступны после регистрации. Набор включает в себя 25000 изображений: 12500 кошек и 12500 собак. Класс 1 соответствует собакам, класс 0- кошкам. После загрузки архивов, разместите по 1000 изображений каждого класса в директориях следующим образом:

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

У нас есть три проблемы:
  1. Ограниченный объём данных;
  2. Ограниченные системные ресурсы (у меня, к примеру, Intel Core i5-4440 3.10GHz, 8 Гб оперативной памяти, NVIDIA GeForce GTX 745);
  3. Ограниченное время: мы хотим обучать модель меньше суток.
При ограниченном объёме изображения высока вероятность переобучения. Для борьбы с этим нужно:
  1. Установить большой Dropout. В нашем случае он будет 0.5;
  2. Будем использовать аугментацию данных. Этот приём позволит нам увеличить количество изображений путём различных трансформаций (в нашем случае будут изменения масштаба, сдвиги, горизонтальное отражение).
  3. Для нашего эксперимента мы возьмём глубокую сеть.
  1. Изначально мы используем модель, обученную на большом количестве изображений из базы imagenet. Благо, что набор изображений включал кошек и собак;
  2. Будем обучать модель по частям:
  3. Сначала прогоним аугментированные изображения через нижнюю часть сети (только через Inception) и сохраним их в виде numpy массивов;
  4. Обучим с помощью полученных numpy массивов верхний полносвязный слой;
  5. Затем, мы объединим верхний и нижний слои модели и проведём тонкую настройку новой модели, но при этом мы заблокируем от обучения у Inception все слои, кроме последнего.

2. Создадим модель InceptionV3, загрузим в неё изображения, сохраним их:

В библиотеке Keras находится несколько подготовленных нейронных сетей.

include_top: включать или не включать верхнюю часть сети, которая представляет из полносвязный слой с 1000 выходов.
Нам он без надобности, поэтому ставим: include_top=False;

weights: загружать/не загружать обученные веса. Если None, веса инициализируются случайно. Если «imagenet», будут загружены веса, тренированные на данных ImageNet.
В нашей модели веса нужны, поэтому weights=«imagenet»;

input_tensor: данный аргумент удобен, если мы используем слой Input для нашей модели.
Мы его не будем трогать.

input_shape : в этом аргументе мы задаём размер нашего изображения. Его указывают, если отсоединяется верхний слой (include_top=False). Если мы загрузили модель с верхним слоем, сто размер изображения должен быть только (3, 299, 299).
Мы убрали верхний слой и хотим анализировать изображения меньшего размера (3, 150, 150). Поэтому кажем: input_shape=()

Создаём нашу модель:

Теперь сделаем аугментацию данных. Для этого в Keras предусмотрены так называемые ImageDataGenerator. Они будут брать изображения прямо из папок и проводить над ними все необходимые трансформации.

Картинки каждого класса должны быть в отдельных папках. Для того, чтобы нам не загружать оперативную память изображениями, мы их трансформируем прямо перед загрузкой в сеть. Для этого используем метод .flow_from_directory. Создадим отдельные генераторы для тренировочных и тестовых изображений:

Хочу выделить важный момент. Мы указали shuffle=False. То есть, изображения из разных классов не будут перемешиваться. Сначала будут поступать изображения из первой папки, а когда они все закончатся, из второй. Зачем это нужно, увидите позже.

Прогоним аугментированные изображения через обученную Inception и сохраним вывод в виде numpy массивов:

Процесс займёт некоторое время.

3. Создадим верхнюю часть модели, загрузим в неё данные, сохраним их:

В оригинальном посте автор использовал один слой сети с 256 нейронами, однако я буду использовать два слоя по 64 нейрона в каждом и Dropout слой со значением 0.5. Это изменение я был вынужден внести из-за того, когда я обучал готовую модель (которую мы сделаем в следующем шаге), мой компьютер зависал и перезагружался.

Загрузим массивы:

Обратите внимание, ранее мы указывали shuffle=False. А теперь мы легко укажем labels. Поскольку в каждом классе у нас 2000 изображений и все изображения поступали по очереди, у нас будет по 1000 нулей и 1000 единиц для тренировочной и для тестовой выборок.

Создадим модель FFN сети, скомпилируем её:
Загрузим в неё наши массивы:

Теперь мы загружаем данные не из папок, поэтому используем обычный метод fit.

Оценим точность модели:

Наша модель удовлетворительно справляется со своей задачей. Но принимает она только numpy массивы. Это нас не устраивает. Для того, чтобы получить полноценную модель, которая принимает на вход изображения, мы соединим две наши модели и обучим их ещё раз.

4. Создадим итоговую модель, загрузим в неё аугментированные данные, сохраним веса:

Загрузим в неё веса:

Скажу честно, я не заметил никакой разницы между эффективностью обучения модели с загрузкой весов или без неё. Но оставил этот раздел, потому что он описывает, как загрузить веса в определённые слои по имени (by_name=True).

Заблокируем с 1 по 205 слои Inception:
Скомпилируем модель:

Сделаем так, чтобы в процессе обучения сохранялись только веса с наибольшей точностью на тестовой выборке:

Создадим новые генераторы изображений для обучения полной модели. Мы будем трансформировать только учебную выборку. Тестовую трогать не будем.

pred_generator мы используем позже для демонстрации работы модели.

Загрузим изображения в модель:

У меня на каждую эпоху уходило по 210-220 секунд. 200 эпох обучения заняли около 12 часов.

5. Оценим точность модели

Вот нам и пригодился pred_generator. Обратите внимание, val_samples должны соответствовать величине batch_size в генераторе!

Точность 91,7%. Учитывая ограниченность выборки, возьму на себя смелость сказать, что это неплохая точность.

Проиллюстрируем работу модели

Просто смотреть на % правильных ответов и величину ошибки нам не интересно. Давайте посмотрим, сколько правильных и неправильных ответов дала модель для каждого класса:

pred_generator.next() удобная штука. Она загружает изображения в переменную и присваивает лейблы.

Количество изображений каждого класса будет различным при каждой генерации:

Сколько изображений каждого класса модель предсказала правильно?

pd.crosstab(labels,rounded_pred)

Col_0 0.0 1.0
Row_0
0.0 47 4
1.0 8 41

Для модели было загружено 100 случайных изображений: 51 изображение кошек и 49 собак. Из 51 кошки модель правильно распознала 47. Из 50 собак правильно были распознаны 41. Общая точность модели на этой узкой выборке составила 88%.

Посмотрим, какие фотографии были распознаны неправильно:


Синие числа-истинный класс изображений. Красные числа- предсказанные моделью (если красное число меньше 0.5, модель считает, что на фото кот, если больше 0.5, то собака). Чем больше число приближается к нулю, тем сеть больше уверена, что перед ней кот. Интересно, что много ошибок с изображениями собак содержат породы небольшого размера или щенков.

Посмотрим первые 20 изображений, которые модель предсказала правильно:


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

Я надеюсь, что пост был вам полезен. С удовольствием выслушаю ваши вопросы или пожелания.

Как написать программу распознавания изображений

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 71a9e880bbd690a3 • Your IP : 82.102.23.104 • Performance & security by Cloudflare

Руководство. Обнаружение знака STOP на изображениях с помощью Model Builder

Узнайте, как с помощью ML.NET Model Builder и Машинного обучения Azure создать модель обнаружения объектов для нахождения на изображениях знака STOP.

В этом руководстве вы узнаете, как:

  • Подготовка и анализ данных
  • Создание файла конфигурации Model Builder
  • выбрать сценарий;
  • выбрать среду обучения;
  • Загрузка данных
  • Обучение модели
  • Оценка модели
  • Использование модели для прогнозирования

Построитель моделей в настоящее время находится на этапе предварительной версии.

Предварительные требования

Список необходимых компонентов и инструкции по установке см. в руководстве по установке построителя моделей.

Общие сведения об обнаружении объектов в Model Builder

Обнаружение объектов — это задача в области компьютерного зрения. Несмотря на связь с классификацией изображений, обнаружение объектов выполняет классификацию изображений в более детализированном масштабе. Обнаружение объектов находит и категоризует сущности на изображениях. Модели обнаружения объектов обычно обучаются с использованием глубокого обучения и нейронных сетей. Дополнительные сведения: Сравнение глубокого и машинного обучения.

Используйте обнаружение объектов, если изображения содержат несколько объектов разных типов.

Screenshots showing Image Classification versus Object Classification.

Некоторые варианты применения обнаружения объектов:

  • Автомобили с автономным управлением
  • Робототехника
  • Обнаружение лиц
  • Техника безопасности
  • Подсчет объектов
  • Распознавание активности

В этом примере создается консольное приложение .NET Core на языке C#, которое определяет знак STOP на изображениях с помощью модели машинного обучения, созданной в Model Builder. Исходный код примера из этого руководства можно найти в репозитории dotnet/machinelearning-samples на сайте GitHub.

Подготовка и анализ данных

Набор данных Stop Sign содержит 50 изображений, скачанных с сайта Unsplash, на каждом из которых есть хотя бы один знак STOP.

Создание нового проекта VoTT

Скачайте набор данных, содержащий 50 изображений со знаком STOP, и распакуйте его.

Скачайте VoTT (средство расстановки тегов для визуальных объектов).

Откройте VoTT и выберите элемент New Project (Создать проект).

VoTT Home Screen

В разделе Project Settings (Параметры проекта) укажите в поле Display Name (Отображаемое имя) значение StopSignObjDetection.

Укажите в поле Security Token (Маркер безопасности) значение Generate New Security Token (Создать новый маркер безопасности).

Рядом с полем Source Connection (Исходное подключение) щелкните элемент Add Connection (Добавить подключение).

В разделе Connection Settings (Параметры подключения) укажите в поле Display Name (Отображаемое имя) для подключения к источнику значение StopSignImages и укажите в поле Provider (Поставщик) значение Local File System (Локальная файловая система). В поле Folder Path (Путь к папке) укажите папку Stop-Signs с 50 обучающими изображениями и щелкните элемент Save Connection (Сохранить подключение).

VoTT New Connection Dialog

В разделе Project Settings (Параметры проекта) укажите в поле Source Connection (Исходное подключение) значение StopSignImages (только что созданное подключение).

В поле Target Connection (Целевое подключение) также укажите значение StopSignImages. Теперь раздел Параметры проекта должен выглядеть примерно так, как показано на следующем снимке экрана:

VoTT Project Settings Dialog

Щелкните элемент Save Project (Сохранить проект).

Добавление тегов и меток к изображениям

Теперь вы должны увидеть окно с изображениями для предварительного просмотра всех обучающих изображений слева, выбранным изображением для предварительного просмотра в центре и столбцом Tags (Теги) справа. Это экран редактора тегов.

Чтобы добавить новый тег, щелкните значок плюса (первый) на панели инструментов Tags (Теги).

Назовите тег Stop-Sign и нажмите клавишу ВВОД на клавиатуре.

VoTT New Tag

Щелкните и удерживайте левую копку мыши, чтобы нарисовать прямоугольник вокруг каждого знака STOP на изображении. Если курсор не позволяет нарисовать прямоугольник, попробуйте сделать это с помощью средства Draw Rectangle (Нарисовать прямоугольник) на панели инструментов вверху или используйте сочетание клавиш R .

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

Щелкните в наборе данных следующее изображение для предварительного просмотра и повторите эту процедуру.

Продолжайте шаги 3–4 для каждого из этих изображений.

Экспорт JSON в VoTT

Промаркировав все обучающие изображения, можно экспортировать файл, который Model Builder будет использовать для обучения.

Выберите значок с диагональной стрелкой на панели инструментов слева (четвертый), чтобы перейти в раздел Export Settings (Параметры экспорта).

Оставьте в поле Provider (Поставщик) значение VoTT JSON.

Укажите в поле Asset State (Состояние ресурса) значение Only tagged Assets (Только ресурсы с тегами).

Снимите флажок Include Images (Включить изображения). Иначе обучающие изображения будут скопированы в создаваемую папку экспорта, что является необязательным действием.

Щелкните элемент Save Export Settings (Сохранить параметры экспорта).

VoTT Export Settings

Вернитесь в редактор тегов (второй значок на панели инструментов слева в форме ленты). На верхней панели инструментов щелкните значок Export Project (Экспорт проекта) (последний значок в форме стрелки) или нажмите клавиши CTRL + E .

В ходе экспорта будет создана новая папка с именем vott-json-export в папке Stop-Sign-Images, которая будет содержать файл JSON с именем StopSignObjDetection-export. Этот файл JSON будет использоваться в следующих шагах для обучения модели обнаружения объектов в Model Builder.

Создание консольного приложение

В Visual Studio создайте консольное приложение C# .NET Core с именем StopSignDetection.

Создание файла mbconfig

  1. В Обозревателе решений щелкните правой кнопкой мыши проект StopSignDetection и выберите элементы Добавить>Модель машинного обучения. , чтобы открыть пользовательский интерфейс Model Builder.
  2. В диалоговом окне присвойте проекту Model Builder имя StopSignDetection и нажмите кнопку Добавить.

Выбор сценария

В этом примере сценарий включает обнаружение объектов. На этапе Сценарий в Model Builder выберите сценарий Обнаружение объектов.

Model Builder wizard in Visual Studio

Если вариант Обнаружение объектов не отображается в списке сценариев, попробуйте обновить версию Model Builder.

Выбор среды обучения

Сейчас Model Builder поддерживает обучение моделей обнаружению объектов только с использованием Машинного обучения Azure, поэтому обучающая среда Azure выбрана по умолчанию.

Azure training environment selection

Чтобы обучить модель с помощью Машинного обучения Azure, создайте эксперимент Машинного обучения Azure в Model Builder.

Эксперимент Машинного обучения Azure инкапсулирует конфигурацию и результаты одного или нескольких обучающих выполнений машинного обучения.

Чтобы создать эксперимент Машинного обучения Azure, необходимо сначала настроить среду в Azure. Для выполнения эксперимента требуется следующее:

  • подписка Azure;
  • рабочая область — ресурс Машинного обучения Azure, который является централизованным расположением для всех ресурсов и артефактов Машинного обучения Azure, создаваемых в ходе обучения;
  • вычислительная среда Машинного обучения — облачная виртуальная машина Linux, используемая для обучения; см. сведения о вычислениях, поддерживаемых Model Builder.

Настройка рабочей области Машинного обучения Azure

Чтобы настроить среду:

Нажмите кнопку Настроить рабочую область.

В диалоговом окне Создание нового эксперимента выберите свою подписку Azure.

Создайте новую рабочую область Машинного обучения Azure или выберите существующую.

При создании новой рабочей области подготавливаются следующие ресурсы:

  • Рабочая область службы «Машинное обучение Azure»
  • Хранилище Azure
  • Azure Application Insights
  • Реестр контейнеров Azure
  • Хранилище ключей Azure;

В результате этот процесс может занять несколько минут.

Создайте новое вычисление машинного обучения Azure или выберите существующее. Это может занять несколько минут.

Оставьте имя эксперимента по умолчанию и щелкните элемент Создать.

Azure Workspace Setup Dialog

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

Если вас устраивает конфигурация, нажмите кнопку Следующий шаг в Model Builder, чтобы перейти к шагу Данные.

Загрузка данных

На шаге Данные в Model Builder вы выберете обучающий набор данных.

В настоящее время Model Builder принимает только формат JSON, созданный VoTT.

Нажмите кнопку в разделе Источник и воспользуйтесь проводником, чтобы найти файл StopSignObjDetection-export.json , который должен быть расположен в каталоге Stop-Signs/vott-json-export.

Model Builder Data Step

Если данные в разделе Предварительная версия данных выглядят правильно, нажмите кнопку Следующий шаг, чтобы перейти к шагу Обучение.

Обучение модели

Следующий шаг — обучение модели.

На экране Обучение в Model Builder нажмите кнопку Начать обучение.

На этом этапе ваши данные будут отправлены в службу хранилища Azure и в Машинном обучении Azure начнется процесс обучения.

Точная продолжительность обучения зависит от объема данных и выбранных вычислительных ресурсов. Первое обучение модели в Azure может длиться чуть дольше, так как необходимо подготовить ресурсы. В этом примере с 50 изображениями обучение заняло около 16 минут.

Ход выполнения можно отслеживать на портале Машинного обучения Azure, щелкнув ссылку Мониторинг текущего выполнения на портале Azure в Visual Studio.

Когда обучение завершится, нажмите кнопку Следующий шаг, чтобы перейти к шагу Оценка.

Оценка модели

На экране оценки вы сможете просмотреть результаты процесса обучения, а также проверить точность модели.

Model Builder Evaluate Step

В этом случае точность составляет 100 %. Это означает, что модель, скорее всего, переобучена из-за слишком большого числа изображений в наборе данных.

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

Щелкните элемент Browse an image (Обзор изображения) и укажите тестовое изображение — желательно такое, которое модель не использовала в процессе обучения.

Model Builder Try your model

Оценка, отображаемая для каждого обнаруженного ограничивающего прямоугольника, указывает на достоверность обнаруженного объекта. Например, на снимке экрана выше оценка для ограничивающего прямоугольника вокруг знака STOP указывает на то, что модель с 99 % достоверностью распознает обнаруженный объект как знак STOP.

Порог оценки, который можно увеличить или уменьшить с помощью ползунка, позволяет добавлять и удалять обнаруженные объекты на основе их оценок. Например, если порог равен 0,51, модель будет показывать только те объекты, которые имеют оценку достоверности 0,51 и выше. По мере увеличения порога будет отображаться меньшее число обнаруженных объектов и наоборот.

Если вас не устраивают метрики точности, один простой способ повысить точность модели — использовать больше данных. В противном случае нажмите ссылку Следующий шаг, чтобы перейти к шагу Использование в Model Builder.

(Необязательно) Использование модели

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

  • Консольное приложение
  • Веб-интерфейс API

Консольное приложение

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

Назовите консольный проект StopSignDetection_Console.

Нажмите кнопку Добавить в решение, чтобы добавить проект в текущее решение.

Выходные данные программы должны выглядеть примерно так:

Веб-интерфейс API

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

Назовите проект веб-API StopSignDetection_API.

Нажмите кнопку Добавить в решение, чтобы добавить проект в текущее решение.

Откройте PowerShell и введите следующий код, где PORT — это порт, который прослушивается приложением.

В случае успешного выполнения результат должен выглядеть, как показано ниже.

  • В столбце boxes указываются координаты ограничивающего прямоугольника обнаруженного объекта. Значения здесь относятся к левой, верхней, правой и нижней координатам соответственно.
  • labels — это индекс прогнозируемых меток. В этом случае значение 1 — это знак завершения.
  • scores определяет, насколько модель уверена в том, что ограничивающий прямоугольник относится к этой метке.

(Необязательно) Координаты ограничивающего прямоугольника нормализованы по ширине в 800 пикселей и высоте в 600 пикселей. Чтобы масштабировать координаты ограничивающего прямоугольника для изображения при последующей обработке, необходимо:

  1. Умножить верхние и нижние координаты на исходную высоту изображения, а левые и правые — на исходную ширину изображения.
  2. Разделить верхние и нижние координаты на 600, а левые и правые — на 800.

Например, при наличии исходных размеров изображения, actualImageHeight и actualImageWidth , и ModelOutput prediction следующий фрагмент кода показывает, как масштабировать координаты BoundingBox :

Изображение может иметь несколько ограничивающих прямоугольников, так что этот процесс должен применяться к каждому из них.

Поздравляем! Вы успешно создали модель машинного обучения для обнаружения знака STOP в изображениях с помощью Model Builder. Исходный код примера из этого руководства можно найти в репозитории dotnet/machinelearning-samples на сайте GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *