Система поиска похожих изображений цветов на основе глубокого обучения с REST API и Docker-контейнеризацией.
Этот проект предоставляет REST API для поиска похожих изображений цветов. Система обучена на датасете Flowers Recognition и может:
- 🔍 Искать похожие изображения по загруженному фото
- 🎯 Предсказывать класс цветка (daisy, dandelion, rose, sunflower, tulip)
- 📊 Возвращать результаты в JSON с показателями сходства
- 🐳 Работать в Docker контейнере
- ⚡ Поддерживать GPU ускорение (опционально)
- Модель: ResNet50 + Custom Feature Extractor (512-dim features)
- API: FastAPI с автоматической документацией
- Метрика сходства: Косинусное сходство
- Контейнеризация: Docker + Docker Compose
- Веб-сервер: Nginx для статических файлов и проксирования
├── app.py # FastAPI приложение
├── model.py # Определение модели и системы поиска
├── best_flower_model.pth # Обученная модель (282MB)
├── flower_features_db.pkl # База данных признаков (8.7MB)
├── flowers-recognition/ # Датасет изображений
├── Dockerfile # Docker образ
├── docker-compose.yml # Оркестрация контейнеров
├── nginx.conf # Конфигурация Nginx
├── requirements_api.txt # Зависимости для API
├── test_api.py # Скрипт тестирования API
└── README.md # Этот файл
Убедитесь, что у вас установлены:
- Docker (версия 20.10+)
- Docker Compose (версия 1.29+)
- Python 3.9+ (для тестирования)
# Убедитесь, что все файлы на месте
ls -la best_flower_model.pth flower_features_db.pkl
# Запуск с Docker Compose
docker-compose up --build -d
# Проверка статуса контейнеров
docker-compose ps# Установка зависимостей для тестирования
pip install requests
# Запуск тестов
python test_api.py
# Или тестирование конкретного изображения
python test_api.py --image flowers-recognition/flowers/rose/rose_001.jpgcurl -X POST "http://localhost:8000/search" \
-H "accept: application/json" \
-F "file=@flower.jpg" \
-F "top_k=5" \
-F "include_predictions=true"Ответ:
{
"query_image": "flower.jpg",
"top_k": 5,
"results": [
{
"rank": 1,
"image_path": "flowers-recognition/flowers/rose/rose_123.jpg",
"similarity_score": 0.945612,
"predicted_class": "rose"
}
],
"class_predictions": {
"rose": 0.892,
"tulip": 0.056,
"daisy": 0.032
},
"metadata": {
"total_database_images": 4317,
"similarity_metric": "cosine_similarity",
"model_architecture": "ResNet50 + Custom Feature Extractor"
}
}curl -X POST "http://localhost:8000/predict" \
-F "file=@flower.jpg"curl http://localhost:8000/healthcurl http://localhost:8000/statsОткройте в браузере: http://localhost:8000/docs
# Сборка и запуск
docker-compose up --build -d
# Просмотр логов
docker-compose logs -f flower-search-api
# Остановка
docker-compose down
# Перезапуск
docker-compose restart# Сборка образа
docker build -t flower-search-api .
# Запуск контейнера
docker run -p 8000:8000 \
-v $(pwd)/flowers-recognition:/app/flowers-recognition:ro \
flower-search-api# Изменить в docker-compose.yml:
environment:
- USE_GPU=true
# Убедиться что установлен nvidia-docker
docker run --gpus all -p 8000:8000 flower-search-api# Полное тестирование
python test_api.py
# Тестирование конкретного изображения
python test_api.py --image path/to/flower.jpg --top-k 10
# Тестирование с другим URL
python test_api.py --url http://localhost:8000# Health check
curl http://localhost:8000/health
# Поиск похожих изображений
curl -X POST http://localhost:8000/search \
-F "file=@test_flower.jpg" \
-F "top_k=3"
# Предсказание класса
curl -X POST http://localhost:8000/predict \
-F "file=@test_flower.jpg"# В docker-compose.yml или .env файле
USE_GPU=false # Использование GPU
PYTHONUNBUFFERED=1 # Вывод логов в реальном времениФайл nginx.conf содержит:
- Проксирование API запросов
- Раздачу статических изображений
- Настройки кэширования
- Увеличенные таймауты для загрузки файлов
В app.py можно изменить:
- Максимальный размер загружаемых файлов (10MB)
- Таймауты обработки
- Уровень логирования
- Размер модели: 282MB
- База данных признаков: 8.7MB (4317 изображений)
- Размерность признаков: 512
- Время поиска: ~100-500ms на CPU
- Поддерживаемые форматы: JPEG, PNG, GIF, BMP, TIFF
Для улучшения производительности:
- GPU ускорение:
USE_GPU=true - Увеличение batch_size для обработки признаков
- Кэширование результатов на уровне приложения
- Использование ONNX для inference
# Установка зависимостей
pip install -r requirements_api.txt
# Запуск в режиме разработки
uvicorn app:app --reload --host 0.0.0.0 --port 8000- Добавьте функцию в
app.py - Используйте декораторы FastAPI (
@app.get,@app.post) - Добавьте документацию и валидацию
- Обновите тесты в
test_api.py
- Обучите новую модель и сохраните как
best_flower_model.pth - Пересоздайте базу данных признаков
flower_features_db.pkl - Пересоберите Docker образ:
docker-compose build
# Проверка логов
docker-compose logs flower-search-api
# Проверка доступности файлов модели
ls -la best_flower_model.pth flower_features_db.pkl
# Проверка портов
netstat -tlpn | grep 8000- Убедитесь, что размер файла < 10MB
- Проверьте формат изображения (JPEG, PNG, etc.)
- Проверьте права доступа к файлу
- Включите GPU:
USE_GPU=true - Увеличьте ресурсы Docker
- Проверьте нагрузку на систему:
htop
import requests
# Поиск похожих изображений
with open('flower.jpg', 'rb') as f:
response = requests.post(
'http://localhost:8000/search',
files={'file': f},
params={'top_k': 5, 'include_predictions': True}
)
result = response.json()
print(f"Найдено {len(result['results'])} похожих изображений")const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('top_k', '5');
fetch('http://localhost:8000/search', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log(data));# Простой поиск
curl -X POST http://localhost:8000/search \
-F "file=@flower.jpg" \
-F "top_k=5"
# С предсказаниями
curl -X POST http://localhost:8000/search \
-F "file=@flower.jpg" \
-F "top_k=5" \
-F "include_predictions=true"- Поддержка видео файлов
- Batch API для обработки множественных изображений
- Интеграция с S3/MinIO для хранения изображений
- Метрики и мониторинг (Prometheus + Grafana)
- A/B тестирование разных моделей
- Поддержка пользовательских датасетов
- Fork репозитория
- Создайте feature branch:
git checkout -b feature/new-feature - Сделайте изменения и добавьте тесты
- Создайте Pull Request
Этот проект создан в учебных целях. Модель обучена на открытом датасете Flowers Recognition.
При возникновении проблем:
- Проверьте раздел устранения неполадок
- Просмотрите логи:
docker-compose logs - Запустите тесты:
python test_api.py - Проверьте документацию API: http://localhost:8000/docs