Я только что опубликовал приложение для iOS, в котором интенсивно используется машинное обучение. Он пытается с более или менее успехом оценить, сколько калорий только по картинке еды. Это выглядит примерно так:

В этом посте я попытаюсь объяснить проблемы, с которыми столкнулись при разработке этого приложения.

Во-первых, я хотел использовать TensorFlow. В то время я уже изучил TensorFlow для другого проекта. Кажется, это решение, которое люди использовали. И он быстро рос. Действительно, поддержка Google, к лучшему или к худшему, в дополнение к переманиванию лучших людей в сообществе машинного обучения с открытым исходным кодом, сделала TensorFlow легкой задачей, если вы хотите начать новый проект машинного обучения. К сожалению, у TensorFlow все еще есть недостатки. Из-за своей децентрализованной природы TensorFlow в 3 или 4 раза медленнее, чем другие фреймворки, и требует больше оперативной памяти. И процессор, и оперативная память — дефицитные ресурсы на iPhone. Наконец, кажется, еще никому не удалось заставить TensorFlow работать на iOS.

Тогда я решил изучить Caffe. Caffe — отличный фреймворк для машинного обучения. Он разработан группой исследователей из Berkeley Vision and Learning Center. Он также специализируется на компьютерном зрении с использованием сверточной нейронной сети. Это казалось подходящим для этого проекта. Некоторым членам сообщества Caffe, похоже, уже удалось заставить некоторые части Caffe работать на Xcode. Это было многообещающее начало. Менее многообещающей частью было то, что один из разработчиков Caffe был нанят Google для работы с TensorFlow. Это сделает TensorFlow заметным в будущем. Однако модели Caffe и модели TensorFlow очень похожи. На самом деле я уже нашел инструменты, которые позволяют преобразовывать модели Caffe в модели TensorFlow с минимальными затратами труда. Потенциальный переход в будущем должен быть легким.

К сожалению, Caffe не очень хорошо работал с Xcode 7.x. Некоторые детали пришлось доработать. Более того, на айфонах у меня всего 1 ГБ ОЗУ для игры. Некоторые модели Caffe во время работы увеличивают объем оперативной памяти до 1,x ГБ. Кажется, это также зависит от вычислений. Вычисления различаются для разных изображений. Таким образом, его использование памяти также отличается. Это затрудняет обнаружение некоторых ошибок. Кроме того, когда у вас есть предел оперативной памяти iPhone, иногда он будет работать, а иногда нет. Для фактической той же картины… Управление использованием памяти — большая проблема, когда вы хотите, чтобы сверточные нейронные сети работали на iOS.

Техническая архитектура приложения по-прежнему довольно минимальна. У меня было всего 2 модели. Один для идентификации еды. Один для того, чтобы дать шкалу, если пища жирная или нежирная. В сочетании с базой данных средних калорий небольшой алгоритм затем может выполнять базовую оценку калорий. Модель для идентификации продуктов питания может идентифицировать 97 различных продуктов. Модель сальность/худощавость все еще довольно сырая. Он был обучен только примерно на 500 изображениях.

Время компиляции Xcode было проблемой. Мне удалось сократить время компиляции за счет принудительной оптимизации и кэширования. Тем не менее, как ни странно, один раз из десяти Xcode все перекомпилирует. Обычно это занимало несколько минут. Это может быть очень неприятно.

Есть очевидные пути улучшений.

Во-первых, мне нужно определить и расширить нашу базу данных, включив в нее больше продуктов. 300–400 видов еды позволят приложению быть более точным. Также будет здорово иметь больше рейтинговых изображений жирной и постной пищи. Добавление модели для измерения точного количества также кажется необходимым, но сделать это сложнее. Количество пищи необходимо тренировать по сравнению с другими видами пищи, когда жирность легче оценить. И последнее, но не менее важное: прямо сейчас приложение может работать только с одним продуктом одновременно. Caffe на iOS работает довольно медленно. Он действительно использует только процессор. Он не использует графический процессор или металлический API. Быстрее было бы использовать их. Если он будет работать быстрее, это позволит идентифицировать несколько элементов пищи по изображению. Не заставляя пользователя ждать вечно. Эти изменения позволят повысить точность приложения. Наверное следующая версия.