В эпоху, когда искусственный интеллект перестал быть просто генератором текста, а научился «видеть» мир, критически важно понимать, насколько глубоко модели понимают визуальную информацию. Простого распознавания объектов уже недостаточно. Современные системы должны уметь читать мелкий текст на изображении, считать предметы в сложных сценариях, понимать пространственные отношения и, что самое важное, не галлюцинировать там, где фактов нет. Именно для решения этих задач команда Moonshot AI представила PerceptionBench — комплексный бенчмарк, который измеряет тонкие способности визуального восприятия.
В этой статье мы не просто поверхностно рассмотрим этот инструмент. Мы разберем полный конвейер оценки (evaluation workflow) шаг за шагом. Вы узнаете, как настроить среду, загрузить сбалансированные данные, обработать изображения, запустить модели через API или локально, а также как интерпретировать результаты. Это руководство предназначено для исследователей, инженеров ML и энтузиастов, которые хотят перейти от простого использования LLM к глубокому анализу их мультимодальных способностей.
01Что такое PerceptionBench и почему он важен?
PerceptionBench — это не просто набор картинок с вопросами. Это структурированный датасет, разработанный для измерения fine-grained visual perception (тонкозернистого визуального восприятия). В отличие от старых бенчмарков, которые часто сводились к «что изображено на картинке», PerceptionBench разбивает визуальное понимание на десять атомарных способностей (atomic capabilities). Это позволяет точно определить, где модель сильна, а где она слаба.
Ключевые задачи, которые оценивает бенчмарк:

- OCR (Optical Character Recognition): Чтение текста с изображений, включая рукописный или искаженный шрифт.
- Counting (Счет): Подсчет объектов, особенно когда они перекрыты или находятся в группе.
- Localization (Локализация): Определение точного расположения объекта относительно других.
- Contextual Reasoning (Контекстуальные рассуждения): Понимание сцены в целом, а не отдельных элементов.
- Comparison (Сравнение): Анализ различий и сходств между несколькими изображениями.
- Depth Understanding (Понимание глубины): Оценка 3D-структуры сцены по 2D-изображениям.
- Hallucination Detection (Обнаружение галлюцинаций): Проверка того, не придумывает ли модель несуществующие детали.
Этот подход позволяет получить не просто одну оценку «точность», а профиль способностей модели. Например, модель может отлично читать текст, но проваливать задачи на подсчет. Без такой детализации мы бы упускали критические недостатки.
02Настройка окружения и загрузка данных
Первый шаг в работе с PerceptionBench — это настройка среды. Поскольку бенчмарк размещен на Hugging Face, основным инструментом для взаимодействия с ним является библиотека datasets. Однако, из-за большого объема данных, простой загрузки может быть недостаточно. Мы используем стратегию многоэтапной загрузки, которая начинается с потоковой передачи (streaming) и переходит к полной загрузке только при необходимости.

Ключевым компонентом является функция _iter_rows. Она реализует «умную» загрузку:
- Parquet Streaming: Сначала скрипт пытается получить доступ к конвертированным файлам Parquet через Hugging Face Hub API. Это самый быстрый способ, так как позволяет читать данные частями, не скачивая весь датасет в память.
- Original Data Streaming: Если Parquet недоступен, скрипт пытается потоково загружать оригинальные файлы данных.
- Full Download: В крайнем случае, если потоковая передача невозможна, выполняется полная загрузка датасета.
Для экономии ресурсов и ускорения разработки мы не используем весь датасет целиком. Вместо этого мы создаем сбалансированную подвыборку. Функция stratified_subset сканирует данные и собирает примеры в «ведра» (buckets) по категориям ошибок (error_category). Мы берем фиксированное количество примеров (например, 12) из каждой из 10 категорий. Это гарантирует, что наша тестовая выборка репрезентативна для всего датасета, но занимает в памяти значительно меньше места.
import os
import sys
import io
import re
import json
import time
import math
import base64
import random
import hashlib
import subprocess
import warnings
from collections import Counter, defaultdict
from concurrent.futures import ThreadPoolExecutor, as_completed
warnings.filterwarnings("ignore")
CFG = dict(
REPO="moonshotai/PerceptionBench",
SPLIT="train",
N_PER_CATEGORY=12,
MAX_SCAN=1200,
SEED=42,
LOAD_MODE="stream",
BACKEND="blind",
API_BASE=os.environ.get("PB_API_BASE", "https://api.openai.com/v1"),
API_KEY=os.environ.get("PB_API_KEY", ""),
API_MODEL=os.environ.get("PB_API_MODEL", "gpt-4o-mini"),
API_WORKERS=4,
API_MAX_TOKENS=512,
LOCAL_MODEL="HuggingFaceTB/SmolVLM2-2.2B-Instruct",
LOCAL_MAX_NEW=128,
MAX_IMAGE_SIDE=1024,
JPEG_QUALITY=90,
JUDGE="rule",
NUM_REL_TOL=0.0,
OUT_DIR="/content/perceptionbench_out" if os.path.isdir("/content") else "./perceptionbench_out"
)
if os.path.isdir("/content"):
pass # Colab environment
else:
pass # Local environment
INSTALL_DEPS = Tru
Источник: MarkTechPost ↗
