Как мы задачи решаем + исходники сервера разметки

Последние года три большую часть наших доходов составляют различные работы где мы что-то делаем под заказ. Список таких работ проще всего посмотреть тут – http://cvml.ru/ . Есть далеко не все (многие фирмы не хотят светиться лишний раз). Но в целом спектр можно представить. Наверное основное это:

  • Распознавание буквенных и числовых последовательностей (номера/отметки/знаки/символы)
  • Биометрия и её интеграция
  • Детекция различных странных объектов
  • Трекинг объектов

И каждый третий раз делать надо одно и то же:

  1. Собрать данные
  2. Разметить
  3. Обучить модель
  4. Собрать больше данных и найти ошибки
  5. Goto п.2 пока качество неудовлетворительно

Ещё года два назад мы сделали сервер где весь пайплайн был достаточно удобно убран в одну сущность. Есть ли аналоги? Да. Но каждый раз когда смотришь как они устроены кажется “ну почему же всё так сложно”. Понятно, что у нас сдвинут биас. Но всё же нам кажется наш подход весьма симпатичным.
Где-то с прошлой осени мы решили что надо выложить сервер в OpenSource. Лежит он в открытом гитхабе уже месяца 4, но, наконец, решил сделать небольшое описание.

Небольшой QnA. Это ключевые вопросы которые помогут понять о чём вообще речь и как оно тут оказалось. После них будет пример запуска и использования:

  • Почему мы решили его выложить?
    • В последнее время мы передаём его заказчикам иногда. Так что какой-то уникальной технологией он уже не является
    • Для наших задач с роботами (https://rembrain.ie/), про которые я недавно рассказывал в своём видео – мы разработали сильно более сложный и современный сервер, с поддержкой 3д-видео, разметки на ходу и куда более современным продакшном. Нет смысла поддерживать обе конструкции
    • Популяризация подхода
    • Использование OpenSource позволяет улучшать текущий сервер через заказчиков которые вносят в него изменения и хотят синхронизироваться с основной версией
  • Качество продукта. Можно ли это использовать в проде? Мы, конечно, не Yandex. Но и наш сервер не вертолёт.
    • Сейчас мы потихоньку пилим документацию на те части которые изменяем/применяем.
    • Пока многие части не покрыты документацией, а тем более тестами. Не ожадайте что под любую задачу будет сконфигурировать мгновенно.
    • Описаны процессы запуска/развертки/тестирования. Настройка и запуск сервера происходит за считанные минуты по тем задачам где набор графических инструментов достаточен.
  • Набор технологий. Что используется?
    • Сервер написан на python, flusk
    • Для корректной работы требуется Amazon Bucket + развёрнутая mongo.db. Можно обойтись без этих пунктов, или использовать любое другое хранилище, но, для этого, придётся переписать десяток-другой строк кода.
    • Сервер в одну строчку компилируется в докер контейнер, который быстро можно разворачивать
    • Сервер сам по себе не решает задачи обучения, но чуть ниже я покажу как в несколько строк подцепить к серверу любой фреймворк который будет обучать.
  • Кто его использует? Только вы? Нет, не только. Вот небольшой список:
    • Собственно мы. Но за последние три года на его базе мы решали порядка десятка задач для разных компаний. Несколько наших продуктов, таких как распознавание автономеров – сделано на его базе.
    • Автопасс – один из крупнейших автобусных перевозчиков. На базе сервера реализовано обучение распознавания числа входящих в автобусы.
    • CherryLabs. Да, мы работаем с ними уже три года, но наш сервер начали использовать только недавно в одном из проектов, где внутреннего функционала Cherry не хватило.
    • Две другие компании, которым мы передали сервер, но у которых проекты в более скрытом режиме.
  • Почему у вас нет обучения? Обучение бывает очень разным. Где-то надо обучить серверное распознавание, где то должна быть выгрузка сети на Jetson. Где-то сложная комбинация из большого числа сетей разных фреймворков. Цель нашего сервера – не сделать всё, а максимально упростить инфраструктуру разметки и интеграции решения в продакшн.
  • А что хорошего-то у вас есть?!
    • Можно подключать любое число разметчиков
    • Удобно менеджить через веб что они делают
    • Создавать конвейеры из моделей. Выход одной подавать на вход следующей.
    • Вы разворачиваете систему во внутреннем контуре, весь процесс у вас под контролем. Данные не утекут, в отличие от Толоки и Механического Турки.

Вместо тысячи слов лучше покажи код!

Замечательно! Исходники лежат вот – https://github.com/VasilyMorzhakov/markup_server

Глобально, процесс запуска описан в Гите. Чуть ниже мы пройдёмся по нему. А пока поговорим о структуре.

Сам сервер проще всего описывается концепцией human-in-the-loop. Пойдём по шагам.
Пусть у нас есть источник данных, и модель (или последовательность моделей) которая его обрабатывает:

Очевидно, что модель не точная, совершает ошибки (а на начальном этапе её может вообще не быть). Так что мы должны забирать данные с источника, проверять где модель сработала плохо и переобучать на них. Пусть это будет как-то так:

Пару слов о том как забирать данные с продакшна, чтобы не перегружать операторов:

  • Когда мы распознавали номера поездов, то отправляли в разметку всё где не сошлась контрольная сумма
  • В части проектов мы отбираем какой-то процент от всех распознаваемых данных, чтобы верифицировать разметку операторами. Например 0.1%
  • Бывает, что мы используем сервер только в начале, пока точность моделей не доросла до какой-то фиксированной
  • Иногда все данные идут через операторов. Например когда важна точность, и мы хотим оптимизировать время работы сотрудников.

Как это выглядит?

Я решил снять небольшое видео про процесс и про плюшки:

Как запускать?

Дебаг

Дебаг можно запустить просто через питон, через main.py. Советую использовать python 3.6, зависимости установить requirements.txt:

pip install -r requirements.txt

При запуске необходимо задать следующий набор переменных среды:

AWS_KEY, AWS_KEY_ID – параметры доступа в бакет облака
MONGO_DB_ADDRESS – адрес базы для подключения
MONGO_COLLECTION – имя коллекции в который писать
SECTRT_KEY – произвольный ключ инициализации для FLASK
DEBUG_ADMIN_EMAIL – для отладки это будет ваш email при логине
DEBUG_ADMIN_PASSWORD – пароль для отладки

Запускаем, заходим по адресу 127.0.0.1:5000, логинимся:

После этого у нас есть несколько предопределённых схем которые можно размечать:

Схема при разметке контейнеров выглядит как-то так:

Докер

Результат тот же что и выше, но можно сразу разворачивать на сервере. Всё уже сбилжено и работает. Более подробная инструкция выложена в гите. Чтобы сбилдить и запустить докер:

sudo docker build -t markup .

sudo docker create --name markup_server -p 27017:27017 -p 443:443 \
            -e ....
            markup:latest
sudo docker cp ssl_and_bundle.crt markup_server:/app/ssl.crt
sudo docker cp key.pem markup_server:/app/ssl.pem
sudo docker start markup_server

Добавить пользователя

Из дебага первый пользователь добавляется при старте системы. Все остальные проще добавлять через специальный адрес: “/add_pre_user/role/token”, где токен – код по которому юзер сможет зарегистрироваться (показано в видео выше).

Второй способ проще использовать в докере – добавлять скриптом “add_user.sh“.

Добавить данные на разметку

“Положить в папку амазона” – не достаточно для того чтобы данные попали в разметку. Сервер должен индексировать данные. Это можно сделать двумя способами:

  1. Загрузка через страницу Upload
  2. Загрузка через POST запрос. Этим способом можно загружать данные с предварительной разметкой (например размеченные ML алгоритмом). Тогда будут отображены данные с подсказкой

Что дальше

Пока мы написали далеко не все инструкции. Например не написали про добавление новых схем разметки. Не написали про цепную разметку. Не написали про роли администраторов. Но, надеюсь мы всё добавим и лучше оформим:)

З.Ю.

В последнее время свои статьи я публикую на очень разных платформах.
И, так получилось, что единое место куда я их свожу тут – https://vk.com/cvml_team (дублирую в https://t.me/CVML_team )
Тот проект в рамках которого всё это сбадяжил – буду на Хабре публиковать скорее всего. Так что ссылка тоже только там будет.

Так что советую подписаться!