ИИ видит, но не понимает. Пока
Вы когда-нибудь смотрели, как нейросеть "смотрит" на изображение? Она видит пиксели, паттерны, градиенты. Но понимает ли она, что это стул рядом с окном, а за окном дождь? Обычно нет. Большинство мультимодальных моделей работают как зрительная кора без префронтальной коры — распознают, но не рассуждают.
В апреле 2026 года DeepSeek выпустила фреймворк, который пытается закрыть эту дыру. Называется он Thinking-with-Visual-Primitives (давайте сократим до TVP, чтобы не сломать язык). Это не очередная модель, а целый пайплайн для превращения сырых картинок в структурированные логические цепочки. По сути — конструктор для визуального рассуждения.
⚠️ Важно: TVP — open-source, распространяется под лицензией MIT. Код лежит на GitHub, веса предобученных моделей доступны через Hugging Face. Никаких скрытых API или платных подписок.
Что за зверь — Visual Primitives?
Идея простая до безобразия: вместо того чтобы скормить нейросети сырую матрицу пикселей (512x512x3 — привет, 786 тысяч чисел), мы разбиваем изображение на семантические примитивы. Это не просто патчи, как в ViT, а осмысленные блоки: объекты, их части, отношения между ними, текстуры, формы, контуры.
Например, на фотографии тарелки с яблоком TVP выделит: apple_ellipse, plate_circle, apple_red_gradient, shadow_under_apple, table_wood_texture. Каждый примитив — это маленький графовый узел с атрибутами (цвет, положение, размер). И дальше фреймворк строит из них граф сцены, по которому уже можно рассуждать логически.
Звучит как магия? На самом деле — это элегантная компиляция идей из scene graph generation и neuro-symbolic reasoning. DeepSeek взяла лучшее из обоих миров и засунула в унифицированный пайплайн.
Как это работает? (очень краткий ликбез)
Пайплайн состоит из трёх этапов:
- Extractor — нейросетка (на основе EfficientNetV2 или ConvNeXt, выбор за вами) вытаскивает сырые признаки. Но не просто features, а карты семантических примитивов — специально обученный детектор-декодер.
- Structural Encoder — превращает эти карты в граф: узлы — примитивы, рёбра — пространственные или функциональные связи (выше, ниже, внутри, поддерживает).
- Reasoning Engine — скармливает граф в трансформер + графовая нейросеть (GNN), которая уже делает выводы. Например, отвечает на вопрос: "Поместится ли это яблоко в ту коробку?"
В теории эта схема позволяет модели не просто угадывать ответ по статистическим паттернам, а реально "думать" о пространстве, физике, логике. На практике — да, работает лучше, чем чистый трансформер для задач типа VL-Checklist, CLEVR, GQA.
Кстати, если вам интересно, как другие фреймворки решают похожие задачи — почитайте про DeepEyesV2, где используется аудиовизуальное внимание. Или про PEVA, который предсказывает следующий кадр через взгляд человека.
Сравнение с альтернативами: кто кого?
| Фреймворк / Модель | Подход | Поддерживает reasoning? | Графовая структура | Open-source? |
|---|---|---|---|---|
| DeepSeek TVP | Примитивы + граф | Да (explicit) | Да, Scene Graph | Да (MIT) |
| CLIP + LLM (обычный пайплайн) | Векторные эмбеддинги | Нет (только ассоциации) | Нет | Да |
| ViT + GPT-4V | Патчи + трансформер | Среднее (implicit) | Нет | Нет (закрытые) |
| OFA / Unified-IO | Seq2Seq | Слабое | Нет | Да |
| Scene Graph Benchmark (SGB) | Статический граф | Только генерация графа | Да | Да |
TVP выигрывает за счёт того, что не просто генерирует граф сцены, а сразу встраивает его в reasoning-трансформер. SGB, например, делает только граф, а дальше вы сами крутитесь. CLIP+LLM — вообще чёрный ящик. Единственный минус TVP — относительная тяжеловесность: extractor + encoder + GNN требуют приличной памяти. На RTX 4090 простые картинки летают, но для видео нужно оптимизировать.
Руки в код: быстрый старт
Установка — пара команд:
pip install deepseek-tvp
# или из сорцов:
git clone https://github.com/deepseek-ai/tvp.git && cd tvp && pip install -e .
Теперь самое вкусное — минимальный пример. Допустим, у вас есть картинка с яблоком на столе и чашкой рядом. Хотите спросить: "Что находится слева от яблока?"
from deepseek_tvp import TVPVisualThinker
thinker = TVPVisualThinker(pretrained="deepseek/tvp-small")
scene_graph = thinker.extract("table.jpg")
# Задаём вопрос в виде примитивов (или natural language)
answer = thinker.reason(scene_graph, query="object_left_of(apple)")
print(answer) # {'cup': 0.92}
Фреймворк поддерживает и NL-вопросы через легковесный LLM-мостик (встроенный dipperLM). Но честно — с NL он пока туповат, если вопрос сложнее "что где?"
Лучше использовать встроенный DSL на основе примитивов — он и быстрее, и точнее.
💡 Совет: для продакшена используйте TVP как препроцессор для LLM. Извлекли граф -> сериализовали в JSON -> скормили GPT-4o или DeepSeek-R1 для генерации текста. Так вы снижаете галлюцинации, потому что модель не гадает, что на картинке, а читает структурированные данные.
Кому это реально нужно?
Давайте без дипломатии. TVP — не игрушка для запуска в одну строку. Он требует понимания графов, аугментаций, настройки детектора примитивов. Но если вы:
- Исследователь в области multimodal reasoning — это best-practice реализация SOTA подхода на начало 2026. Сравнивать свои эксперименты удобно.
- Разработчик AI-агентов для роботов — граф сцены из TVP можно напрямую скормить планировщику движений. Тот самый Screen Vision для UI — частный случай, а TVP для физического мира.
- Создаете образовательные или диагностические системы — например, проверка чертежей, медицинских снимков с объяснением, почему вердикт такой.
- Просто фанат DeepSeek — после загадочных утечек model1 TVP выглядит логичным дополнением: текст+видео+reasoning.
Если же вы хотите просто распознать котика на фото — возьмите любой классификатор. TVP тут — из пушки по воробьям.
Не верьте цифрам, пока не попробуете
В бенчмарках TVP набирает 88.7% на CLEVR (против 72% у базового ViT-L+GPT-4V) и 76.3% на VL-Checklist-hard. Звучит круто. Но на практике я заметил: если на картинке есть тени, блики или странный ракурс — extractor иногда теряет объекты. Дурацкая ситуация: яблоко на белом фоне с бликом — примитив "apple" не выделился, потому что декодер посчитал его частью фона. Пришлось подкручивать threshold.
Ещё нюанс: TVP пока плохо дружит с динамическими сценами (видео). Для каждого кадра нужно запускать extractor заново — это O(n) по времени. DeepSeek обещает в следующем релизе временной encoder, но пока приходится костылить через Edit Mind для выделения ключевых кадров.