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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sensory_detector-0.2.1.tar.gz.
File metadata
- Download URL: sensory_detector-0.2.1.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f22a39ef3a03f968d186b039d75e46001bca171a087f36ee00ab76a99c73770
|
|
| MD5 |
167beb7da701e0fa22b384315d64c462
|
|
| BLAKE2b-256 |
48f1d8a02f0abc2f766adef24234cdc912bd9876fae4906d19de87dad396038b
|
File details
Details for the file sensory_detector-0.2.1-py3-none-any.whl.
File metadata
- Download URL: sensory_detector-0.2.1-py3-none-any.whl
- Upload date:
- Size: 95.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a20b14605d8476d036e32da81bf759010f920c1dbb18a6057a6ae93f3d2d5cf5
|
|
| MD5 |
7e0d1f21267b4b2c10ca5317643552b2
|
|
| BLAKE2b-256 |
5e742bf6451692c71f80df725a9c478285dd3edd30e5075627bf120d1a82a25a
|