Стилограф (Stylograph)

U-Net-модель для детерминированного анализа типографики на растровой странице документа. По изображению страницы строится компактная карта стилей; по bbox фрагментов агрегируются кегль и начертание (B / I / U).

Репозиторий: TypoExtract.


Назначение

Модель отвечает на вопрос: какой кегль и начертание у текста в заданной области страницы?

Вход — RGB-изображение страницы (PDF → растр).
Выход — маска из 5 каналов с разрешением в s = 4 раза меньше входа.
Координаты bbox задаются в пикселях исходной страницы; агрегация учитывает stride.


Масштабы страницы (критично для качества)

Модель обучалась и рассчитана на фиксированный DPI = 150.
Иной DPI меняет высоту глифов в пикселях и ломает различение кеглей 10 / 12 / 14 пт.

Рекомендуемый рендер PDF

Параметр Значение Пояснение
DPI 150 Единый масштаб для синтеза, обучения и инференса
Цвет RGB Вход H × W × 3
Формат страницы (синтетика) 1240 × 1754 px Эквивалент A4 при 150 DPI
Физический A4 210 × 297 мм 210/25.4×150 ≈ 1240, 297/25.4×150 ≈ 1754
Кратность сторон кратно 64 downsample_factor × 2^depth = 4 × 16 = 64

Формула zoom при рендере PDF (как в viewer):

zoom = dpi / 72 = 150 / 72 ≈ 2.0833

То есть 1 типографский пункт ≈ 150/72 ≈ 2.083 пикселя на странице.

Диапазон размеров на обучении

В конфиге обучения указаны ориентиры:

Параметр Значение
min_side 512 px
max_side 2048 px

Синтетические страницы по умолчанию — 1240 × 1754.
На инференсе допустимы другие размеры страницы (например, не A4), но DPI должен оставаться 150, иначе кегли сместятся.

Выходная маска относительно страницы

Вход (страница) Выход (маска)
Разрешение H × W H/4 × W/4
Stride s 4
Пример A4@150 1240 × 1754 310 × 438

Один пиксель маски соответствует блоку 4×4 пикселя страницы.


Масштабы текста (кегль)

Поддерживаемые кегли

Модель обучалась различать кегли 10, 11, 12, 13, 14 пунктов.

На практике в продуктовом API чаще опираются на дискретизацию к 10 / 12 / 14 пт (основной диапазон оформления), но канал Size непрерывен и кодирует все пять значений.

Перевод пункт → пиксели (при DPI 150)

Формула:

size_px = round(size_pt × dpi / 72)
Кегль, пт Высота глифа ≈, px (150 DPI) Нормализованный канал Size
10 21 0.3
11 23 0.4
12 25 0.5
13 27 0.6
14 29 0.7

Фон / нет текста: Size ≈ 0 (вместе с низким F).

Дискретизация Size → пункты

При агрегации по bbox среднее значение канала Size отображается в пункты по таблице выше (линейная интерполяция между узлами, затем округление для кода стиля).

Примеры кодов стиля: T12, T12-B, T14-IU, T10-BU.

Особенности разметки Size

  • В смешанных заглавных строках (первая буква крупнее, например 14/12, 13/11, 12/10) весь run в GT Size помечен размером первой буквы.
  • Канал Size на обучении — непрерывный target в диапазоне узлов 0.3…0.7, не softmax-классы (классификация кегля — отдельная экспериментальная ветка «Типометр»).

Каналы выхода

Тензор маски: H/s × W/s × 5, s = 4.

# Канал Смысл Диапазон
0 F Наличие шрифта / текста 0…1
1 B Полужирное 0…1
2 I Курсив 0…1
3 U Подчёркивание 0…1
4 Size Кегль (см. таблицу выше) 0…1

Пороги начертания при агрегации (по умолчанию): B/I/U ≥ 0.4.
Текст считается присутствующим при F ≥ 0.05.


Архитектура

Параметр Значение
Тип U-Net
Вход RGB, 3 канала
Выход 5 каналов (F, B, I, U, Size)
base_channels 64
depth 4
downsample_factor 4
Головы отдельно F/B/I/U (sigmoid) и Size (clamp 0…1)

Чекпоинт в этом репозитории: обучение до epoch 70 (checkpoints/best.pt).


Файлы в репозитории

Файл Описание
pytorch_model.pt Чекпоинт PyTorch (state_dict в ключе model + вложенный config)
config.json Краткая сводка архитектуры и size mapping
README.md Эта карточка модели

Загрузка и инференс (TypoExtract)

from huggingface_hub import hf_hub_download
import torch
from typoextract.inference.predict import load_model_from_checkpoint

ckpt = hf_hub_download("ros42/stylograph", "pytorch_model.pt")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model, cfg = load_model_from_checkpoint(ckpt, device)

Рекомендуемый пайплайн:

  1. Отрендерить PDF в PNG при DPI 150 (для A4 получится ~1240×1754).
  2. Прогнать страницу через модель → маска H/4 × W/4 × 5.
  3. По bbox в координатах страницы агрегировать каналы → код стиля (T12-B и т.д.).

HTTP API сервиса Стилографа описан в документации проекта (docs/STYLOGRAPH_API.md).


Ограничения

  • Оптимальный масштаб — только DPI 150; другие DPI не калиброваны.
  • Надёжный диапазон кегля: 10–14 пт; вне диапазона Size экстраполируется грубо.
  • Обучение на синтетике (в т.ч. Times New Roman, русский текст) + вставках размеченных фрагментов.
  • Это не модель из transformers: загрузка через TypoExtract / свой torch.load.

Лицензия

Проприетарная / проектная. Перед распространением вне этого репозитория согласуйте с авторами.

Downloads last month
13
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support