MultimodalVideoRetrieval — это система для индексации и поиска видеоконтента в векторном пространстве. Решение объединяет три модальности (Video, Audio, Text) для построения единого семантического индекса. Ориентировано на обработку коротких вертикальных видео c высокой плотностью информации.
🔥 Проект был представлен в рамках хакатона LCT-2024.
- 🔗 Hybrid Retrieval Pipeline: Объединение трех потоков данных для максимизации Recall: семантика видео (Dense Video Retrieval), транскрипция речи (ASR) и распознанный текст (OCR).
- 🗣️ Robust ASR (Speech-to-Text): Извлечение аудиодорожки и транскрибация речи с использованием
Nvidia NeMo (FastConformer Hybrid Large). Модель оптимизирована для русского языка и устойчива к фоновым шумам. - 📝 Scene Text Recognition (OCR): Детекция и считывание текста с кадров (титры, надписи, вывески) с помощью
EasyOCR. Поддержка кириллицы, латиницы и сложной геометрии текста. - 🎨 Deep Video Embeddings: Векторизация визуального ряда через
Jina-CLIP-v1. Использование расширенного контекстного окна (8k токенов) для точного кодирования длинных и детальных описаний сцен. - 🗄️ High-Performance Indexing: Реализация векторного поиска (ANN) на базе
FAISSдля быстрого извлечения релевантных видео из базы при масштабировании. - 🐳 Containerized Deployment: Полная упаковка окружения в
Dockerи оркестрация черезDocker Compose. Изоляция зависимостей PyTorch/CUDA и поддержка GPU Passthrough. - 🖥️ Interactive Web Interface: Легковесный Frontend с функцией автодополнения тегов, визуализацией Confidence Score и мгновенным предпросмотром найденных фрагментов.
- OS: Linux (рекомендуется Ubuntu 20.04+)
- GPU: NVIDIA GPU с поддержкой CUDA 11.8+ (требуется для NeMo и Jina-CLIP)
- RAM: Минимум 16GB (рекомендуется 32GB для одновременной загрузки всех моделей)
Вариант 1: Docker (Рекомендуемый)
Изолирует зависимости PyTorch и системные библиотеки для обработки аудио (libsndfile, ffmpeg).
# Клонирование репозитория
git clone https://github.com/DanilaAniva/MultimodalVideoRetrieval.git
cd MultimodalVideoRetrieval
# Сборка образа
docker build --platform linux/amd64 -t video-retrieval .
# Запуск контейнера (GPU pass-through)
docker run --gpus all -p 5000:5000 video-retrievalВариант 2: Локальная установка (Python)
# Установка системных зависимостей
apt-get install -y ffmpeg libsndfile1
# Установка Python пакетов
pip install -r requirements.txtПосле запуска сервера API доступно по адресу http://localhost:5000.
Пример запроса на поиск (Python):
import requests
url = "http://localhost:5000/api/search"
payload = {
"query": "собака играет в мяч на траве",
"top_k": 5
}
response = requests.post(url, json=payload)
results = response.json()
for item in results:
print(f"Video ID: {item['id']}, Score: {item['similarity']:.4f}")Пример индексации видео:
Загрузите видеофайл через веб-интерфейс или отправьте POST-запрос на /upload. Система автоматически запустит пайплайн: Decode -> Inference -> Vector Storage.
MultimodalVideoRetrieval/
├── app.py # Точка входа Flask приложения
├── Dockerfile # Конфигурация окружения
├── requirements.txt # Python зависимости
├── core/ # Основная логика инференса
│ ├── vision_encoder.py # Обертка над Jina-CLIP
│ ├── audio_transcriber.py # Пайплайн Nvidia NeMo
│ └── text_extractor.py # logic EasyOCR
├── storage/ # Логика хранения векторов
│ └── indexer.py # In-memory векторный индекс
├── utils/ # Утилиты
│ ├── video_proc.py # Нарезка кадров и извлечение аудио (ffmpeg)
│ └── preprocessing.py # Нормализация текста и изображений
├── static/ # Фронтенд ассеты
└── templates/ # HTML шаблоны
Система использует ансамбль моделей для извлечения признаков.
Визуальный энкодер (Visual Encoder)
| Компонент | jinaai/jina-clip-v1 |
|---|---|
| Тип | Contrastive Language-Image Pretraining (CLIP) |
| Backbone | ViT-B-32 (Vision Transformer) |
| Context Length | 8192 токенов (против 77 у OpenAI CLIP) |
| Задача | Генерация эмбеддингов (размерность 768) для видеокадров и текстовых запросов. Обеспечивает семантическую связь "Text <-> Image". |
| Обоснование | Стандартный CLIP плохо работает с длинными и детальными описаниями на русском языке. Jina-CLIP показывает State-of-the-Art результаты на бенчмарках Retrieval. |
Обработка аудио (ASR)
| Компонент | nvidia/stt_ru_fastconformer_hybrid_large_pc |
|---|---|
| Framework | NVIDIA NeMo Toolkit |
| Архитектура | FastConformer (Convolution subsampling + Transformer) |
| Тип | Hybrid Transducer-CTC |
| Задача | Преобразование аудиодорожки видео в текст (Speech-to-Text). |
| Обоснование | Модель оптимизирована для русской речи, устойчива к музыке и шумам на фоне, характерным для контента социальных сетей (TikTok/Shorts). |
Извлечение текста (OCR)
| Компонент | EasyOCR |
|---|---|
| Backbone | CRAFT (Detection) + CRNN (Recognition) |
| Языки | Английский, Русский (Cyrillic) |
| Задача | Детекция текста, наложенного на видео (титры, надписи, вывески). |
| Обоснование | Легковесное решение, не требующее тяжелых Tessearct-зависимостей, с хорошей поддержкой наклонного и зашумленного текста. |
- Preprocessing:
- Видео декодируется через
ffmpeg. - Извлекаются ключевые кадры (1 кадр/сек) и аудиодорожка (16kHz mono).
- Видео декодируется через
- Inference Loop:
- Vision: Кадры батчами подаются в Jina-CLIP -> усреднение эмбеддингов (Mean Pooling).
- Audio: Аудио подается в FastConformer -> получение транскрипции.
- OCR: Кадры сканируются EasyOCR -> получение списка строк.
- Indexing:
- Вектор видео (Jina) сохраняется в индекс.
- Текст (ASR + OCR) сохраняется как метаданные для keyword-поиска или дополнительной векторизации.
Проект распространяется под лицензией MIT. См. LICENSE.
Developed for LCT Moscow 2024


