U-Net-модель для детерминированного анализа типографики на растровой странице документа.
По изображению страницы строится компактная карта стилей; по bbox фрагментов агрегируются
кегль и начертание (B / I / U).
Модель отвечает на вопрос: какой кегль и начертание у текста в заданной области страницы?
Вход — 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)