{"id":14284,"url":"\/distributions\/14284\/click?bit=1&hash=82a231c769d1e10ea56c30ae286f090fbb4a445600cfa9e05037db7a74b1dda9","title":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0441\u043e\u0431\u0430\u043a\u0430\u043c\u0438","buttonText":"","imageUuid":""}

Pocket AutoML: Android-приложение для тренировки нейросетей без кода с возможностью создать своё приложение на их основе

Фото котёнка распространяется по лицензии СС0, источник: https://www.pexels.com/photo/white-and-grey-kitten-on-brown-and-black-leopard-print-textile-45201/

Приложение

Pocket AutoML — это Android-приложение, которое позволяет тренировать модели глубокого обучения (deep learning) для классификации изображений без написания кода. Есть возможность экспортировать модель в формате TensorFlow Lite и создать на основе этой модели собственное Android-приложение, для чего прилагается пошаговое руководство.

Тренировка работает прямо на устройстве, за счёт этого для неё не требуется подключение к интернету, нет проблем с конфиденциальностью, т.к. изображения не покидают устройства пользователя. Теми же преимуществами будут обладать и приложения, созданные на основе экспортированных из Pocket AutoML моделей. Единственная функция, требующая подключения к интернету, это экспорт в TensorFlow Lite.

Руководство по созданию собственного Android приложения

Руководство написано для людей, которые интересуются deep learning и созданием приложений на его основе, при этом требует от них минимум знаний о программировании и машинном обучении. В руководстве включен работающий пример приложения, которое классифицирует картинки на основе модели экспортированной из Pocket AutoML и шаги по модификации примера под Вашу модель.

Pocket AutoML не делает ничего магического, лишь применяет transfer learning, который Вы, при желании, можете реализовать самостоятельно, в конце руководства есть ссылка на соответствующий пример, так что vendor lock-in Вам не грозит. Если у Вас возникнут вопросы или технические проблемы при следовании этому руководству, я буду рад здесь помочь в комментариях, в GitHub issues или по электронной почте.

Сравнение с Lobe и другими аналогами

На vc.ru уже был пост о Lobe, стартапе купленном Microsoft, который анонсировал свой одноименный продукт 26 октября 2020 года. Основная идея Lobe идентична: тренировка моделей без кода, экспорт, создание приложений на их основе.

Lobe работает на десктопах, Windows и Mac, также стоит отметить отличный UX, примеры использования, обучающие видео.

Первая версия Pocket AutoML была опубликована в Google Play Store 22 октября 2020го, даже чуть раньше, чем дата релиза Lobe, правда функция экспорта моделей была добавлена только в августе этого года.

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

Pocket AutoML создавался мной в одиночку как побочный проект однако исходя из моего сравнения, не претендующего на статистическую значимость, не уступает Lobe в главном, а именно в качестве моделей. Например, на игрушечном наборе данных из щенков и котят, который я использовал для создания скриншотов выше, Lobe не достигает 100% точности даже на тренировочных данных, что, возможно, свидетельствует о слишком сильной регуляризации. При этом на тестовом наборе данных Lobe делал ошибки в картинках, которые были правильно распознаны в Pocket AutoML. Возможно, в Lobe модель тренируется без заморозки весов начальных слоёв, что, при таком маленьком объёме данных, вероятно являлось бы предпочтительным.

Анализ файлов Lobe показывает, что в качестве основы (backbone) используются предобученные ResNet50v2 или MobileNetv2 (по выбору). В Pocket AutoML используется EfficentNetB0, которая является более лёгкой (16мб против 102мб в .tflite формате по сравнению с ResNet50v2), более современной и несколько более точной моделью (по сравнению с обеими).

Кроме того, Lobe под капотом использует полный TensorFlow для тренировки моделей (а это порядка 1 гигабайта, что не очень-то приемлемо для мобильного приложения), в Pocket AutoML же использует TensorFlow Lite, в котором тренировка моделей из коробки пока не реализована, так что её пришлось реализовать самостоятельно наподобие официального примера от Google Example on-device model personalization with TensorFlow Lite. Google, к слову, грозится добавить полноценную тренировку моделей в TensorFlow Lite этом году.

Версия TensorFlow в Lobe на данный момент 1.15.2, так что реализация transfer learning там может страдать от не совсем очевидной проблемы, связанной с batch normalization слоями, решённой в TensorFlow 2.x.

Стоит также упомянуть другие решения для создания моделей без кода или с минимумом кода, а именно:

  • Teachable Machine от Google (бесплатное, работает в браузере, правда мобильные браузеры не поддерживаются, тренирует модель локально, без обращения к серверу, кроме картинок может тренировать модели классификации аудио)
  • Google AutoML Vision (платное, работает в облаке, но также можно экспортировать и скачать модель, кроме классификации есть детекция)
  • Azure Custom Vision от Microsoft (платное, работает в облаке)
  • TensorFlow Lite Model Maker от Google (бесплатное, является Python пакетом, кроме классификации есть детекция, также работа с текстами, аудио, рекомендациями)

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

Монетизация

В приложении присутствует реклама. По сравнению с первой версией я сильно её ограничил, чтобы она не раздражала пользователей: убрал рекламу в момент классификации изображения, оставил только interstitials при тренировке и экспорте (когда пользователю естественным образом приходится ждать) с сильно ограниченной частотой показа. Подумываю о том, чтобы её вовсе убрать, однако, поскольку экспорт работает на основе Google Cloud Run, который тихонько ест деньги, есть надежда, что реклама сможет окупать хотя бы эти затраты.

Для привлечения пользователей я тестировал Яндекс Директ, Вконтакте, Facebook, Google Ads. Не удалось добиться сколько либо адекватных результатов от всего кроме Google Ads, где цена привлечения пользователя составляет около 20 рублей. Лишь примерно один из четырёх пользователей, запустивших приложение использует все его возможности, а следовательно имеет шанс увидеть рекламу. При этом LTV близок к нулю, настолько, что даже если представить, что правильная настройка позволит получать пользователей на порядок дешевле, а реклама будет давать на порядок больше, платное привлечение пользователей все равно не будет окупаться.

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

Об авторе

Я профессионально занимаюсь разработкой уже более 10 лет, начинал с full-stack разработки на .NET (Pocket AutoML поэтому, а также потенциально для будущей iOS версии, сделан на Xamarin), заинтересовался deep learning и уже 3 года работаю в этой области. В данный момент работаю в стартапе, где мы автоматизируем визуальный контроль качества на производстве.

Мой опыт решения промышленных задач с помощью deep learning говорит о том, что ключевым фактором успеха является набор данных. И не настолько важно количество объектов в нём, как отсутствие ошибок в разметке, её консистентность. Эту тему хорошо раскрывает Эндрю Ын в видео A Chat with Andrew on MLOps: From Model-centric to Data-centric AI. А это значит, что даже с простой моделью, натренированной в одном из no-code решений, Вы можете получить вполне достойный результат, если только хорошо справитесь с разметкой.

Ссылки

0
5 комментариев
Raimond Vladimirov

Хорошая идея! Только как смартфон справляется с тренировкой моделей. Например lobe заставляет интеловский мак довольно сильно греться.

Ответить
Развернуть ветку
Евгений Мамченко
Автор

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

Хотя телефоны и не такие быстрыы, как десктопы, в Pocket AutoML видеоускоритель телефона используется через TensorFlow Lite GPU delegate, большая часть нейросети заморожена, что позволяет сильно ускорять тренировку.Чтобы не быть голословным, я в ближайшие дни сделаю бенчмарк по точности и времени тренировки на датасете из нескольких тысяч картинок.

Ответить
Развернуть ветку
Евгений Мамченко
Автор

Сделал бенчмарк на датасете из 4267 картинок и с 5 классами (виды цветов): https://www.kaggle.com/sourcerer/flowers-recognition-4267-train-50-test-split. Тестовая выборка 50 картинок (10 для каждого класса).

Lobe (Intel® Core™ i7-7700HQ): время тренировки около 35 минут, точность на тестовой выборке 80%.

Pocket AutoML (Honor 10): время тренировки менее 7 минут, точность на тестовой выборке 76%. Заряд батареи уменьшился на 6%.

В процессе измерения скорости обнаружилось несколько проблем со скоростью тренировки, которые были исправлены в версии Pocket AutoML 1.3.6, результаты выше это уже с этими исправлениями.

Ответить
Развернуть ветку
villy.igor

Жалко что только на андроид((

Ответить
Развернуть ветку
Евгений Мамченко
Автор

Похожие функции (тренировка моделей для классификации картинок без кода), а также множество других есть на Mac в приложении Create ML (https://developer.apple.com/machine-learning/create-ml/).

Pocket AutoML сделано на Xamarin и технически есть возможность портировать его на iOS, однако это потребует приличное количество времени. Мне кажется, будет смысл его тратить, если будет видно, что приложение востребовано под Android.

Windows 11 собирается поддерживать Android приложения, тут всё должно быть проще, постараюсь добиться чтобы там всё заработало.

А какой платформы не хватает Вам?

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