{"id":14277,"url":"\/distributions\/14277\/click?bit=1&hash=17ce698c744183890278e5e72fb5473eaa8dd0a28fac1d357bd91d8537b18c22","title":"\u041e\u0446\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0440\u044b \u0431\u0435\u043d\u0437\u0438\u043d\u0430 \u0438\u043b\u0438 \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u0438\u044f","buttonText":"\u041a\u0430\u043a?","imageUuid":"771ad34a-9f50-5b0b-bc84-204d36a20025"}

Как машинному обучению прокрасться в продукт

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

В статье я попробую рассказать общие принципы быстрого прототипирования, которыми пользуемся сами, пользуются многие коллеги и партнёры.
Краткую версию статьи я публиковал неделю назад тут. Эта версия раза в три больше:)

Общие подходы

Старайтесь избегать создание того чего нигде не существует

Не планируйте что-то принципиально новое. Скорее всего, если вы придумали какую то принципиально новую технологию, которую нигде не видели - вы делаете что-то не так. Чем дальше от существующих экземпляров - тем дольше и дороже будет разработка, и тем меньше вероятность того что это вообще можно создать. До сих пор нет полностью автономных автомобилей, несмотря на десятки прототипов от крупнейших компаний. Распознать возраст точнее чем 5 -10 лет нельзя. Все стартапы которые пробовали распознать ложь по видео - развалились, переориентировались или продают нерабочую систему.

Не факт что нельзя сделать что-то принципиально новое, но это должен быть очень мощный стоп-фактор. Особенно если вы не эксперт в Computer Vision (а тогда эта статья вряд ли будет для вас полезна).

Использовать готовое

Старайтесь создать прототип из того что есть под рукой:

Вам нужно распознавание надписей на этикетках? Возьмите Google OCR - его точность не будет такой же высокой как у специализированного решения. Но позволит вам откатать весь пайплайн и его проблемы.

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

Оцените максимальную точность

Если это возможно - возьмите лучшее решение на рынке. Четыре года назад если создать решение с нуля за пару месяцев - можно было бы сравниться с лидерами рынка. Сейчас уже не так. Сделать распознавание лиц как у NTech или VisionLabs? Это может занять несколько лет большой команды. Имея же на руках лучшее решение вы сможете оценить качество на котором всё перестаёт работать. Даже лучшее решение по распознаванию лиц не хватит чтобы распознавать лица всех посетителей крупного магазина. Но его с запасом хватит для распознавания водителей таксопарка. Используя максимум оцените запас => это поможет вам оценить качество которое хватит для вашей системы. Может быть вам будет не нужен NTech, достаточно OpenSource решения, или распознавания лиц от какого-нибудь Amazon. А может будет достаточно купить какого-нибудь производителя решений второго дивизиона.

Нет решений на рынке, но задача вам кажется простой? Проверьте гипотезу на людях. Главный враг машинного зрения - низкое качество изображения и неправильные условия съёмки. Для абсолютного большинства задач то качество, которое показывает человек - максимальное. Даже оператор не распознает больше 80% ценников, если фотографировать большой стеллаж в Ашане с рук. Попробуйте использовать камеру лучше, снимать частями. Это позволит очень быстро и динамично создать несколько итераций вашего продукта. Стоимость эксплуатации будет дороже машинного зрения, но разработка и модификация будет копеечная. Вы сможете собрать датасет, и оценить лучшие сценарии.

Давайте распознаем все ценники и товары!

Помните про ошибки

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

Нужно распознавать номера вагонов на станции? Предположим хорошая система даст 95% правильных распознаваний. Что вы будете делать с 4% пропущенными и 1% неправильно распознанным?Прежде чем начать - распишите дерево исходов.

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

Инструменты

Вернёмся к вопросу статьи - “Как сделать прототип”. На мой взгляд прототип должен обладать следующими свойствами:

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

Эта логика дискутабельна. В ситуации “контракт подписан, деньги получены” - третий пункт становится приоритетным.Но я буду исходить именно из своей цепочки.

Распознавание в облаке

Самое быстрое решение для прототипирования - пробовать уже готовые инструменты. Конечно, если вы хотите автопилот, то никто вам не даст тестового решения. Но для 50-60% задач это возможно.

Первый вариант - решения больших фирм. Скорее всего такие решения будут точнее чем аналогичные OpenSource исходники (не всегда). Но хуже чем то что вы сможете обучить сами.

  • Amazon - разметит вам всю картинку, по сотням типов объектов, по всем характеристикам. Даст возможность подключить операторов с Mechanical Turk, подключит всё это к облаку. Есть распознавание лиц. Распознавание текстов, трекинг людей.

  • Google - опять же лейблинг и детектирование большого числа объектов. Распознавание текстов (наверное, лучшее из тех что есть). Есть детектирование лиц, но распознавание google не даёт.
  • Microsoft. Есть детектирование и распознавание лиц, распознавание текстов, анализ изображений.

Что имеет смысл делать используя эти решения:

  • Любые детекторы: детектор посетителей, подсчет автомобилей, закрашивание каких-то областей.

  • Категоризаторы, предвыбор, анализ содержимого видео

  • Распознавание людей по лицу. Чуть ниже поговорим про другие подходы для этой задачи, но и Amazon с Microsoft в среднем лучше OpenSource решений.
  • Распознавание текстов. Видел несколько компаний, которые достаточно долго использовали в своём продукте распознавание от Google. В итоге все сделали своё, с качеством в 2-3 раза лучшее. Но чтобы окупить такую разработку нужны большие потоки данных

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

Второй вариант - сервисы для узконаправленных задач. Я приведу лишь несколько примеров. В реальности, облачных продуктов почти под любую задачу много. Повторить можно всё, но сделать лучше по качеству скорее всего быстро не выйдет. Такие решения хорошо использовать для оценки верхней планки разрабатываемого продукта:

  • Распознавание автомобильных номеров - https://www.openalpr.com/ или https://platerecognizer.com/ . Лучше распознать почти нельзя. Мы достаточно долго занимаемся распознаванием разных типов номеров. Всех кто хочет небольшой пилот всегда отправляем туда. Это дешевле и проще. Сделать лучше и дешевле можно. Но проще стратегии на пилот не будет.
  • Очевидно, что для качественного онлайн распознавания текстов на русском, а в особенности стандартных форм проще всего ABBYY - https://www.abbyy.com/ru-ru/onlineservices/ . Но есть ряд более новых игроков, таких как https://handl.ai/ (ребята, кстати, недавно на vc офигенную статью публиковали).
  • Распознавание лиц онлайн есть у миллиона компаний. Лучшая статитика для универсального применения, пожалуй, у NTech - https://findface.pro/findface-sdk/ . Но там есть и VisionLabs, и ЦРТ, и миллионы более мелких игроков. У крупных будет дороже, они захотят большие объемы. Но если пренебрегать точностью, то есть и Amazon и Microsoft.
  • Считаете что распознавание эмоций/мимики/пульса по камере хорошая идея? Даже тут разные компании предоставляют решения. Например - https://neurodatalab.com/ . Чем не повод убедиться что такие вещи обычно плохо работают.

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

Разметка

Как я писал выше - один из самых простых и быстрых способов сделать прототип - собрать его из разметчиков. Сегодня существует масса сервисов которые позволяют подключать разметку данных людьми в онлайне. Цена такой работы на сервисах уровня Толоки может быть примерно 100-150 рублей/час.

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

Существует несколько подходов к сборке прототипа через разметку данных:

Онлайн сервисы. Самый крупный русскоязычный - Яндекс.Толока. Самый крупный международный - Amazon Mechanical Turk. Есть ещё несколько аналогов. Основной минус - в таких сервисах качество разметки и вовлеченность разметчиков оставляют желать лучшего. Многие задачи надо дублировать на 2-3х человек. Зато разметить на Толоке или подключить API - задача на несколько часов.

Фирмы агенты. Для использования Толоки вам нужен будет человек который разберётся в интерфейсах, настроит всё, убедится что всё работает. Если человека нет - эти функции можно аутсорсить. Российские фирмы, с которыми я знаком, которые берут такие задачи - Stafify (когда то раньше и Dbrain так делал, но вроде они сменили вектор бизнеса). Из международных - appen. При таком подходе сэкономить деньги не выйдет, но по скорости и качеству всё будет хорошо.

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

  • Написать целиком. Обычно разметка это что-то очень простое, что пишется на js за пару дней. В 90% задач мы делаем именно так.
  • Взять что-то готовое. Существует множество OpenSource для этой темы. Вот несколько самых популярных - LabelIMG, VGG Image Annotation Tool (VIA), VGG Image Annotation Tool. Будьте готовы, что такие решения очень сложно дописать. Если оно не удовлетворяет вас из коробки - чаще просто сделать своё
  • Использовать Supervise.ly или аналоги. Это онлайн тулзы с очень мощным инструментарием разметки и интеграции решения. Вариант между “онлайн сервисом” и ”готовым инструментом”. Один человек в рамках такой системы будет в несколько раз эффективнее человека на Толоке или самописного решения.

Готовые OpenSource

Сегодня существуют десятки уже обученных моделей нейронных сетей. Зачастую они не хуже сервисов от Amazon, Google, Microsoft. Их минус - нужно тратить время на настройку, сборку, написание сервера, и.т.д.В целом, на написание любого прототипа на базе OpenSource уходит в несколько раз больше времени, чем на интеграцию в процесс оператора.

Кроме того, одна их основных проблему любого и готового “OpenSource из коробки” - он может не заработать для вашего сетапа. Время будет упущено.

Здесь я приведу несколько примеров которые настроить проще и быстрее всего.

OpenVino. Intel не представлен на рынке онлайн серверов. Интел хитрее. На базе открытого фреймворка OpenCV они выпускают его расширение, фреймворк “OpenVino”, который содержит десятки очень хороших моделей. При этом OpenVino оптимизирован под процессоры Intel. Запустить где-то половину из них без Intel’а можно, но выходит раз в 5-6 медленнее.

В OpenVino что-нибудь такого плана собирается примерно за один вечер

Базовая подборка очень внушает:

  • Десятки сетей для классификации изображений
  • Сети для детекции десятков типов объектов (люди, авто, животные, и.т.д.)
  • Сети для сегментации (люди, авто, животные, и.т.д.)
  • Сети для выделения позы людей
  • Сети для распознавания действий
  • Сети для распознавания по лицу и по телу
  • Сети для детекции и распознавания текста
  • … (и ещё десятки позиций)....

Если собирать свой прототип, то удобнее набора примеров чем в OpenCV сегодня не будет.

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

TF|Pytorch. Если же у вас есть GPU от Nvidia, то в качестве аналогичных примеров можно брать примеры из pytorch или из Tensorflow. Они лучше документированы. За счёт GPU будет быстрее Intel. Но у Intel лучше оптимизировано.

Не забывайте: если вы пошли по пути OpenSource придётся делать всё. Поднимать сервера, настраивать Serving модели, писать захват и обработку видео.

Готовые не облачные продукты

Выше я приводил в пример в первую очередь облачные инфраструктуры. Они сильно удобнее для прототипов. Сделать интернет сейчас не сложно, особенно для двух-трёх образцов. Но бывают направления по которым облачных продуктов не существует. Можно ли делать прототип на базе лицензии софта или железа? Наверное да. Но ценность такого прототипа сильно падает. В облаке вы соберёте все входные-выходные данные. Тут - нет. Единственное что можно оценить готовым образцом - максимальную доступную продуктовую точность. Иногда это тоже полезно.

Примеры прототипирования

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

Случай 1. Прототипирование разметкой. Производитель продукта запускает акцию “всем кто купил три наших товара - бесплатный бублик”, и предлагает присылать фотографии чеков с покупками. Чеки сфотографированы в разных условиях, под разными углами. Напечатаны на разных машинах в разных магазинах. При этом для оператора решить задачу уровня “найдите в чеке товары из списка” - сильно проще чем написать алгоритм их распознавания. По задачам такого плана оператор может обрабатывать 5-6 чеков в минуту (~300 в час). Пусть объем всей акции 20 тысяч чеков - это будет 10т.р. При запуске акции на постоянную основу производитель имел датасет, который использовал для обучения нейронной сети.

Случай 2. Прототипирование разметкой. Фирма хочет выпустить продукт “камера распознаёт сколько на парковке во дворе свободных мест”. Обучение и разработка первой версии такой системы займёт несколько недель + потребует датасета. Прототип с ручной разметкой и нанятым оператором сделали за полтора дня. За неделю поняли, что такой системой никто не будет пользоваться.

Случай 3. Прототипирование через OpenSource. Я видел примерно четыре фирмы которые тоже решали вопрос занятых парковок, но через прототипирование OpenSource (детекция автомобилей есть в OpenVino, TensorFlow и PyTorch уже готовая). Написание такого прототипа требовало от них не двух дней, как в случае выше, а 1-2 недели. Из всех таких гипотез выжила только одна. В остальных создатели поняли что продукт нерентабелен. Та фирма гипотеза которой сработала - переобучила OpenSource и получила качество в несколько раз выше.

Случай 4. Прототипирование разметкой + прототипирование коммерческим продуктом. Ещё до массового появления нейронных сетей существовали фирмы, которые распознавали товары и ценники на полках супермаркетов по фотографиям (проверка выкладки). Мне известно минимум про три такие фирмы - всё распознавание делалось операторами в штате. Появление нейронных сетей лишь позволило понизить косты. При этом продукт на базе оператором существовал и окупался и без них.Как минимум одна из фирм на начальном этапе внедрения использовала распознавание текста от Google, что позволило им оценить работоспособность идеи.

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

Случай 6. Прототипирование разметкой. У нам регулярно приходят заказчики которые хотят распознавать какие-нибудь буквенно-текстовые последовательности на конвейерах. Заказчики сходу оценивают что для того чтобы система была успешна - ей требуется какая-нибудь фиксированная точность. Например 95%. Очень часто, в качестве первого этапа работ, мы предлагаем сделать разметку двумя разметчиками, чтобы посмотреть точность с которой два независимых человека могут распознать эти данные. Или предлагаем заказчику провести такие работы самому. Часто оказывается, что такая точность принципиально невозможна, данные слишком шумные, даже люди не показывают такую точность, что говорить про алгоритмы.

Случай 7. Прототипирование через OpenSource. Один стартап из тех, которым мы сейчас помогаем, на стадии получения инвестиций собрали свой первый прототип на базе OpenSource из TensorFlow (потратили примерно 2 недели). Это помогло проверить основной эффект и получить первый раунд. При дальнейшей разработке точность и скорость работы продукта увеличилась в десятки раз.

Случай 8. Прототипирование через OpenSource, прототипирование коммерческим продуктом. Недавно в одном продукте наших заказчиков понадобилось сильно увеличить точность одной из функций за счёт выноса её в облако (сети на embedded устройствах обычно сильно слабее, существенные ограничения по скорости/точности). Можно было бы обучить самим, но это было бы 2-3 недели. Решили пойти двумя путями: взять уже обученный OpenSource и взять готовый сервис от Amazon. Прототип на OpenSource сделали за день, но нужно было потратить ещё 2-3 дня на развертывание в облаке и аренду сервера. Готовый сервис от Amazon тоже удалось подключить за день, зато там не надо было делать развёртывание, оно уже было. Стоимость сервиса - 14 USD в месяц, что явно дешевле 3х дней работы инженера. Amazon был хуже по точности чем OpenSource, но итоговая точность нас устроила.

Послесловие

В своей статье я попробовал отразить сегодняшнее состояние массового сегмента в Computer Vision. В областях которые пока развиваются всё сильно сложнее. То что я писал скорее не относится к таким направлениям нейронных сетей:

  • GAN - сети которые “дорисовывают/улучшают/придумывают”. Такие сети зачастую очень индивидуальны, продукты на них, которые не являются очередным набором масочек в Instagram единичны.
  • Сложная работа с видео. Сложные продукты с обработкой видео очень индивидуальны. Если вам нужно распознавание действий, хороший трекинг, большой объём выделяемых параметров - то вряд ли вы сможете найти хороший пример. По моему опыту в таких задачах приходится собирать с нуля и потом оценивать работоспособность.
  • Управление роботами/автомобилями. В большинстве своём это сложны продукты управление в которых многоуровневое. Готового для них нет ничего.

Про эти вопросы я периодически пишу на хабре, блоге, да и в других местах. Если интересно - то подборку своих статей веду тут.

0
1 комментарий
Алексей Дородный

В своей статье я попробовал отразить сегодняшнее состояние массового сегмента в Computer Vision + миллионы компаний и решений...

Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда