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.2.tar.gz (87.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.2-py3-none-any.whl (95.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: sensory_detector-0.2.2.tar.gz
  • Upload date:
  • Size: 87.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.2.tar.gz
Algorithm Hash digest
SHA256 924ea77259c05a2ca2b4426ada80e419c4872167a4c4f237c1888388391ef73a
MD5 6b206ec89be0b74e43744a67d97506af
BLAKE2b-256 2bb973debdb8a6e07fd92fb0840f07863f5ab475eb713cbf488529c93328e4d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for sensory_detector-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 40320d64d1776f5456813f0aad570a9583756e433fb6de2797e61b0739ace3d9
MD5 56b050c26006072bf141dd2e37b2f45e
BLAKE2b-256 07e3ecb7842de906c8131936d14a6eb60ffb9b2e5fbac34fd0ea3224e0a8e70f

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