Skip to content

DanilaAniva/MultimodalVideoRetrieval

Repository files navigation

MultimodalVideoRetrieval

Легковесный движок для семантического поиска по видео на основе Jina-CLIP и NVIDIA NeMo

System Interface

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-зависимостей, с хорошей поддержкой наклонного и зашумленного текста.

📊 Пайплайн обработки

  1. Preprocessing:
    • Видео декодируется через ffmpeg.
    • Извлекаются ключевые кадры (1 кадр/сек) и аудиодорожка (16kHz mono).
  2. Inference Loop:
    • Vision: Кадры батчами подаются в Jina-CLIP -> усреднение эмбеддингов (Mean Pooling).
    • Audio: Аудио подается в FastConformer -> получение транскрипции.
    • OCR: Кадры сканируются EasyOCR -> получение списка строк.
  3. Indexing:
    • Вектор видео (Jina) сохраняется в индекс.
    • Текст (ASR + OCR) сохраняется как метаданные для keyword-поиска или дополнительной векторизации.

📜 Лицензия

Проект распространяется под лицензией MIT. См. LICENSE.

📚 Ссылки


Developed for LCT Moscow 2024

About

Multimodal Video Retrieval Engine implementing Hybrid Search. Pipeline: Visual Embeddings (Jina-CLIP-v1), ASR (NVIDIA NeMo FastConformer), and Scene Text Recognition (EasyOCR). Based on PyTorch & Flask.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors