Стилограф (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)
Рекомендуемый пайплайн:
- Отрендерить PDF в PNG при DPI 150 (для A4 получится ~1240×1754).
- Прогнать страницу через модель → маска
H/4 × W/4 × 5. - По 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