CLI и веб-приложение для анализа фотографий блюд: распознавание блюда и ингредиентов (OpenAI Vision), генерация пошагового рецепта с КБЖУ и хлебными единицами (GigaChat-2), опциональная генерация изображения блюда (OpenAI DALL-E).
- Анализ по фото — загрузите изображение блюда и получите название, тип кухни и список ингредиентов
- Рецепт и КБЖУ — пошаговый рецепт, таблица калорий/белков/жиров/углеводов и хлебных единиц (на порцию и на 100 г)
- Генерация изображения — фотореалистичная визуализация «как должно выглядеть блюдо» (DALL-E)
- Два интерфейса — командная строка для скриптов и автоматизации, веб-интерфейс для интерактивного использования
- Гибкая настройка — все параметры моделей и API задаются через
.env
| Этап | Сервис | Назначение |
|---|---|---|
| 1 | OpenAI Vision (gpt-4o) | Анализ изображения → название, ингредиенты, кухня |
| 2 | GigaChat-2 | Рецепт, этапы приготовления, КБЖУ/ХЕ, промпт для изображения |
| 3 | OpenAI DALL-E | Генерация изображения по промпту от GigaChat |
- Python 3.9+
- API-ключи:
- OpenAI API (обязательно) — для анализа изображения и генерации картинки
- GigaChat (опционально) — для рецепта; без него возвращается только анализ блюда
git clone https://github.com/YOUR_USERNAME/dish-analyzer.git
cd dish-analyzerpython -m venv venv
# Windows
venv\Scripts\activate
# Linux / macOS
source venv/bin/activatepip install -r requirements.txtСоздайте файл .env в корне проекта (скопируйте из примера и заполните ключи):
# Обязательно
OPENAI_API_KEY=sk-your-openai-key-here
# Опционально (для рецепта и КБЖУ)
GIGACHAT_API_KEY=your_gigachat_api_key_here
GIGACHAT_SCOPE=GIGACHAT_API_PERSФайл .env не должен попадать в репозиторий (добавлен в .gitignore).
| Переменная | По умолчанию | Описание |
|---|---|---|
OPENAI_MODEL |
gpt-4o |
Модель для анализа фото |
OPENAI_MAX_TOKENS |
500 |
Лимит токенов ответа |
OPENAI_TEMPERATURE |
0.3 |
Температура (низкая для стабильного JSON) |
| Переменная | По умолчанию | Описание |
|---|---|---|
OPENAI_IMAGE_MODEL |
dall-e-2 |
Модель: dall-e-2 или dall-e-3 |
OPENAI_IMAGE_SIZE |
1024x1024 |
Размер (для dall-e-3: 1024x1024, 1792x1024, 1024x1792) |
OPENAI_IMAGE_QUALITY |
standard |
Только для dall-e-3: standard или hd |
OPENAI_IMAGE_N |
1 |
Количество изображений (для dall-e-3 всегда 1) |
OPENAI_IMAGE_RESPONSE_FORMAT |
url |
url или b64_json |
| Переменная | По умолчанию | Описание |
|---|---|---|
GIGACHAT_API_URL |
(Sber) | URL API чата |
GIGACHAT_TOKEN_URL |
(Sber) | URL для OAuth-токена |
GIGACHAT_MODEL |
GigaChat-2 |
Модель |
GIGACHAT_MAX_TOKENS |
4000 |
Лимит токенов |
GIGACHAT_TEMPERATURE |
0.7 |
Температура |
GIGACHAT_REPETITION_PENALTY |
1.1 |
Штраф за повторения |
GIGACHAT_VERIFY_SSL |
false |
Проверка SSL (для корпоративного API часто false) |
Базовый запуск (результат в консоль):
python dish_analyzer.py путь/к/изображению.jpgСохранение в файл:
python dish_analyzer.py photo.jpg --output result.txtВывод в JSON:
python dish_analyzer.py photo.jpg --json
python dish_analyzer.py photo.jpg --json --output result.jsonСохранение сгенерированного изображения:
python dish_analyzer.py photo.jpg --image-output my_dish.png
python dish_analyzer.py photo.jpg -i output/image.pngДругой файл окружения:
python dish_analyzer.py photo.jpg --env .env.productionСправка по аргументам:
python dish_analyzer.py --helppython app.pyОткройте в браузере: http://localhost:5000
- Загрузка изображения (перетаскивание или выбор файла)
- Автоматический или ручной запуск анализа
- Отображение: название, ингредиенты, кухня, рецепт, этапы, КБЖУ/ХЕ, сгенерированное изображение
- Кнопка «Очистить» для сброса
- Блок «Анализ блюда»: название, кухня, уверенность, ингредиенты
- Рецепт: метаданные, ингредиенты с количествами, этапы приготовления
- Таблица КБЖУ и хлебных единиц (на порцию и на 100 г)
- Промпт для генерации изображения и путь к сгенерированному файлу (если есть)
Структура:
{
"dish_analysis": {
"dish_name": "Паста карбонара",
"ingredients": ["спагетти", "бекон", "яйца", "пармезан"],
"cuisine": "итальянская",
"confidence": 0.82
},
"recipe": {
"recipe": { "name", "cuisine", "servings", "prep_time", "cook_time", "total_time", "ingredients": [...] },
"cooking_steps": [ { "step_number", "description", "duration" } ],
"nutrition": {
"per_serving": { "calories", "protein", "fat", "carbs", "bread_units" },
"per_100g": { ... }
},
"image_prompt": "Professional food photography of ..."
},
"generated_image": { "file_path", "model", "size", "quality" }
}Если GIGACHAT_API_KEY не задан, в ответе будет только dish_analysis.
JPEG (.jpg, .jpeg), PNG (.png), GIF (.gif), WebP (.webp). Максимальный размер загружаемого файла в веб-интерфейсе — 16 МБ.
dish-analyzer/
├── app.py # Flask веб-приложение
├── dish_analyzer.py # Ядро: CLI, Vision, GigaChat, DALL-E
├── requirements.txt
├── .env # Ваши ключи (не коммитить!)
├── .env.example # Пример переменных (опционально)
├── README.md
├── templates/
│ └── index.html # Страница веб-интерфейса
├── uploads/ # Загруженные файлы (веб)
└── static/generated/ # Сгенерированные изображения (веб)
- КБЖУ и хлебные единицы — оценочные, рассчитанные моделью. Не заменяют консультацию врача или диетолога. При диабете и строгих диетах используйте только после консультации специалиста.
- API-ключи храните только в
.envи не публикуйте их в репозитории. - Для GigaChat может потребоваться отключение проверки SSL (
GIGACHAT_VERIFY_SSL=false) в зависимости от окружения.
MIT (или укажите свою лицензию).
Pull requests приветствуются. Для крупных изменений лучше сначала обсудить их в Issue.