Конспект 10: Multimodal AI - Текст, изображения, аудио, видео
Оглавление
- Введение в Multimodal AI
- Типы модальностей
- Современные multimodal модели
- Vision Language Models (VLM)
- Audio и Speech Processing
- Video Understanding
- Multimodal embeddings
- Cross-modal retrieval
- Практические примеры
- Лучшие практики
Введение в Multimodal AI
Что такое Multimodal AI?
Определение: Multimodal AI — это системы, которые могут обрабатывать и интегрировать информацию из нескольких типов данных (текст, изображения, аудио, видео).
Отличие от unimodal:
Unimodal (один тип данных):
- Текстовый LLM: только текст → текст
- Image classifier: только изображения → класс
- Speech-to-text: только аудио → текст
Multimodal (несколько типов):
- GPT-4 Vision: текст + изображения → текст
- CLIP: текст + изображения → embeddings
- LLaVA: изображение + вопрос → ответ
Зачем multimodal?
Реальный мир multimodal:
❌ Никогда нет чистого текста или чистых картинок
✅ Всё комбинации текста, изображений, видео, аудио
Примеры:
- Документы со скриншотами (PDF анализ)
- Видео с субтитрами (понимание контента)
- Изображения с подписями (caption generation)
- Таблицы с иконками (table understanding)
История multimodal
2015: VGG + LSTM (базовая vision-language)
2016: Attention механизм между модальностями
2019: CLIP (OpenAI) - революция
2021: ViT (Vision Transformer)
2023: GPT-4 Vision (понимание любых изображений)
2024: Gemini 2.0 (лучше всех в multimodal)
2025: Reasoning models с vision
Типы модальностей
1. Text (Текст)
Характеристики: - Последовательная информация - Дискретная (слова, токены) - Легко обрабатывать
Обработка: - Tokenizer → embeddings → LLM
2. Image (Изображения)
Характеристики: - 2D сетка пикселей - Непрерывная информация - Содержит пространственные отношения
Обработка: - Image encoder (CNN, ViT) - Patch embedding - Vision transformer
Размеры изображений:
Маленькие (32×32): Классификация, быстро
Средние (224×224): Standard для большинства
Большие (512×512+): Детали, но медленнее
3. Audio (Аудио)
Характеристики: - Временные последовательности - Частоты (спектрограммы) - Фонетическая информация
Обработка: - Mel-spectrogram (визуализация звука) - Audio embeddings - Speech recognition → текст
Типы:
Speech: говорение (можно convert в текст)
Music: музыкальное аудио (análisis ритма, жанра)
Sound: звуковые эффекты
4. Video (Видео)
Характеристики: - Последовательность фреймов (изображений) - Временная информация - Содержит движение и изменения
Обработка: - Извлечение ключевых фреймов - Optical flow (движение) - 3D convolutions (temporal)
Применение: - Действия (action recognition) - Понимание событий - Описание видео (captioning)
Современные multimodal модели
GPT-4 Vision (OpenAI)
Возможности: - ✅ Анализ изображений любого размера - ✅ Понимание диаграмм, графиков, таблиц - ✅ OCR (извлечение текста из изображений) - ✅ Детали и мелкий текст - ✅ Понимание контекста
Цена:
Input: $0.01 per 1K tokens + $0.25 per image
Output: $0.03 per 1K tokens
Пример: 5 изображений + 100 токенов текста
= (100 × $0.01 + 5 × $0.25) / 1000 + 0 = $0.00135
Пример использования:
import openai
response = openai.ChatCompletion.create(
model="gpt-4-vision-preview",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
},
{
"type": "text",
"text": "Что ты видишь на этом изображении?"
}
]
}
]
)
Gemini 2.0 (Google)
Возможности: - ✅ Лучше GPT-4 в image understanding - ✅ Лучше в мультиязычности - ✅ Аудио понимание (native) - ✅ 1 миллион токенов контекста
Цена:
Дешевле чем GPT-4 Vision
Input: $0.075 per 1M tokens
Images: включены в токен count
Claude 3 (Anthropic)
Возможности: - ✅ Очень хорошее понимание изображений - ✅ Честность и безопасность - ✅ Длинный контекст (200K токенов)
Модели:
Claude 3 Haiku: быстро, дешево
Claude 3 Sonnet: баланс
Claude 3 Opus: лучше всех
Llama 2 Vision (Meta)
Возможности: - ✅ Open source (бесплатно) - ✅ Можно локально развернуть - ✅ Fine-tuning возможен
Ограничения: - ❌ Не так хорош как GPT-4 - ❌ Требует GPU - ❌ Медленнее
LLaVA (Open Source)
Характеристики: - Combining LLaMA + CLIP - Хорошо для image captioning - Fine-tunable
Vision Language Models (VLM)
Архитектура VLM
┌──────────────┐
│ Изображение│
└──────┬───────┘
│
┌───▼────────────┐
│ Vision Encoder │ (ViT)
│ (извлекает │
│ features) │
└───┬────────────┘
│
┌───▼─────────────────┐
│ Feature Projection │ (привести к размеру токенов)
└───┬─────────────────┘
│
┌───▼────────────────────────────┐
│ LLM (например, GPT) │ ◄──── ┌──────────────┐
│ (понимает и отвечает) │ │ Текстовый │
│ │ │ вопрос │
└───┬────────────────────────────┘ └──────────────┘
│
┌───▼────────────┐
│ Текстовый ответ│
└────────────────┘
Процесс обработки изображения
Шаг 1: Image Encoding
Изображение (H×W×3)
↓
Vision Transformer (ViT)
↓
Фичи изображения (N×D)
где N = количество патчей, D = размерность
Шаг 2: Projection
Фичи изображения (N×D_vision)
↓
Linear projection
↓
Токен-подобное представление (N×D_language)
Шаг 3: LLM Processing
[<image_tokens> + <text_tokens>]
↓
LLM (например, GPT)
↓
Текстовый ответ
Типы задач VLM
| Задача | Описание | Пример |
|---|---|---|
| Image Captioning | Описать что на картинке | "На картинке собака в парке" |
| VQA (Visual Q&A) | Ответить на вопрос про картинку | "Сколько людей?" → "3" |
| OCR | Извлечь текст из картинки | "Прочитай текст на вывеске" |
| Image Classification | Классифицировать картинку | "Это кот или собака?" |
| Diagram Understanding | Понять диаграммы/графики | "Какой тренд в данных?" |
| Table Understanding | Понимать таблицы | "Сумма по столбцу?" |
Audio и Speech Processing
Speech-to-Text (STT)
Модели:
OpenAI Whisper:
- Точность: 95%+
- Языки: 98
- Бесплатно (может быть локально)
Google Cloud Speech-to-Text:
- Accuracy: 95%+
- Real-time streaming
Azure Speech Services:
- Multilingual
- Custom models
Использование Whisper:
import openai
audio_file = open("audio.mp3", "rb")
transcript = openai.Audio.transcribe(
model="whisper-1",
file=audio_file,
language="ru" # Опционально
)
print(transcript["text"])
Text-to-Speech (TTS)
OpenAI TTS:
import openai
speech = openai.Audio.create(
model="tts-1",
voice="nova",
input="Привет, это голосовое сообщение",
speed=1.0
)
speech.stream_to_file("output.mp3")
Голоса:
alloy, echo, fable, onyx, nova, shimmer
Качество:
tts-1: быстро, дешево (используй для real-time)
tts-1-hd: лучше качество (используй для записей)
Audio Understanding
Анализ музыки:
Жанр классификации
Mood recognition
Beat detection
Instrument identification
Анализ речи:
Эмоции (happiness, anger, sadness)
Уверенность говорящего
Скорость речи
Акцент/язык
Video Understanding
Video Analysis Tasks
Key Frame Extraction:
import cv2
video = cv2.VideoCapture("video.mp4")
frames = []
while True:
ret, frame = video.read()
if not ret:
break
frames.append(frame)
# Выбрать ключевые фреймы (каждый N-й)
key_frames = frames[::30] # Каждый 30-й фрейм
Action Recognition:
Определить действия в видео:
- Ходьба, бег, прыжок
- Сидение, стояние
- Взаимодействия между людьми
Video Captioning:
Input: видео
Output: "Люди играют в футбол в парке"
Обработка видео с LLM
Метод 1: Extract key frames → VLM
# 1. Извлечь ключевые фреймы
key_frames = extract_key_frames(video)
# 2. Описать каждый фрейм с VLM
descriptions = []
for frame in key_frames:
desc = gpt4_vision(frame, "Опиши что происходит")
descriptions.append(desc)
# 3. Объединить в сценарий видео
full_description = " → ".join(descriptions)
Метод 2: Video embedding → search
# Используй video embedding модели
# Например: ViViT, TimeSformer
# Все видео в датасете → embeddings
video_embeddings = []
for video in videos:
embedding = video_encoder(video)
video_embeddings.append(embedding)
# Search похожих видео
query_embedding = video_encoder(query_video)
similar = search_nearest(query_embedding, video_embeddings)
Multimodal embeddings
Что такое multimodal embedding?
Определение: Вектор который представляет информацию из нескольких модальностей в единном пространстве.
Пример CLIP:
Изображение: "Кот спит"
↓
CLIP Image Encoder
↓
[0.123, -0.456, ..., 0.789] (512D)
Текст: "Спящий кот"
↓
CLIP Text Encoder
↓
[0.125, -0.450, ..., 0.791] (512D)
Similarity: cosine_sim = 0.98 (очень похожи!)
CLIP (OpenAI)
Архитектура:
Image Encoder (ViT)
↓
└─→ Image embeddings (512D)
Text Encoder (Transformer)
↓
└─→ Text embeddings (512D)
Обучение: Maximal similarity между paired images и текстов
Использование:
from PIL import Image
import clip
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image = preprocess(Image.open("photo.jpg")).unsqueeze(0).to(device)
text = clip.tokenize(["собака", "кот", "птица"]).to(device)
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
# Вычислить similarity
logits_per_image = image_features @ text_features.T
probs = logits_per_image.softmax(dim=-1)
print(probs) # [0.85, 0.10, 0.05] - скорее всего собака
Multimodal embedding models
| Модель | Модальности | Размерность | Цена | Качество |
|---|---|---|---|---|
| CLIP | текст + изображение | 512 | Бесплатно | ⭐⭐⭐⭐ |
| Jina multimodal | текст + изображение | 768 | $0.10/1M | ⭐⭐⭐⭐⭐ |
| BLIP | текст + изображение | 256 | Бесплатно | ⭐⭐⭐⭐ |
| ImageBind | текст + изображение + аудио + видео | 1024 | Бесплатно | ⭐⭐⭐⭐ |
Cross-modal retrieval
Текст → Изображение поиск
Как это работает:
Пользователь: "Красная роза"
↓
Text encoder (CLIP)
↓
Text embedding
↓
Vector DB поиск
↓
Найти похожие изображения
↓
Результаты: [foto1.jpg, foto2.jpg, ...]
Реализация:
import clip
from qdrant_client import QdrantClient
import torch
from PIL import Image
# 1. Загрузить модель
device = "cuda"
model, preprocess = clip.load("ViT-B/32", device=device)
qdrant = QdrantClient("http://localhost:6333")
# 2. Индексировать изображения
images = load_all_images()
for i, img_path in enumerate(images):
img = Image.open(img_path)
img_tensor = preprocess(img).unsqueeze(0).to(device)
with torch.no_grad():
embedding = model.encode_image(img_tensor)[0].cpu().numpy()
qdrant.upsert(
collection_name="images",
points=[{"id": i, "vector": embedding, "payload": {"path": img_path}}]
)
# 3. Поиск по тексту
query = "красная роза"
query_tokens = clip.tokenize(query).to(device)
with torch.no_grad():
query_embedding = model.encode_text(query_tokens)[0].cpu().numpy()
results = qdrant.search(
collection_name="images",
query_vector=query_embedding,
limit=5
)
# Вывод результатов
for result in results:
print(f"Image: {result.payload['path']}, Score: {result.score:.3f}")
Изображение → Текст поиск
Как это работает:
Пользователь загружает изображение
↓
Image encoder (CLIP)
↓
Image embedding
↓
Vector DB поиск (в текстовых embeddings)
↓
Найти похожий текст
↓
Результаты: [document1.txt, document2.txt, ...]
Практические примеры
Пример 1: Image-based Document Q&A
import openai
from PIL import Image
import base64
def image_to_base64(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode()
def analyze_document(image_path, question):
"""Анализ документа с изображением"""
image_data = image_to_base64(image_path)
response = openai.ChatCompletion.create(
model="gpt-4-vision-preview",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_data}"
}
},
{
"type": "text",
"text": question
}
]
}
]
)
return response.choices[0].message.content
# Использование
answer = analyze_document(
"invoice.jpg",
"Какая общая сумма счета?"
)
Пример 2: Video summarization
import cv2
import openai
def summarize_video(video_path):
"""Резюме видео через анализ ключевых фреймов"""
video = cv2.VideoCapture(video_path)
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
# Извлечь ключевые фреймы
key_frames = []
for i in range(0, frame_count, frame_count // 5): # 5 фреймов
video.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame = video.read()
if ret:
key_frames.append(frame)
# Описать каждый фрейм
descriptions = []
for frame in key_frames:
# Конвертировать frame → base64
# Отправить в GPT-4 Vision
# Получить описание
pass
# Объединить в итоговое резюме
summary = "\n".join(descriptions)
return summary
Пример 3: Audio transcription + Analysis
import openai
def analyze_podcast(audio_path):
"""Транскрибировать и проанализировать подкаст"""
# 1. Транскрибировать
with open(audio_path, "rb") as audio_file:
transcript = openai.Audio.transcribe(
model="whisper-1",
file=audio_file
)
text = transcript["text"]
# 2. Анализировать с LLM
analysis = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[
{
"role": "system",
"content": "Ты аналитик подкастов"
},
{
"role": "user",
"content": f"""Проанализируй этот транскрипт подкаста:
{text}
Дай:
1. Основные темы
2. Ключевые выводы
3. Интересные моменты
"""
}
]
)
return {
"transcript": text,
"analysis": analysis.choices[0].message.content
}
Лучшие практики
Do's ✅
-
Используйте GPT-4 Vision для сложного анализа изображений
Диаграммы, таблицы, OCR - GPT-4 Vision отлично справляется -
Используйте CLIP для поиска изображений
Бесплатный, быстрый, хороший результат -
Извлекайте ключевые фреймы из видео
Не обрабатывайте все фреймы (дорого) Вместо этого: каждый N-й фрейм -
Используйте Whisper для транскрибирования аудио
Точный, многоязычный, дешевый -
Кэшируйте multimodal embeddings
Embedding часто переиспользуется -
Комбинируйте модальности для лучшего понимания
Текст + изображение > только текст
Don'ts ❌
-
Не обрабатывайте все фреймы видео
30 фреймов × 60 секунд = 1800 вызовов API 😱 Вместо этого: выбирайте ключевые фреймы -
Не игнорируйте качество изображений
Плохое качество → плохой результат -
Не отправляйте огромные изображения
Ресайз перед отправкой (max 1024×1024 обычно) -
Не забывайте про privacy
Изображения отправляются на сервер OpenAI Убедись что нет приватных данных -
Не переплачивайте за vision
Если нужна только классификация: используй cheaper моделей
Чек-лист multimodal
Выбор модели:
☑️ Задача определена (caption, QA, search)
☑️ Модель выбрана (GPT-4V, Gemini, Claude)
☑️ Цена проверена
☑️ Качество протестировано
Подготовка данных:
☑️ Изображения отресайзены
☑️ Аудио в правильном формате
☑️ Видео ключевые фреймы извлечены
☑️ Нет приватных данных
Обработка:
☑️ Batch обработка (если много)
☑️ Кэширование включено
☑️ Error handling настроено
☑️ Rate limiting соблюдается
Оценка:
☑️ Результаты проверены вручную
☑️ Метрики считаются (если возможно)
☑️ A/B тестирование сделано
☑️ Performance оптимизирован
Дата создания: December 2025
Версия: 1.0
Автор: Pavel
Применение: Vision Language Models, Audio Processing, Video Understanding, Cross-modal Retrieval