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
Metadata
Release files for sensory-detector 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| sensory_detector-0.2.4.tar.gz | 90.9 kB | Without provenance | Details for sensory_detector-0.2.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sensory_detector-0.2.4-py3-none-any.whl | Python 3 | none | any | Details for sensory_detector-0.2.4-py3-none-any.whl |
Total release size: 190.5 kB
Release files / sensory_detector-0.2.4.tar.gz
| Download URL | sensory_detector-0.2.4.tar.gz |
|---|---|
| Size | 90.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee3bf1ee196068d19b16fb91d98975c11fd95f7eff4facdc59f7476953cd3374
|
|
BLAKE2b-256 checksum How to use checksums |
5433f1fa2b8cb740dafaa443b933f3734aefc1597275b1411923d47fb984207b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.1
|
Release files / sensory_detector-0.2.4-py3-none-any.whl
| Download URL | sensory_detector-0.2.4-py3-none-any.whl |
|---|---|
| Size | 99.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f6dd6bf4aaed883100a1a9dfd8df352d5e74f122f3e2cf06bd58e80a7ddd563d
|
|
BLAKE2b-256 checksum How to use checksums |
f66b60e871095c9e244a81ebaba890d8ccb95b2048f49dc075c03e8568158c5b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.1
|
Security for sensory-detector 0.2.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.