Перейти к содержанию
Публикация AiManual

BLIP-2: архитектура, принципы работы и практическое применение для zero-shot генерации текста по изображениям

Разбираем BLIP-2 от Salesforce Research: как Q-Former соединяет замороженные ViT и языковую модель, снижая затраты на обучение. Практические примеры в Hugging F

Коротко

Что будет в материале

  1. 01

    Введение: что такое BLIP-2 и зачем он нужен

  2. 02

    Архитектура BLIP-2: соединение замороженных компонентов через Q-Former

  3. 03

    Предобучение Q-Former: двухэтапный процесс с тремя потерями

  4. 04

    Практическое применение BLIP-2 в Hugging Face Transformers

BLIP-2 от Salesforce Research решает задачу image-to-text без дообучения на конкретных парах изображение-текст. Модель принимает картинку и возвращает описание, ответ на вопрос или текст по промпту. Ключевое новшество - Querying Transformer (Q-Former), который соединяет замороженные визуальный энкодер и языковую модель через лёгкий обучаемый модуль. Это снижает вычислительные затраты по сравнению с полным end-to-end претрейнингом и позволяет достигать SOTA-результатов при малом числе обучаемых параметров.

Практическая ценность BLIP-2 - быстрый старт без дорогостоящего обучения. Вы загружаете готовый чекпоинт из Hugging Face Transformers и сразу генерируете подписи, отвечаете на визуальные вопросы или строите чат-интерфейс с накоплением контекста. Ограничение контекста в 512 токенов нужно учитывать при проектировании диалоговых систем, но для большинства задач генерации описаний этого достаточно.

Введение: что такое BLIP-2 и зачем он нужен

BLIP-2 - это модель для zero-shot генерации текста по изображениям. Она не требует предварительного обучения на целевых парах изображение-текст. Вместо этого используется комбинация двух замороженных предобученных компонентов: визуального энкодера ViT и языковой модели OPT или Flan T5. Между ними стоит обучаемый Q-Former, который преобразует визуальные признаки в последовательность эмбеддингов, понятную языковой модели.

Зачем это нужно. Полный end-to-end претрейнинг мультимодальных моделей требует огромных вычислительных ресурсов. BLIP-2 обходит эту проблему: визуальный энкодер и языковая модель уже обучены, остаётся обучить только Q-Former с относительно небольшим числом параметров. В оригинальной статье показано, что BLIP-2 с 188 млн обучаемых параметров Q-Former превосходит модели с миллиардами параметров, обученные end-to-end, на задачах zero-shot image captioning и VQA.

Пример задачи: подали изображение собаки на траве. Модель возвращает «a dog sitting on the grass». Без файнтюнинга, без дополнительных данных, сразу после загрузки чекпоинта.

Архитектура BLIP-2: соединение замороженных компонентов через Q-Former

Архитектура BLIP-2 состоит из трёх частей: замороженный визуальный энкодер, обучаемый Q-Former и замороженная языковая модель. Визуальный энкодер извлекает признаки из изображения. Q-Former преобразует эти признаки в ограниченный набор эмбеддингов. Языковая модель принимает эти эмбеддинги как префикс и генерирует текст.

Заморозка компонентов - принципиальное решение. Визуальный энкодер и языковая модель не обновляются во время обучения BLIP-2. Это сохраняет их сильные предобученные представления и резко снижает затраты на обучение. Обучается только Q-Former, который действует как адаптер между двумя модальностями.

Роль Q-Former: обучаемый модуль между зрением и языком

Q-Former - это трансформер, который обучается извлекать из визуальных признаков наиболее релевантную информацию для языковой модели. Он использует набор обучаемых query-векторов. Эти векторы взаимодействуют с визуальными признаками через cross-attention. На выходе Q-Former выдаёт последовательность эмбеддингов, которая подаётся в языковую модель.

Почему такой подход эффективен. Языковая модель получает сжатое представление изображения, а не сырые визуальные признаки. Это решает проблему выравнивания пространств: визуальные эмбеддинги ViT и текстовые эмбеддинги языковой модели живут в разных пространствах. Q-Former учится строить мост между ними, не требуя менять сами модели. Число query-векторов в оригинальной статье - 32. Это значит, что изображение сжимается до 32 эмбеддингов, которые языковая модель обрабатывает как префикс.

Q-Former содержит две трансформерные подсети, которые делят self-attention слои: одна работает с query-векторами, другая с текстовыми токенами. Это позволяет на этапе предобучения одновременно обучать выравнивание изображения и текста и генерацию текста.

Выбор визуального энкодера и языковой модели

BLIP-2 поддерживает разные визуальные энкодеры и языковые модели. В оригинальной статье использовались ViT-L/14 и ViT-g/14 от CLIP, а также OPT-2.7B, OPT-6.7B, Flan T5-XL и Flan T5-XXL. Выбор компонентов влияет на производительность и вычислительные требования.

ViT-g/14 даёт более качественные визуальные признаки, чем ViT-L/14, но требует больше памяти. Flan T5 обычно показывает лучшие результаты на генеративных задачах, чем OPT того же размера, потому что Flan T5 обучен на инструкциях. OPT-2.7B работает быстрее и требует меньше VRAM, чем Flan T5-XL, но уступает в точности.

Для быстрого прототипирования подойдёт blip2-opt-2.7b. Для задач, где важна точность ответов, лучше взять blip2-flan-t5-xl или blip2-flan-t5-xxl. Выбор зависит от доступного железа и требований к качеству.

Предобучение Q-Former: двухэтапный процесс с тремя потерями

Q-Former обучается в два этапа. На первом этапе он учится выравнивать визуальные и текстовые представления, используя замороженный визуальный энкодер. На втором этапе Q-Former подключается к замороженной языковой модели и обучается генерировать текст на основе изображения. Используются три функции потерь: image-text contrastive (ITC), image-grounded text generation (ITG) и image-text matching (ITM).

Первый этап: обучение выравниванию изображения и текста

На первом этапе Q-Former обучается с замороженным визуальным энкодером и текстовым энкодером. Используются потери ITC и ITM. ITC максимизирует сходство между query-векторами и текстовыми эмбеддингами для соответствующих пар изображение-текст. Это контрастивная потеря: положительные пары притягиваются, отрицательные отталкиваются. ITM - бинарная классификация, определяющая, соответствует ли текст изображению. Модель получает пару изображение-текст и должна решить, релевантна ли она.

Эти две потери учат Q-Former извлекать семантически значимую информацию из изображения. После первого этапа query-векторы содержат представление, которое коррелирует с текстовым описанием изображения.

Второй этап: подключение языковой модели и генерация текста

На втором этапе Q-Former соединяется с замороженной языковой моделью. Выход Q-Former подаётся как префикс к текстовым токенам. Используется потеря ITG: модель обучается генерировать текст, соответствующий изображению. Языковая модель остаётся замороженной, обновляются только параметры Q-Former.

Такой подход позволяет модели научиться генерировать описания, отвечать на вопросы и выполнять другие текстовые задачи, обусловленные изображением. Языковая модель не меняется, поэтому сохраняет все свои генеративные способности, а Q-Former учится подавать ей правильный визуальный контекст.

Практическое применение BLIP-2 в Hugging Face Transformers

Hugging Face Transformers предоставляет готовую интеграцию BLIP-2. Достаточно установить библиотеку и загрузить модель с процессором. Ниже - четыре сценария использования с кодом.

Установка и загрузка модели

Установите transformers и загрузите модель:

pip install transformers accelerate pillow
from transformers import Blip2Processor, Blip2ForConditionalGeneration
import torch

processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained(
    "Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16
).to("cuda")

Доступные чекпоинты на Hugging Face Hub: blip2-opt-2.7b, blip2-opt-6.7b, blip2-flan-t5-xl, blip2-flan-t5-xxl. Для CPU можно использовать float32, но инференс будет медленным.

Сценарий 1: Генерация подписей к изображениям

Базовый пример - генерация подписи:

from PIL import Image

image = Image.open("dog.jpg")
inputs = processor(image, return_tensors="pt").to("cuda", torch.float16)
generated_ids = model.generate(**inputs, max_new_tokens=50)
caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(caption)

Параметр max_new_tokens ограничивает длину генерируемого текста. Для коротких подписей хватит 30-50 токенов. Для более длинных описаний увеличьте до 100.

Сценарий 2: Генерация с текстовым промптом

Промпт управляет стилем или содержанием генерации:

prompt = "a photo of"
inputs = processor(image, text=prompt, return_tensors="pt").to("cuda", torch.float16)
generated_ids = model.generate(**inputs, max_new_tokens=50)
result = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(result)

Промпт «a photo of» даёт нейтральное описание. Промпт «a painting of» смещает генерацию в сторону художественного описания. Промпт «question: what is the color of the car? answer:» переключает модель в режим ответа на вопрос.

Сценарий 3: Ответы на визуальные вопросы (VQA)

Для VQA используйте промпт с вопросом:

prompt = "Question: What is the color of the car? Answer:"
inputs = processor(image, text=prompt, return_tensors="pt").to("cuda", torch.float16)
generated_ids = model.generate(**inputs, max_new_tokens=20)
answer = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(answer)

Модель возвращает короткий ответ, например «red». Качество зависит от чекпоинта: Flan T5 версии обычно точнее на VQA, чем OPT версии.

Сценарий 4: Чат-подобный интерфейс с накоплением контекста

Для диалога нужно поддерживать историю. Передавайте предыдущие вопросы и ответы в промпт:

history = ""
while True:
    question = input("Вопрос: ")
    prompt = f"{history}Question: {question} Answer:"
    inputs = processor(image, text=prompt, return_tensors="pt").to("cuda", torch.float16)
    generated_ids = model.generate(**inputs, max_new_tokens=50)
    answer = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(answer)
    history += f"Question: {question} Answer: {answer} "

Ограничение контекста в 512 токенов включает визуальные токены от Q-Former и текстовые токены. При длинной истории старые записи нужно обрезать или суммаризировать.

Ограничения BLIP-2 и рекомендации по выбору чекпоинтов

BLIP-2 не лишён недостатков. Главное ограничение - лимит контекста в 512 токенов. Модель может галлюцинировать или давать неточные ответы на сложные вопросы. Для русского языка требуется дополнительное тестирование, так как модель обучалась в основном на английском.

Лимит контекста в 512 токенов

512 токенов включают визуальные токены от Q-Former и текстовые токены. Это ограничивает длину генерируемого текста и историю диалога. При генерации длинных описаний модель может обрезать вывод. В чат-интерфейсе история растёт быстро, и через несколько вопросов контекст переполняется.

Обходные пути: обрезать историю до последних 2-3 реплик, использовать суммаризацию предыдущего диалога или перезапускать сессию. Для задач, требующих длинного контекста, BLIP-2 не подходит.

Сравнение чекпоинтов и их производительность

ЧекпоинтВизуальный энкодерЯзыковая модельСкоростьТочность
blip2-opt-2.7bViT-L/14OPT-2.7BВысокаяСредняя
blip2-opt-6.7bViT-L/14OPT-6.7BСредняяВыше средней
blip2-flan-t5-xlViT-L/14Flan T5-XLСредняяВысокая
blip2-flan-t5-xxlViT-g/14Flan T5-XXLНизкаяМаксимальная

Для задач, требующих точности, используйте модели с Flan T5-XL или Flan T5-XXL. Для скорости - blip2-opt-2.7b. В оригинальной статье BLIP-2 с Flan T5-XXL показал лучшие результаты на zero-shot VQA и image captioning, но требует значительных ресурсов GPU.

Заключение: когда стоит использовать BLIP-2

BLIP-2 подходит для задач, где нужно быстро получить генерацию текста по изображению без дорогостоящего обучения. Zero-shot способности позволяют запустить модель сразу после загрузки чекпоинта. Простота интеграции с Hugging Face Transformers снижает порог входа.

Для более точных или специализированных задач может потребоваться файнтюнинг или другие модели. Если вам нужен анализ производительности современных языковых моделей, посмотрите разбор DeepSeek V4 Flash. Для понимания методов декодирования при генерации текста полезна статья о ChatGPT 5.6. Если интересует обучение языковых моделей с нуля, обратите внимание на архитектуру Silia v2.

BLIP-2 - рабочий инструмент для прототипирования мультимодальных приложений. Он не заменяет специализированные модели, но даёт быстрый старт и понятную архитектуру для дальнейших экспериментов.

Подписаться на канал