В этой статье я хочу рассказать об использовании сервиса Custom Vision, для распознавания фотографий экомаркировок из мобильного приложения.
Сервис CustomVision является частью облачного Cognitive Services на платформе Azure.
О том, какие технологии пришлось изучить, как работать с CustomVision, что он из себя представляет и что позволяет достичь — далее.
Задача распознавания экомаркировок появилась три года назад, когда мы с супругой стали обсуждать мобильное приложение, которое ее организация (НКО в сфере экологии) хотела сделать для распространения информации об экомаркировках.
Что такое экомаркировка?
Экомаркировка – это сертификат и соответствующий логотип который выдают сертифицирующие организации, которые проверяют продукцию или услуги производителя-поставщика на соответствие определенным критериям связанным с жизненным циклом продукта-услуги и ориентированным на его экологичность. После сертификации производитель может размещать логотип экомаркировки на своей продукции.
Также к экомаркировкам можно отнести маркироку пластика по его составу для упрощения сорировки и переработки и другие подобные знаки.
Например, вот такой знак:
Процесс выбора технологии распознавания
Двумя основными фичами приложения должны были стать поиск магазинов с экотоварами и распознавание экомаркировок. Если с поиском магазинов технологически все относительно просто, то с распознаванием не очень. Слово модное, но как его сделать было не понятно. И я начал изучать вопрос.
Логотипы маркировок стандартизированные и являются идеальными объектами для распознавания – навел телефон на изображение на упаковке товара, сфотографировал и приложение выдает, что за знак, что он обозначает и стоит-ли ему доверять.
Я начал думать как сделать распознавание и анализировать разные варианты – попробовал OpenCV с его алгоритмами распознавания (каскады Хаара, SWIFT, Template matching и т.д. ) но качество распознавания было не очень – не более 70% при объеме обучающего набора в несколько десятков изображений.
Возможно, я где-то что-то недопонял и сделал не так, но мы так-же попросили еще одного знакомого поисследовать эту тему и он тоже сказал что 70% на каскадах Хаара это максимум на таком датасете.
Параллельно с этим все чаще стали появляться материалы о различных фреймворках нейросетей и успешном использовании нейросетей для решения подобных задач. Но везде мелькали какие-то ужасающие размеры датасетов (сотни-тысячи изображений на каждый класс), незнакомые мне Python, TensorFlow, необходимость своего бэкенда — это все несколько пугало.
Как .NET разработчик я посмотрел на Accord.NET но тоже не нашел быстро чего-то такого, что сразу бы подошло.
В это время мы были заняты доделкой приложения и запуском в прод и я отложил разбирательства с распознаванием.
Где-то год назад мне попалась на глаза статья с описанием раннего preview Custom Vision от Microsoft – сервисе классификации изображений в облаке. Я его протестировал на 3х знаках и он мне понравился – понятный портал, где можно и обучать и тестировать классификатор не имея технических знаний, обучение сета из 100 изображений за 10-20 секунд, качество классификации выше 90% даже на 30 изображениях каждого знака – то что нужно.
Я поделился находкой с супругой и мы начали делать менее функциональную международную версию приложения, который не содержит информации о товарах и магазинах, но умеет распознавать экомаркировки.
Давайте перейдем к техническим деталям работающего приложения с распознаванием.
Custom Vision
CV явлется частью Cognitive Services в Azure. Теперь его можно официально оформить, и он будет оплачивать с подписки Azure, хотя все еще числится в Preview.
Соответсвенно, как и любой другой продукт Azure, CognitiveServices отображаются и управляются на портале Azure.
CV предоставляет два REST API — один для тренировки (Training), другой – для распознавания (Prediction). Более детально я опишу взаимодействие с Prediction дальше
Кроме портала Azure и API пользователям CV доступен портал customvision.ai, где очень легко и наглядно можно загрузить изображения, расставить им метки, можно увидеть картинки и результаты распознаваний который проходили через API.
Порталом customvision.ai и API можно начать пользоваться без какой-либо привязки к Azure – для тестовых целей создается проект даже без Azure Subscription. Но если вы хотите сделать из своего тестового проекта в будущем продакшн проект, то лучше сделать это сразу, а то нам пришлось вручную копировать картинки из тестового проекта и заново размечать в продакшн.
Для того чтобы сделать проект в Azure, надо зарегистрироваться там и создать подписку. Это относительно легко, проблемы могут быть только с вводом и валидацией данных с банковской карты — иногда это случается.
После регистрации нужно создать инстанс ComputerVision через портал Azure
После создания ресурсов в Azure, они станут доступны в customvision.ai
На портале customvision.ai вы можете загрузить изображения и разметить их тегами – на одно изображение может быть несколько тегов, но без выделения областей. То есть изображение принадлежит нескольким классам, но на данном этапе развития сервиса нельзя выделить конкретный фрагмент на изображении и приписать его к классу.
После разметки нужно запустить тренировку, нажав кнопку Train – тренировка модели из 70 тегов и 3 тыс. изображений длится порядка 30 секунд.
Результаты тренировки сохраняются в сущности Iteration. Фактически через Iteration реализуется версионность.
Каждую Iteration можно использовать независимо – то есть можно создать Iteration, протестировать результат и удалить ее в случае, если не подходит или перевести в дефолтное и заменить текущее дефолтное Iteration и тогда все распознавания от приложений будут приходить в модель из этой Iteration.
Качество модели отображается в виде Precision и Recall (подробнее тут) как для всех классов сразу, так и по отдельности.
Вот так выглядит проект с уже загруженными и прошедшими через обучение изображениями.
На портале можно запустить распознавание изображения с диска или по URL с помощью Quick Test и провести тестирование распознавания по одному изображению.
На закладке Predictions можно посмотреть результаты всех последних распознаваний – проценты принадлежности к тегам отображаются прям на картинке.
Возможность увидеть все результаты распознаваний и добавить их в обучающую выборку буквально парой кликов мышкой очень помогает – этим может заниматься кто угодно, без каких-либо знаний в AI или программировании.
Использование API
Custom Vision Service обладает очень простым и интуитивно понятным REST API для обучения и распознавания.
В нашем приложении используется только API распознавания и я расскажу о его использовании
Url для распознавания вот такого вида:
https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/{Your project GUID}/image
где
southcentralus** – наименование Azure региона, где находится сервис. Пока сервис доступен только в South Central US регионе. Это не означает, что только там его можно использовать! Просто он там живет – использовать можно откуда угодно, где есть Интернет.
{Your project GUID}** — идентификатор вашего проекта. Его можно посмотреть на портале customvision.ai
Для распознавания необходимо отослать изображение через POST. Так-же можно отослать публично доступный url изображения и сервис скачает его самостоятельно.
Дополнительно нужно в Headers добавить header "Prediction-Key” в который передать один из Access Key которые будут выданы при регистрации – они доступны как на портале customvision.ai так и на портале Azure.
Результат содержит следующее поле:
"Predictions":[
{"TagId":"35ac2ad0-e3ef-4e60-b81f-052a1057a1ca","Tag":"dog","Probability":0.102716163},
{"TagId":"28e1a872-3776-434c-8cf0-b612dd1a953c","Tag":"cat","Probability":0.02037274}
]
Где Probability указывает на вероятность того что изображение принадлежит указанному тегу (классу).
В С# это выглядит вот так
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Prediction-Key", "{Acess key}");
string url = "https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/{Your project GUID}/image";
HttpResponseMessage response;
List<RecognitionResult> recognitions = new List<RecognitionResult>();
using (var content = new ByteArrayContent(imageBytes))
{
content.Headers.ContentType = new MediaTypeHeaderValue
("application/octet-stream");
response = await client.PostAsync(url, content);
if (response.IsSuccessStatusCode)
{
string strRes = await response.Content.ReadAsStringAsync();
dynamic res = (dynamic) JsonConvert.DeserializeObject(strRes);
foreach (var pr in res.predictions)
{
recognitions.Add(
new RecognitionResult()
{ Tag = pr.tagName, RecognPercent = pr.probability });
}
}
else
{
Debug.WriteLine(
"Non successful response. " + response.ToString());
}
}
Как можно увидеть – абсолютно ничего сложного. Вся магия происходит на стороне сервиса.
Приложение и некоторые подобранные параметры.
Приложение достаточно простое и состоит из списка Экомаркировок, информации о том что-такое экомаркировки, как они подразделяются и самого сканера.
Основная часть написана на Xamarin.Forms, но окно сканера работает с камерой и его пришлось делать как renders и реализовывать для каждой платформы отдельно
Уровень, когда приложение решает, что экомаркировка распознана точно >= 90% при этом почти все изображения распознаются если они более-менее приемлемого качества и нет других знаков на картинке.
Данное число было выведено эмпирически – мы начали с 80, но поняли что 90 снижает ложно-положительные срабатывания. А их случается достаточно много – многие маркировки похожи и содержат похожие элементы и цветовая гамма смещена к зеленому цвету.
Например вот это не самое качественное изображение распознается верно с точностью 91%
B при этом данный класс был обучен на 45 изображениях.
Надеюсь, статья была полезна и позволит заинтересованным читателям взглянуть на новые AI и ML инструменты.