Как превратить бумажное меню в аппетитные фото блюд с помощью Llama 3.2 и Flux
Знакомая ситуация: приходишь в ресторан за границей или открываешь доставку с аутентичной кухней, а там длинный список непонятных названий без единой фотографии. Приходится наугад гуглить каждое блюдо или надеяться на удачу.
Разработчик Хассан Эль Мгари (Nutlope) собрал небольшой опенсорс-проект PicMenu, который решает эту проблему за пару секунд. Вы загружаете фотографию бумажного меню, а сервис распознает все позиции и генерирует реалистичное изображение для каждого блюда.
Как это устроено под капотом
Здесь нет громоздких микросервисов или собственных ML-моделей на GPU-ферме. Проект написан на Next.js с TypeScript, а вся магия вычислений держится на связке открытых моделей через API сервиса Together AI.
Конвейер обработки устроен довольно изящно:
- Распознавание меню: фотография отправляется в модель Llama 3.2 Vision 90B. Она вытаскивает текст блюд даже с мятых или сложных дизайнерских бланков.
- Структурирование данных: быстрая текстовая модель Llama 3.1 8B переводит полученный текст в чистый JSON с названиями и описаниями позиций.
- Генерация фото: генеративная модель Flux Schnell создает изображение для каждого найденного блюда прямо по его описанию.
- Хранение и визуализация: сгенерированные картинки складываются в AWS S3 (или совместимое хранилище), а интерфейс на базе Tailwind и Shadcn UI выводит меню в виде аккуратных карточек.
Идея разделить распознавание и структурирование на две модели Llama выглядит практично. Большая 90B-модель берет на себя тяжелую оптическую часть, а легкая 8B-модель быстро форматирует результат в JSON, экономя время ответа и токены.
Как развернуть проект локально
Запустить репозиторий у себя можно буквально за пять минут. Потребуется ключ API от Together AI и любое S3-совместимое хранилище для загрузки изображений.
Клонируем репозиторий:
git clone https://github.com/Nutlope/picmenu
cd picmenu
Создаем файл .env на основе примера .env.example и заполняем переменные:
TOGETHER_API_KEY=your_together_api_key
# Настройки AWS S3 для загрузки картинок
NEXT_PUBLIC_S3_BUCKET_NAME=your_bucket
S3_UPLOAD_KEY=your_access_key
S3_UPLOAD_SECRET=your_secret_key
S3_UPLOAD_BUCKET=your_bucket_name
S3_UPLOAD_REGION=your_region
Устанавливаем зависимости и запускаем dev-сервер:
npm install
npm run dev
После этого приложение доступно по адресу http://localhost:3000.
Что уже работает, а над чем стоит поработать
Сейчас PicMenu — это добротный рабочий прототип (MVP). Интерфейс выглядит опрятно благодаря компонентам Shadcn, а связка Vision-модели с Flux работает на удивление шустро.
Правда, у проекта есть несколько ограничений, о которых автор честно пишет в списке задач:
- Если меню слишком большое, генерация всех позиций может занимать до минуты. Приложению не хватает предупреждения о долгом ответе или плавной анимации загрузки.
- Flux Schnell работает быстро, но иногда уступает по реалистичности старшей версии Flux Dev.
- В текущей версии нет тегов диетических ограничений (веганское, без глютена, острое) и фильтрации по ним.
- Пока нет модального окна с подробной информацией о блюде: калорийностью, составом и вкусовым профилем.
Кому проект пригодится
Если вы планируете сервис для туристов, агрегатор ресторанных меню или просто хотите посмотреть, как на практике связывать vision-модели, JSON-режим в LLM и генерацию картинок через Flux, этот репозиторий послужит отличным шаблоном. Кодовая база понятная, зависимости стандартные, а архитектура не перегружена лишними абстракциями.
