Система предназначена для автоматического определения географических координат (WGS 84) и адресов зданий на фотоматериалах (Москва, МО) с использованием ИНС и компьютерного зрения.
- Распознавание зданий на фотографиях (выделение объектов bounding box)
- Определение координат зданий на основе визуального поиска
- Привязка к адресам с использованием внешних геокодеров (Яндекс, 2GIS, ФИАС и др.)
- Загрузка фотографий по одной или пакетно через ZIP-архивы
- Экспорт результатов в формате XLSX
Система состоит из нескольких микросервисов:
- PhotoUploadService - сервис загрузки фотографий
- Main API Service - основной сервис обработки изображений
- AuthService - сервис аутентификации
- Database - база данных PostgreSQL
- Celery Worker - асинхронные задачи обработки изображений
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Frontend │ │ Nginx Proxy │ │ PostgreSQL │
│ (workbench.html)│◄──►│ (nginx.conf) │◄──►│ (Database) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ PhotoUploadService │ │ Main API │ │ AuthService │
│ (photo_upload.py) │ │ (app.py) │ │ (auth.py) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │ │
└─────────────────────┼─────────────────────┘
▼
┌──────────────────┐
│ Celery Worker │
│ (worker.py) │
└──────────────────┘
│
▼
┌───────────────────────┐
│ Computer Vision Model │
│ (cv_model.py) │
└───────────────────────┘
- Python 3.8+
- Docker и Docker Compose
- PostgreSQL
- Redis
Для быстрого запуска всех сервисов используйте Docker Compose:
# Клонируйте репозиторий
git clone <repository-url>
cd <project-directory>
# Запустите все сервисы
docker-compose up -d
# Приложение будет доступно по адресу: http://localhost:8080- Установите зависимости:
pip install -r requirements.txt- Настройте переменные окружения в
.envфайле:
DATABASE_URL=postgresql://user:password@localhost:5432/building_detector
REDIS_URL=redis://localhost:6379/0
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
AWS_ENDPOINT_URL=https://storage.yandexcloud.net
AWS_BUCKET_NAME=your_bucket_name- Запустите сервисы:
# Запуск базы данных и Redis
docker-compose up -d db redis
# Запуск основного API сервиса
uvicorn src.api.app:app --host 0.0.0.0 --port 8000
# Запуск сервиса загрузки фотографий
uvicorn full-stack.PhotoUploadService.photo_upload:app --host 0.0.0.0 --port 8001
# Запуск сервиса аутентификации
uvicorn full-stack.AuthService.auth:app --host 0.0.0.0 --port 8002
# Запуск Celery worker
celery -A src.tasks.worker.celery_app worker --loglevel=infoДля работы с API необходимо авторизоваться. Все endpoints требуют наличия cookie с session_token.
POST /api/register
Content-Type: application/json
{
"name": "username",
"email": "user@example.com",
"password": "password"
}POST /api/login
Content-Type: application/json
{
"name": "username",
"password": "password"
}POST /api/photo_upload
Content-Type: multipart/form-data
Cookie: session_token=your_token
file: image.jpgPOST /api/zip_upload
Content-Type: multipart/form-data
Cookie: session_token=your_token
file: photos.zipGET /api/photos
Cookie: session_token=your_tokenGET /export/results/xlsx
Cookie: session_token=your_tokenPOST /search/by_coordinates
Content-Type: application/json
{
"lat": 55.7558,
"lon": 37.6173,
"radius_km": 1.0
}POST /search/by_address
Content-Type: application/json
{
"address": "Москва, Красная площадь, 1"
}| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Проверка состояния сервиса |
/api/photo_upload |
POST | Загрузка одиночного изображения |
/api/zip_upload |
POST | Загрузка ZIP-архива с изображениями |
/api/photos |
GET | Получение списка загруженных фотографий |
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Корневой эндпоинт с информацией об API |
/health |
GET | Проверка состояния сервиса |
/process_image |
POST | Синхронная обработка изображения |
/process_image_async |
POST | Асинхронная обработка изображения |
/process_images_batch |
POST | Пакетная асинхронная обработка изображений |
/task/{task_id} |
GET | Получение статуса задачи |
/tasks/request/{request_id} |
GET | Получение всех задач по request_id |
/results/latest |
GET | Получение последних результатов обработки |
/results/photo/{photo_id} |
GET | Получение результатов обработки для конкретного фото |
/search/by_coordinates |
POST | Поиск изображений по координатам |
/search/by_address |
POST | Поиск изображений по адресу |
/export/results/xlsx |
GET | Экспорт результатов обработки в формате XLSX |
/user/query_history |
POST | Сохранение истории запросов пользователя |
/user/query_history/{user_id} |
GET | Получение истории запросов пользователя |
/coordinates |
POST | Загрузка координат |
/coordinates/batch |
POST | Загрузка каталога координат |
/model/info |
GET | Получить информацию о модели |
/import/zip |
POST | Импорт данных zip архивом |
/download/image/{image_id} |
GET | Скачивание изображения |
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Проверка состояния сервиса |
/api/auth |
GET/POST | Проверка аутентификации |
/api/register |
POST | Регистрация нового пользователя |
/api/login |
POST | Вход в систему |
├── src/ # Основной исходный код
│ ├── api/ # API endpoints
│ │ ├── app.py # Основное приложение FastAPI
│ │ └── integration.py # Интеграционные endpoints
│ ├── models/ # Модели машинного обучения
│ │ ├── cv_model.py # Модель компьютерного зрения
│ │ └── feature_extractor.py # Извлечение признаков
│ ├── geo/ # Геокодирование
│ │ └── geocoder.py # Геокодер
│ ├── data/ # Работа с данными
│ ├── engine/ # Движок обработки
│ ├── tasks/ # Асинхронные задачи (Celery)
│ │ └── worker.py # Celery worker
│ ├── utils/ # Вспомогательные функции
│ └── visualization/ # Визуализация
├── full-stack/ # Микросервисы
│ ├── PhotoUploadService/ # Сервис загрузки фотографий
│ │ ├── photo_upload.py # Основной сервис
│ │ └── Dockerfile # Docker конфигурация
│ ├── AuthService/ # Сервис аутентификации
│ │ ├── auth.py # Основной сервис
│ │ └── Dockerfile # Docker конфигурация
│ ├── DB/ # Конфигурация базы данных
│ └── ngnix/ # Веб-интерфейс и reverse proxy
├── notebooks/ # Jupyter notebooks для исследований
├── tests/ # Тесты
├── configs/ # Конфигурационные файлы
├── data/ # Данные проекта
│ ├── index/ # FAISS индексы
│ └── processed/ # Обработанные данные
└── logs/ # Логи приложения
Система использует PostgreSQL для хранения метаданных изображений и результатов обработки.
- users - информация о пользователях
- photos - загруженные фотографии
- processing_results - результаты обработки изображений
- query_history - история запросов пользователей
Для инициализации базы данных выполните SQL скрипты из директории src/sql_scripts/.
Модель на основе GeoCLIP для определения координат зданий на изображениях.
- Использует FAISS индекс для поиска похожих изображений
- Интегрирована с внешними геокодерами
- Поддерживает асинхронную обработку
Модель загружает необходимые данные из S3 по следующим путям:
processed_data/models/index/faiss_index.bin- FAISS индексprocessed_data/models/index/image_mapping.csv- Маппинг изображенийprocessed_data/moscow_images.csv- Метаданные изображений
Код следует принципам чистой архитектуры:
- Разделение на слои (presentation, business logic, data access)
- Использование dependency injection
- Четкое разделение ответственности между модулями
- Создайте новую ветку для разработки
- Реализуйте функционал в соответствующем модуле
- Напишите тесты
- Обновите документацию
- Создайте pull request
Для запуска тестов используйте:
pytest tests/Система использует стандартное логирование Python. Уровень логирования можно настроить через переменные окружения.
Система спроектирована для масштабирования:
- Горизонтальное масштабирование сервисов
- Асинхронная обработка задач через Celery
- Кэширование результатов
- Использование FAISS для быстрого поиска похожих изображений
- Оптимизация загрузки изображений из S3
- Кэширование часто используемых данных
- Аутентификация через session tokens
- Защита от SQL-инъекций
- Валидация входных данных
- HTTPS в production среде
- Централизованное логирование
- Метрики производительности
- Алертинг о критических ошибках
Проект распространяется под лицензией MIT.