Skip to main content

Async ML service and client for sensory detection

Project description

Sensory Detector: Высокомасштабируемый Асинхронный CV/ML Микросервис

Обзор Проекта

Sensory Detector — это production-grade асинхронный микросервис, разработанный для высокопроизводительного и масштабируемого анализа изображений и видео. Сервис предоставляет унифицированные API для ключевых задач компьютерного зрения и машинного обучения, таких как:

  • Обнаружение объектов (Object Detection) с использованием YOLOv8 (Ultralytics).
  • Оптическое распознавание символов (OCR) с поддержкой EasyOCR и Tesseract.
  • Генерация векторных эмбеддингов (Embeddings) с использованием OpenCLIP.

Проект ориентирован на обеспечение безопасности, производительности, масштабируемости и максимальной гибкости для интеграции в распределенные мультимодальные инфраструктуры.

Ключевые Возможности

  • Асинхронность: Построен на FastAPI и asyncio для максимальной пропускной способности и неблокирующего I/O.
  • Модульность и Расширяемость: Лёгкая интеграция новых ML-моделей и типов задач через унифицированные интерфейсы (Detector).
  • Гибкость ввода данных: Поддержка прямой загрузки файлов (upload), обработки файлов по пути на серверной файловой системе (path-based), а также WebSocket для потокового анализа.
  • Предобработка изображений: Встроенные опции предобработки (изменение размера, бинаризация, добавление границ) для оптимизации инференса.
  • Управление моделями: Эффективное кеширование моделей (LRU с TTL), горячая подгрузка и выгрузка, мониторинг использования для оптимизации памяти (включая GPU).
  • Безопасность: Строгий контроль доступа к файловой системе, валидация всех входящих данных.
  • DevOps-готовность: Конфигурируемость через переменные окружения, поддержка Docker и Docker Compose, автоматическая OpenAPI/Swagger документация, структурированное логирование и метрики.

Архитектурный Обзор

Сервис спроектирован как модульное FastAPI-приложение. Входящие запросы обрабатываются асинхронно, а ресурсоёмкие операции инференса ML-моделей выносятся из основного event loop в отдельные потоки или процессы для повышения производительности и отзывчивости. ModelCache динамически управляет загруженными ML-моделями, оптимизируя использование памяти и ресурсов.

flowchart TD
  A[Клиент REST/WS] -->|HTTP upload или path| B[FastAPI Сервис]
  B --> C{Менеджер Кэша Моделей - ModelCache}
  C --> D[ML-Модели - YOLO, OCR, CLIP]
  B -- опционально --> E[Модуль Предобработки Изображений]
  B -->|Upload files| F[Временное Хранилище - InMemory/Disk]
  B -->|Analyze by path| G[FILES_PATH - Смонтированный Том]
  D --> H[Результаты - Pydantic Models]
  H --> B
  B -->|WebSocket Stream| I[WebSocket Обработчик]
  I --> D
  C -->|LRU Eviction/TTL| J[Выгрузка Модели - Освобождение VRAM/RAM]

Ключевые Компоненты:

  • FastAPI Сервис: Основной HTTP/WebSocket интерфейс.
  • Менеджер Кэша Моделей (ModelCache): Отвечает за загрузку, хранение и выгрузку ML-моделей. Использует LRU-алгоритм для эффективного управления памятью и позволяет "горячую" перезагрузку/выгрузку моделей.
  • ML-Модели (Детекторы): Каждая ML-модель (YOLOv8, EasyOCR, Tesseract, CLIP) обёрнута в унифицированный интерфейс (Detector), что облегчает их интеграцию и расширение.
  • Ввод Данных: Сервис поддерживает загрузку файлов напрямую или их обработку по пути на файловой системе сервера (если настроен FILES_PATH).
  • Модуль Предобработки Изображений: Позволяет применять операции, такие как изменение размера, бинаризация и добавление рамок, перед подачей изображения в ML-модель.
  • WebSocket Обработчик: Обеспечивает возможность потоковой обработки данных (например, кадров видео) через двустороннее соединение.

Быстрый Старт (Клиент)

Для взаимодействия с сервисом Sensory Detector используйте предоставленный асинхронный Python-клиент.

Установка Клиента

Установите необходимые зависимости, указанные в requirements.txt:

pip install -r requirements.txt

Пример Использования Клиента (Асинхронный)

Предполагается, что сервис запущен и доступен по адресу http://localhost:8000.

import asyncio
from src.sensory_detector.yolo_client.client import SensoryAPIClient
from src.sensory_detector.models.models import DetectionSeries, OCRSeries

async def main():
    client = SensoryAPIClient(base_url="http://localhost:8000")

    print("--- Пример: Обнаружение объектов (YOLOv8) ---")
    try:
        # Обнаружение объектов в изображении, загруженном с локального пути
        detection_result: DetectionSeries = await client.detect_objects(
            images="tests/data/test.jpg",
            model_name="yolov8s"
        )
        print(f"Обнаружено объектов: {detection_result.total_items}")
        for frame in detection_result.results:
            for obj in frame.detections[:3]: # Показать первые 3 объекта
                print(f"  - {obj.label} (уверенность: {obj.confidence:.2f}) в {obj.box.x1},{obj.box.y1},{obj.box.x2},{obj.box.y2}")
    except Exception as e:
        print(f"Ошибка при обнаружении объектов: {e}")

    print("\n--- Пример: Распознавание текста (EasyOCR) ---")
    try:
        # Распознавание текста в изображении
        ocr_result: OCRSeries = await client.recognize_texts(
            images="tests/data/test.png",
            model_name="easyocr"
        )
        print(f"Распознанный текст: '{ocr_result.results[0].full_text}'")
    except Exception as e:
        print(f"Ошибка при распознавании текста: {e}")

    print("\n--- Пример: Получение списка доступных моделей ---")
    try:
        models_info = await client.get_available_models()
        print(f"Доступные модели для детекции: {models_info.available_models.get('detection', 'N/A')}")
        print(f"Доступные модели для OCR: {models_info.available_models.get('ocr', 'N/A')}")
    except Exception as e:
        print(f"Ошибка при получении списка моделей: {e}")

if __name__ == "__main__":
    asyncio.run(main())

Подробная Документация

  • Документация Клиента: Для получения детальной информации о параметрах, типах входных и выходных данных, а также о расширенных возможностях (таких как предобработка изображений, режимы работы с файлами и WebSocket), пожалуйста, обратитесь к файлу: src/sensory_detector/yolo_client/README_CLI.MD

  • Документация Сервера: Для получения информации о конфигурации сервера, его развёртывании (включая Docker и переменные окружения), а также о принципах расширения и внутренних компонентах, обратитесь к файлу: src/sensory_detector/yolo_server/README_SRV.MD


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.2.3.tar.gz (90.9 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.2.3-py3-none-any.whl (99.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for sensory_detector-0.2.3.tar.gz
Algorithm Hash digest
SHA256 381c37a79e22f932e5ed8414bcd04081e35614eb508ff7a7d1e039529cfd20c0
MD5 d61bf954f285648c8bc862282ac4ef5d
BLAKE2b-256 3e9039d9b13ef489f513c8c730ddff7ff11710cc05c812c4fbfcba66ef4c9298

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sensory_detector-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 57a3d06a66ac2d8b92ee3f523a40d5a784a5ae5f612fbc2896a581f489afbabb
MD5 bd2832ad2c1ae950c76e922d4b1ef11f
BLAKE2b-256 14ae56dbd8b3e877a1810f26d066ed0e46fd20d76a1408d93fb1cf4717498c5b

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