Немецкие исследователи разработали алгоритм, определяющий пищевую ценность блюд по фотографии: их калорийность и содержание белков, углеводов и жиров. В отличие от многих других подобных алгоритмов новый определяет эти показатели напрямую, а не обращаясь к базе данных о пищевой ценности разных продуктов. Кроме того, алгоритм пытается предсказать и ингредиенты блюд. Доклад об алгоритме будет представлен на конференции ICPR 2020, препринт доступен на arXiv.org.
Часть людей, сбрасывающих лишний вес или поддерживающих его на одном уровне, записывают приемы еды, отмечая ее пищевую ценность. Есть даже приложения, в которых этот процесс частично автоматизирован: если человек съел еду из магазина, на ее упаковку можно навести камеру, и приложение само добавит все данные в дневник потребления. Но это не подходит для самостоятельно приготовленной пищи и еды в кафе. В первом случае человек еще может рассчитать пищевую ценность, поскольку знает все компоненты, а во втором это можно сделать лишь очень примерно.
Исследователи в области компьютерного зрения уже несколько лет пытаются решить эту проблему. Как правило, алгоритмы по расчету пищевой ценности работают похожим образом: распознают на снимке блюдо и выдают соответствующие значения из базы. Также они могут учитывать размер блюда для более точного расчета калорий, хотя некоторые из недавних алгоритмов исходят из предположения, что перед камерой стандартная порция. Подобные многостадийные алгоритмы сложны в разработке и не очень точны, отмечают авторы новой работы во главе с Райнером Штифельхаге (Rainer Stiefelhage) из Технологического института Карлсруэ. Они использовали иной подход, в котором нейросеть за один этап рассчитывает пищевую ценность на основе фотографии.
В основе алгоритма лежит сверточная нейросеть для распознавания объектов (авторы использовали популярные сети ResNet и DenseNet), обученные на огромном датасете различных фотографий ImageNet. Использование предобученной сверточной нейросети — это популярный метод, позволяющий брать за основу алгоритм, который уже достаточно хорошо умеет определять признаки на изображениях, и дообучать его последние слои на своей конкретной задаче. В этом случае авторы не просто дообучали последний слой, а изменили его структуру: вместо классификации он решает задачу регрессии, то есть подбора конкретного значения, а не отнесения исходной фотографии к какому-то фиксированному классу объектов. Четыре нейрона последнего слоя выдают калорийность блюда и содержание базовых компонентов (белки, жиры, углеводы), а еще 100 нейронов выдают 100 самых вероятных ингредиентов.
Разработчики самостоятельно подготовили датасет для обучения алгоритма, воспользовавшись двумя источниками: сайтом рецептов, где у большинства рецептов есть список ингредиентов и фотография готового блюда, и базой пищевой ценности различных продуктов. Поскольку рецепты пишутся разными людьми и содержат лишние данные (например, один и тот же продукт может быть указан как «лук», «лук, нарезанный кольцами» и «лук, нарезанный кубиками», хотя для анализа пищевой ценности это один и тот же ингредиент), исследователям пришлось полуавтоматически обработать данные. В частности, они убрали лишние слова и перевели примерные величины (например, «одна столовая ложка») в конкретные. Затем они сопоставили данные с двух предварительно обработанных датасетов и собрали их в один, содержащий 70 тысяч рецептов и 308 тысяч фотографий.
Тестирование алгоритма на рецептах, которые он не встречал во время обучения, показало, что его точность при расчете на 100 грамм блюда составляет 46,7 калории, 2,51 грамма белка, 3,88 грамма жира и 6,97 грамма углеводов. Авторы отмечают, что результаты можно улучшить, если использовать более совершенные алгоритмы для предварительной обработки текстов из рецептов. Они не смогли опубликовать сам датасет из-за лицензионных ограничений, но опубликовали на GitHub код для его формирования и код самой нейросети.
Ранее мы рассказывали о других «кулинарных» нейросетях. Например, об алгоритме, составляющем рецепт блюда по его фотографии и другом, который выполняет обратную задачу — создает фотографию блюда по его рецепту.
Григорий Копиев