В этой статье я хочу рассказать об использовании сервиса 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 инструменты.

Комментарии (0)