Энди Батленд, глава Zone по разработке .NET, изучает возможности искусственного интеллекта и машинного обучения, предлагаемые Azure Custom Vision Service…

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

Недавно я работал с одним из таких сервисов: Custom Vision Service, частью набора Cognitive Services, предоставляемого Microsoft и размещенного в Azure.

Когнитивные службы предлагают несколько конкретных задач искусственного интеллекта или машинного обучения, предоставляемых в виде служб через API, которые мы можем интегрировать в веб-приложения, мобильные и настольные приложения, используя вызовы REST на основе JSON через HTTP или, во многих случаях, клиент более высокого уровня. библиотека.

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

Есть две службы, предлагающие функции, связанные с распознаванием изображений. Первым - и более известным - является Компьютерное зрение, в котором используется предварительно созданная модель, созданная и поддерживаемая Microsoft. Служба Custom Vision, доступная в настоящее время в предварительной версии, позволяет вам создавать и обучать вашу собственную модель, выделенную для заданного домена изображения.

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

Создание пользовательской модели сервиса Vision

Чтобы создать Custom Vision Service Model, вам понадобится подписка Azure. Войдите в систему, и, набрав «индивидуальное видение» в поле поиска, вы найдете ссылку на услугу. Подобно почти всем другим ресурсам Azure, вам будет представлена ​​колонка, в которой вам нужно выбрать имя, ценовой уровень, местоположение и некоторые другие детали, после чего будет создан экземпляр службы.

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

В настоящее время местоположением может быть только один регион Azure в США, но я бы ожидал, что служба будет развернута в большем количестве центров обработки данных, поскольку она выйдет из предварительной версии, что сократит задержку для доступа к ней с веб-сайтов и приложений, размещенных в других областях. мир.

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

Попав в этот настраиваемый портал, мы можем создать проект, присвоив ему имя, описание, выбрав один или несколько вариантов темы для каждого изображения и выбрав домен. Этот раздел важен, если вы хотите использовать модель в автономных контекстах, о которых я расскажу позже в этой статье, но пока только в том случае, если один из вариантов выбора (например, «ориентиры» или «еда») соответствует выбранной нами теме. имеет значение, если мы выберем что-нибудь, кроме «General».

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

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

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

Интеграция API прогнозирования

До сих пор мы взаимодействовали с интерфейсами портала Azure для создания нашей модели и работы с ней. Хотя мы могли бы и дальше использовать этот метод для первоначального обучения модели и постоянного ее совершенствования, реальная сила сервиса исходит от API, известного как API прогнозирования - , что позволяет нам интегрировать его в наши собственные приложения.

Однако перед этим нам нужно извлечь из портала три части информации, которые нам нужно будет передавать для целей идентификации и авторизации в запросах API. Это идентификатор проекта, URL-адрес проекта и ключ API прогнозирования.

На самом деле есть два способа получить доступ к API прогнозирования. Первый, и только если он работает кросс-платформенным, осуществляется через службы REST, вызываемые через HTTP, с передачей запросов и синтаксическим анализом ответа в JSON. В Windows у нас также есть возможность опираться на клиентскую библиотеку, которая абстрагирует некоторые из основных деталей HTTP-запросов и позволяет нам работать на более высоком и более строго типизированном уровне.

Хотя последний вариант проще, низкоуровневый подход на основе HTTP также довольно прост. Пример ключевого кода для его использования показан ниже:

Поскольку мы будем взаимодействовать с API, выполняя вызовы REST через HTTP, сначала нам нужно создать объект HttpClient.

Авторизация доступа к нашей модели осуществляется проверкой переданного значения заголовка, которое нам нужно установить перед тем, как сделать запрос. Имя заголовка - Prediction-Key, а значение - то, что мы получили на портале пользовательского видения для нашего проекта. Мы сохранили это в файле настроек, который в проектах функций Azure, из которых взят приведенный выше пример, отображается в виде переменных среды.

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

Мы используем вариант API, в котором мы предоставляем изображение как часть тела нашего запроса, а не предоставляем URL-адрес тестового изображения, которое также поддерживается, поэтому необходимо преобразовать загруженный файл из потока, к которому у нас есть доступ, в массив байтов, который затем помещается в экземпляр HttpContent.

Установив заголовок типа контента на application / octet-stream, мы можем затем сделать наш HTTP-запрос, используя метод POST.

Ответ возвращается в виде строки JSON в примере, который вы видите, который мы можем десериализовать в экземпляр строго типизированного класса, который мы также создали. Помимо некоторых деталей об использованном проекте и итерации, мы получаем список прогнозов - по одному для каждого тега, и для каждого тега вероятность того, насколько уверена модель в том, что предоставленное изображение соответствует тегу.

В клиентской библиотеке Windows код немного проще:

Здесь мы опираемся на два пакета NuGet. Сначала Microsoft.Cognitive.CustomVision.Prediction, которая является самой клиентской библиотекой, а затем Microsoft.Rest.ClientRuntime - еще одна библиотека, от которой зависит, используется для упаковки HTTP-вызовов REST. .

Исходя из них, у нас есть класс модели, поэтому нам не нужно создавать свой собственный и гарантировать, что он соответствует ожидаемому ответу JSON. Мы также абстрагируемся от HTTP-вызовов, поэтому нет HttpClient, с которым можно было бы работать, и нам нужно задавать заголовки и анализировать ответы.

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

Интеграция API обучения

Custom Vision Service предоставляет второй API, известный как обучающий API, который мы можем использовать для интеграции функций построения и обучения моделей в наши приложения. Хотя это не всегда будет полезно - и мы, конечно, можем продолжать использовать портал для таких задач - могут быть случаи, когда поддержка модели становится частью бизнес-процесса, и поэтому имеет смысл предоставлять такие функции в настраиваемом приложении. .

Мы работаем с обучающим API аналогично тому, как показано для API прогнозирования, хотя я бы предложил в этом случае, хотя мы могли бы использовать HTTP-вызовы более низкого уровня, характер обучающих функций означает, что мы, вероятно, будем выполняя ряд различных запросов к API, и, как таковые, вероятно, будет хотеть создать некую форму оболочки, чтобы поддерживать наш код поддерживаемым. Однако вместо этого имеет смысл использовать уже доступную клиентскую библиотеку с открытым исходным кодом, по крайней мере, если она поддерживается на платформах, с которыми вам нужно работать.

Автономная работа с пользовательской моделью сервиса Vision

Иногда запрос в реальном времени через Интернет невозможен или нецелесообразен - возможно, для мобильного или настольного приложения, где подключение к сети может быть недоступно постоянно. Custom Vision Service поддерживает подобные сценарии, позволяя нам экспортировать модель в файл, который мы можем встроить и использовать в наших приложениях.

Я упоминал ранее при создании проекта Custom Vision Service, что у нас была возможность выбрать домен. У нас был выбор между различными предметами высокого уровня, а также возможность выбрать «компактный» вариант, и это то, что нам нужно использовать для модели, которую мы хотим экспортировать и использовать в автономном режиме. К счастью, нам не нужно начинать создавать нашу модель заново, если мы уже создали ее со стандартным доменом; мы можем изменить домен существующей модели, а затем переобучить ее, чтобы создать новую итерацию с использованием выбранного домена.

Можно экспортировать только «компактные» домены, но при выборе этого мы должны пойти на компромисс в виде небольшого снижения точности из-за некоторых оптимизаций, которые были внесены в модель для ограничений классификации в реальном времени на мобильных устройствах. .

Когда мы экспортируем и загружаем итерацию модели, у нас есть выбор из нескольких форматов, каждый из которых подходит для разных платформ приложений. Например, мы можем выбрать CoreML для IoS, TensorFlow для Android и Python или ONNX для Windows UWP.

Узнать больше

Основная причина, по которой я исследую и работаю с Custom Vision Service, связана с работой над созданием курса для Pluralsight, где я вхожу в предмет гораздо более подробно, чем описано в этой статье, иллюстрирую демонстрации и примеры приложений. , пройдитесь по коду и обсудите более подробную информацию о теории классификации изображений и о том, как мы можем измерить и усовершенствовать наши модели.

Если у вас есть подписка на Pluralsight или вы заинтересованы в получении бесплатной пробной версии, вы можете получить доступ к курсу здесь.

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

Дополнительные полезные ссылки и справочные материалы, которые я использовал при создании курса, примеров и написании статьи: