ИИ-система анализа питательной ценности по фото
Сфотографировать тарелку и получить КБЖУ — звучит как задача, которую можно решить за неделю. На практике она занимает месяцы, а точность всё равно остаётся проблемой. Причина: нутриционный анализ по фото — это последовательность из пяти принципиально разных задач, каждая из которых имеет свой источник ошибки.
Пайплайн: что на самом деле нужно сделать
- Сегментация блюда — выделить отдельные компоненты на тарелке
- Классификация — идентифицировать каждый компонент (вид блюда, ингредиент)
- Оценка объёма порции — самая сложная часть
- Маппинг на базу состава продуктов — USDA FoodData Central, ТТК, локальные базы
- Расчёт нутриентов — умножить на состав на грамм
Слабое звено всей цепочки — оценка объёма. Классификатор может с 0.91 точностью определить, что это борщ. Но вес порции по фото — ±40% при стандартном подходе.
Глубокий разбор: оценка размера и объёма порции
Метод референсного объекта
Самый практичный на сегодня: пользователь кладёт рядом с тарелкой карточку стандартного размера (визитка, банковская карта, специальный QR-маркер). Система вычисляет масштаб сцены и оценивает площадь порции в реальных единицах.
Для объёма — множественные снимки под разными углами или Structure from Motion на 3–5 фото. На практике для мобильного приложения это нереалистично: пользователь не будет обходить тарелку с телефоном.
Depth estimation без специального оборудования
Монокулярная оценка глубины: DPT (Dense Prediction Transformer) или ZoeDepth дают relative depth map по одному снимку. При использовании референсного объекта для масштабирования — оценка объёма порции с RMSE ≈ 25–35% по весу. Не идеально, но приемлемо для фитнес-трекинга.
Более точное решение — LiDAR сканер (iPhone 12 Pro+, iPad Pro). TrueDepth + ARKit позволяют получить реальные координаты поверхности еды. RMSE по весу порции при использовании LiDAR: 12–18% — значительно лучше.
Сегментация смешанных блюд
Борщ в тарелке — это не набор раздельных объектов, а смешанная жидкая среда. Instance segmentation здесь не применима. Используем semantic segmentation с заранее определёнными категориями (суп, каша, салат, гарнир) и отдельную классификацию по виду.
Для раздельных блюд (ланч-бокс, тарелка с несколькими компонентами) — Mask R-CNN или YOLOv8-seg. Датасет: ECOC food101, UEC Food 256, VIREO Food-172 как основа, дообучение на локальной кухне.
Классификация блюд и точность
| Датасет / база | Классов | top-1 accuracy (sota) |
|---|---|---|
| Food-101 | 101 | 0.96 (EfficientNet-B7) |
| UEC Food-256 | 256 | 0.89 (ViT-L) |
| VIREO Food-172 | 172 | 0.91 |
| Русская кухня (кастом) | 80–120 | 0.85–0.88 |
Для русской/восточноевропейской кухни публичных датасетов практически нет. Нужен собственный датасет: 500–1000 фото на класс с правильной разметкой. Краудсорсинг через мобильное приложение + верификация нутрициологом.
База состава продуктов
Точность нутриционного расчёта ограничена не только CV — она ограничена точностью базы состава. Варианты:
- USDA FoodData Central — 360 000 продуктов, хорошо для американской кухни
- OpenFoodFacts — crowd-sourced, 3M+ продуктов, разное качество данных
- ТТК (технико-технологические карты) — точные данные для конкретных рецептур ресторанов
- Кастомная база — для b2b клиента (ресторан, кейтеринг) точнее всего
Architecture мобильного приложения
On-device inference через Core ML (iOS) или TensorFlow Lite (Android) для сегментации и классификации — задержка < 300 ms, работает offline. Тяжёлый расчёт объёма (depth estimation) — опционально на сервере для точности.
Сроки
MVP для одной кухни (100–150 блюд), мобильное приложение iOS/Android: 8–12 недель. Полноценная платформа с кастомной базой, LiDAR-поддержкой и интеграцией в диетологическое ПО: 4–6 месяцев.







