Skip to main content

Async YOLO service and client for sensory detection

Project description

SensoryLAB Async Microservice Detector

📷 Асинхронный сервис для обнаружения объектов на изображениях и видео (YOLOv8)


Описание

Async Microservice Detector — это продвинутый backend-сервис, реализующий асинхронный REST и WebSocket API для инференса изображений и видео с помощью моделей семейства YOLOv8. Сервис поддерживает:

  • Обработку изображений и видео через HTTP upload или по безопасному серверному пути (из смонтированных директорий).
  • Потоковый анализ видеокадров через WebSocket.
  • Горячую смену и кэширование моделей.
  • Безопасную работу с файловой системой (path traversal protection).
  • Масштабируемый деплой в Docker.

🏗️ Архитектурные особенности

  • FastAPI — быстрый асинхронный backend с автогенерацией OpenAPI и Swagger UI.
  • YOLOv8 (Ultralytics) — быстрая и точная детекция объектов.
  • Микросервисная архитектура — легко интегрируется в пайплайны, поддерживает контейнеризацию.
  • Модель кэшируется в VRAM/RAM, автоматическая выгрузка по таймауту.
  • Безопасный доступ к данным — анализ только в пределах смонтированных директорий.
  • Расширяемость — легко добавлять новые модели и backend-детекторы.

Архитектура сервиса

flowchart TD
  A[Клиент REST/WS] -->|HTTP upload или path| B[FastAPI сервер]
  B --> C[Менеджер кэша моделей]
  C --> D[YOLOv8Wrapper инференс]
  B -->|upload| E[Временное хранилище файлов]
  B -->|analyze by path| F[FILES_PATH]
  D --> G[Результат: Список объектов]
  B --> H[WebSocket анализ]
  H --> D
  C -->|LRU Eviction| X[Unload VRAM/RAM]

🚀 Быстрый старт

1. Клонирование и подготовка

git clone http://10.10.0.20:3000/m.chui/Yolo.git
cd Yolo

2. Запуск через Docker Compose

Отредактируйте .env при необходимости (см. ниже)

docker-compose up --build

3. Переменные окружения

Переменная Описание Пример
FILES_PATH Абсолютный путь до разрешённой директории с данными /mnt/nfs/servers
WEIGHTS_DIR Каталог с YOLO весами внутри контейнера /app/weights
DEFAULT_MODEL_NAME Имя модели по умолчанию (без .pt) yolov8s
MODEL_CACHE_TIMEOUT_SEC Таймаут простоя модели в кэше (сек) 600

Пример docker-compose.yaml:

version: '3.8'
services:
  yolo:
    build: .
    ports:
      - "8000:8000"
    environment:
      - FILES_PATH=/data
      - WEIGHTS_DIR=/app/weights
      - DEFAULT_MODEL_NAME=yolov8s
      - MODEL_CACHE_TIMEOUT_SEC=600
    volumes:
      - /mnt/nfs/servers:/data:ro   # Маунт хранилища только для чтения
      - ./src/sensory_detector/weights:/app/weights

🧑‍💻 Использование API

Swagger/OpenAPI

После запуска доступен интерактивный Swagger UI:
http://localhost:8000/docs

Основные эндпоинты

1. Анализ изображения (upload)

curl -X POST "http://localhost:8000/api/analyze/auto" \
  -F "file=@test.jpg" \
  -F "model_name=yolov8s"

#### 2. Анализ видео (upload)
curl -X POST "http://localhost:8000/api/analyze/auto" \
  -F "file=@test.avi" \
  -F "model_name=yolov8s"
#### 3. Анализ по серверному пути
curl -X POST "http://localhost:8000/api/analyze/auto" \
  -F "path=/data/test.jpg" \
  -F "model_name=yolov8s"

4. WebSocket для потокового анализа

import websockets, cv2, numpy as np, asyncio, json

async def ws_demo():
    uri = "ws://localhost:8000/ws/analyze?model_name=yolov8s"
    img = np.zeros((128, 128, 3), np.uint8)
    _, jpg = cv2.imencode(".jpg", img)
    async with websockets.connect(uri) as ws:
        await ws.send(jpg.tobytes())
        resp = await ws.recv()
        print(json.loads(resp))

asyncio.run(ws_demo())

📦 Формат ответа

{
  "model_name": "yolov8s",
  "detections": [
    {
      "index": 0,
      "timestamp": 0.0,
      "detections": [
        {
          "index": 0,
          "object_name": "person",
          "confidence": 0.93,
          "bounding_box": {
            "x1": 34.3, "y1": 41.2, "x2": 100.2, "y2": 200.8
          }
        }
      ]
    }
  ]
}

🔒 Безопасность

  • Path Traversal Protection — сервис анализирует только файлы, находящиеся в FILES_PATH.
  • Upload Validation — анализируется MIME-тип, поддерживаются только изображения/видео.
  • Разграничение доступа к данным — используйте Docker volume с read-only доступом для данных.

⚙️ Лучшие практики деплоя

  • GPU: Для ускорения инференса используйте nvidia-docker (--gpus=all).
  • Масштабирование: Разворачивайте несколько инстансов за reverse proxy (например, nginx или traefik).
  • Мониторинг: Логи доступны через stdout/stderr контейнера. Добавьте Prometheus/Grafana для мониторинга нагрузки.
  • Обновление моделей: Просто добавьте новый .pt в WEIGHTS_DIR и вызовите /api/available_models.

🛠️ Разработка и тесты

Запуск тестов

Предварительно запустите сервис

pytest tests/

Локальный запуск без Docker

Установите зависимости:

pip install -r requirements.txt

Запуск dev-сервера:

uvicorn main:app --reload --host 0.0.0.0 --port 8000

📝 Контрибьютинг

  • Пишите код с typing и docstring.
  • Соблюдайте PEP8.
  • Оформляйте pull requests с примерами использования.
  • Документируйте все публичные API.

📚 Документация


🤝 Благодарности


Вопросы и поддержка:
Создайте issue или пишите на team@example.com


© 2025, SensoryLAB Team

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sensory_detector-0.1.1.tar.gz (27.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sensory_detector-0.1.1-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

Details for the file sensory_detector-0.1.1.tar.gz.

File metadata

  • Download URL: sensory_detector-0.1.1.tar.gz
  • Upload date:
  • Size: 27.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for sensory_detector-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1576d62455fdf35d08870ed4f936af9f048e436a4e7b26d09e5ec0a4378e205d
MD5 5a200c0ff94545cac4e28b3108d7f722
BLAKE2b-256 2e52a6dcf9a5138700c0bb53843aed2fe288cc076f7d290ad0df0d6f95d84a1f

See more details on using hashes here.

File details

Details for the file sensory_detector-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for sensory_detector-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9e6abe146b8b7bba58ec892819d24cc6de0a94499ae4ddad5ac263d86f7fd96c
MD5 ffec99be1664ff71afa70676c9b1107e
BLAKE2b-256 7de25b030fec27d518c3adc1c392ce92e43464a417e4a52db59ff0812c50ac85

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page