| заголовок | эмодзи | Colorprom | колорто | SDK | app_port |
|---|---|---|---|---|---|
Yuzumarker.fontdetection | ? | синий | желтый | докер | 7860 |
Первая в мире модель распознавания шрифтов CJK (китайский, японский, корейский)
Этот репозиторий также содержит данные для автоматического генерации набора данных сцены текстовых изображений с различными шрифтами. Набор данных генерируется с использованием пакета шрифтов CJK от VCB-Studio и тысячи фоновых изображений от pixiv.net.
Данные Pixiv не будут переданы, так как они просто случайным образом скребаются. Вы можете подготовить свой собственный фональный набор данных, который бы соответствовал вашему распределению данных, как вам нравится.
Для текстового корпуса,
Весь текст также смешан с английским текстом для моделирования реальных данных.
dataset/fonts .dataset/pixivimages .python dataset_filename_preprocess.pyТеперь подготовка завершена. Следующая команда может быть использована для генерации набора данных:
python font_ds_generate_script.py 1 1Обратите внимание, что за командой следует два параметра. Второй - разделить задачу на несколько разделов, а первый - это индекс разделенной задачи для выполнения. Например, если вы хотите запустить задачу в 4 разделах, вы можете запустить следующие команды параллельно, чтобы ускорить процесс:
python font_ds_generate_script.py 1 4
python font_ds_generate_script.py 2 4
python font_ds_generate_script.py 3 4
python font_ds_generate_script.py 4 4 Сгенерированный набор данных будет сохранен в каталоге dataset/font_img .
Обратите внимание, что batch_generate_script_cmd_32.bat и batch_generate_script_cmd_64.bat - это пакетные сценарии для окон, которые можно использовать для генерации набора данных параллельно с 32 разделениями и 64 разделами.
Поскольку задача может быть неожиданно или намеренно прекращена пользователем. Сценарий имеет механизм кэширования, чтобы избежать повторного создания того же изображения.
В этом случае сценарий может не иметь возможности обнаружить коррупцию в кэше (может быть вызван заканчивая при записи в файлы) во время этой задачи, поэтому мы также предоставляем скрипт, проверяющий сгенерированный набор данных и удаляем поврежденные изображения и метки.
python font_ds_detect_broken.pyПосле запуска сценария вы, возможно, захотите повторить скрипт генерации, чтобы заполнить отверстия удаленных поврежденных файлов.
Если вы хотите запустить сценарий генерации на кластерах Linux, мы также предоставляем сценарий настройки среды linux_venv_setup.sh .
Предварительным условием является то, что у вас есть кластер Linux с установленным python3-venv , а python3 доступен на пути.
Чтобы настроить среду, запустите следующую команду:
./linux_venv_setup.sh Скрипт создаст виртуальную среду в каталоге venv и установит все необходимые пакеты. Сценарий требуется в большинстве случаев, так как сценарий также будет устанавливать libraqm , который необходим для текстового рендеринга PIL и часто не установлен по умолчанию в большинстве дистрибутивах сервера Linux.
После установки среды вы можете собрать планировщик задач для развертывания задачи генерации параллельно.
Основная идея похожа на прямое использование сценария, за исключением того, что здесь мы принимаем три параметра,
TOTAL_MISSION : общее количество разделов задачиMIN_MISSION : минимальный индекс разделения задачи для запускаMAX_MISSION : максимальный индекс разделения задачи для запускаи команда компиляции следующая:
gcc -D MIN_MISSION= < MIN_MISSION >
-D MAX_MISSION= < MAX_MISSION >
-D TOTAL_MISSION= < TOTAL_MISSION >
batch_generate_script_linux.c
-o < object-file-name > .outНапример, если вы хотите запустить задачу в 64 разделах и хотите пропустить работу на 4 машинах, вы можете собрать следующую команду на каждой машине:
# Machine 1
gcc -D MIN_MISSION=1
-D MAX_MISSION=16
-D TOTAL_MISSION=64
batch_generate_script_linux.c
-o mission-1-16.out
# Machine 2
gcc -D MIN_MISSION=17
-D MAX_MISSION=32
-D TOTAL_MISSION=64
batch_generate_script_linux.c
-o mission-17-32.out
# Machine 3
gcc -D MIN_MISSION=33
-D MAX_MISSION=48
-D TOTAL_MISSION=64
batch_generate_script_linux.c
-o mission-33-48.out
# Machine 4
gcc -D MIN_MISSION=49
-D MAX_MISSION=64
-D TOTAL_MISSION=64
batch_generate_script_linux.c
-o mission-49-64.outЗатем вы можете запустить скомпилированный файл объекта на каждой машине, чтобы запустить задачу генерации.
./mission-1-16.out # Machine 1
./mission-17-32.out # Machine 2
./mission-33-48.out # Machine 3
./mission-49-64.out # Machine 4Существует также еще один вспомогательный сценарий, чтобы проверить выполнение задачи генерации. Его можно использовать следующим образом:
python font_ds_stat.pyГенерация связана с процессором, и скорость генерации сильно зависит от производительности процессора. Действительно сама работа - инженерная проблема.
Некоторые шрифты проблематичны в процессе генерации. Сценарий имеет ручной список исключений в config/fonts.yml , а также поддерживает неквалифицированное обнаружение шрифтов на лету. Сценарий автоматически пропустит проблемные шрифты и регистрирует их для будущего модели.
Подготовьте набор данных в каталоге dataset , вы можете начать обучение модели. Обратите внимание, что у вас может быть более одной папки набора данных, и скрипт автоматически объединяет их, если вы предоставите путь к папке по аргументам командной строки.
$ python train.py -h
usage: train.py [-h] [-d [DEVICES ...]] [-b SINGLE_BATCH_SIZE] [-c CHECKPOINT] [-m {resnet18,resnet34,resnet50,resnet101,deepfont}] [-p] [-i] [-a {v1,v2,v3}]
[-l LR] [-s [DATASETS ...]] [-n MODEL_NAME] [-f] [-z SIZE] [-t {medium,high,heighest}] [-r]
optional arguments:
-h , --help show this help message and exit
-d [DEVICES ...], --devices [DEVICES ...]
GPU devices to use (default: [0])
-b SINGLE_BATCH_SIZE, --single-batch-size SINGLE_BATCH_SIZE
Batch size of single device (default: 64)
-c CHECKPOINT, --checkpoint CHECKPOINT
Trainer checkpoint path (default: None)
-m {resnet18,resnet34,resnet50,resnet101,deepfont}, --model {resnet18,resnet34,resnet50,resnet101,deepfont}
Model to use (default: resnet18)
-p , --pretrained Use pretrained model for ResNet (default: False)
-i, --crop-roi-bbox Crop ROI bounding box (default: False)
-a {v1,v2,v3}, --augmentation {v1,v2,v3}
Augmentation strategy to use (default: None)
-l LR, --lr LR Learning rate (default: 0.0001)
-s [DATASETS ...], --datasets [DATASETS ...]
Datasets paths, seperated by space (default: [ ' ./dataset/font_img ' ])
-n MODEL_NAME, --model-name MODEL_NAME
Model name (default: current tag)
-f , --font-classification-only
Font classification only (default: False)
-z SIZE, --size SIZE Model feature image input size (default: 512)
-t {medium,high,heighest}, --tensor-core {medium,high,heighest}
Tensor core precision (default: high)
-r , --preserve-aspect-ratio-by-random-crop
Preserve aspect ratio (default: False)На нашем синтезированном наборе данных,
| Магистраль | Данные августа | Предварительно | Обрезать Текст Блокнот | Сохранять Аспект Соотношение | Выход Норм | Входной размер | Гипер Парамет | Точный | Совершить | Набор данных | Точность |
|---|---|---|---|---|---|---|---|---|---|---|---|
| DeepFont | ✔* | ✅ | Сигмоид | 105x105 | Я 1 | [Не могу сходиться] | 665559f | Я 5 | bfloat16_3x | ||
| DeepFont | ✔* | ✅ | Сигмоид | 105x105 | IV 4 | [Не могу сходиться] | 665559f | я | bfloat16_3x | ||
| Resnet-18 | Сигмоид | 512x512 | я | 18,58% | 5C43F60 | я | float32 | ||||
| Resnet-18 | Сигмоид | 512x512 | II 2 | 14,39% | 5A85FD3 | я | bfloat16_3x | ||||
| Resnet-18 | Тан | 512x512 | II | 16,24% | FF82FE6 | я | bfloat16_3x | ||||
| Resnet-18 | ✅* 8 | Тан | 512x512 | II | 27,71% | A976004 | я | bfloat16_3x | |||
| Resnet-18 | ✅* | Тан | 512x512 | я | 29,95% | 8364103 | я | bfloat16_3x | |||
| Resnet-18 | ✅* | Сигмоид | 512x512 | я | 29,37% [Ранняя остановка] | 8d2e833 | я | bfloat16_3x | |||
| Resnet-18 | ✅* | Сигмоид | 416x416 | я | [Нижняя тенденция] | D5A3215 | я | bfloat16_3x | |||
| Resnet-18 | ✅* | Сигмоид | 320x320 | я | [Нижняя тенденция] | AFCDD80 | я | bfloat16_3x | |||
| Resnet-18 | ✅* | Сигмоид | 224x224 | я | [Нижняя тенденция] | 8b9de80 | я | bfloat16_3x | |||
| Resnet-34 | ✅* | Сигмоид | 512x512 | я | 32,03% | 912d566 | я | bfloat16_3x | |||
| Resnet-50 | ✅* | Сигмоид | 512x512 | я | 34,21% | E980B66 | я | bfloat16_3x | |||
| Resnet-18 | ✅* | ✅ | Сигмоид | 512x512 | я | 31,24% | 416C7BB | я | bfloat16_3x | ||
| Resnet-18 | ✅* | ✅ | ✅ | Сигмоид | 512x512 | я | 34,69% | 855E240 | я | bfloat16_3x | |
| Resnet-18 | ✔* 9 | ✅ | ✅ | Сигмоид | 512x512 | я | 38,32% | 1750035 | я | bfloat16_3x | |
| Resnet-18 | ✔* | ✅ | ✅ | Сигмоид | 512x512 | III 3 | 38,87% | 0693434 | я | bfloat16_3x | |
| Resnet-50 | ✔* | ✅ | ✅ | Сигмоид | 512x512 | Iii | 48,99% | BC0F7FC | II 6 | bfloat16_3x | |
| Resnet-50 | ✔ | ✅ | ✅ | Сигмоид | 512x512 | Iii | 48,45% | 0F071A5 | II | bfloat16_3x | |
| Resnet-50 | ✔ | ✅ | ✅ | ✅ 11 | Сигмоид | 512x512 | Iii | 46,12% | 0F071A5 | II | Bfloat16 |
| Resnet-50 | ❕ 10 | ✅ | ✅ | Сигмоид | 512x512 | Iii | 43,86% | 0F071A5 | II | Bfloat16 | |
| Resnet-50 | ❕ | ✅ | ✅ | ✅ | Сигмоид | 512x512 | Iii | 41,35% | 0F071A5 | II | Bfloat16 |
learning rate = 0.0001, lambda = (2, 0.5, 1)learning rate = 0.00005, lambda = (4, 0.5, 1)learning rate = 0.001, lambda = (2, 0.5, 1)learning rate = 0.01, lambda = (2, 0.5, 1)Доступно по адресу: https://huggingface.co/gyrojeff/yuzumarker.fontdetection/tree/main
Обратите внимание, что, поскольку я тренировал все на Pytorch 2.0 с torch.compile , если вы хотите использовать предварительную модель, вам нужно установить Pytorch 2.0 и составить ее с torch.compile , как в demo.py
Чтобы развернуть демонстрацию, вам понадобится либо весь набор данных шрифта в разделе ./dataset/fonts , либо файл кэша, указывающий шрифты модели с именем font_demo_cache.bin . Это будет позже выпущено как ресурс.
Для развертывания сначала запустите следующий скрипт для генерации изображения демо -шрифта (если у вас есть набор данных шрифтов):
python generate_font_sample_image.pyЗатем запустите следующий скрипт, чтобы запустить демонстрационный сервер:
$ python demo.py -h
usage: demo.py [-h] [-d DEVICE] [-c CHECKPOINT] [-m {resnet18,resnet34,resnet50,resnet101,deepfont}] [-f] [-z SIZE] [-s] [-p PORT] [-a ADDRESS]
optional arguments:
-h, --help show this help message and exit
-d DEVICE, --device DEVICE
GPU devices to use (default: 0), -1 for CPU
-c CHECKPOINT, --checkpoint CHECKPOINT
Trainer checkpoint path (default: None). Use link as huggingface:// < user > / < repo > / < file > for huggingface.co models, currently only supports model file in the root
directory.
-m {resnet18,resnet34,resnet50,resnet101,deepfont}, --model {resnet18,resnet34,resnet50,resnet101,deepfont}
Model to use (default: resnet18)
-f, --font-classification-only
Font classification only (default: False)
-z SIZE, --size SIZE Model feature image input size (default: 512)
-s, --share Get public link via Gradio (default: False)
-p PORT, --port PORT Port to use for Gradio (default: 7860)
-a ADDRESS, --address ADDRESS
Address to use for Gradio (default: 127.0.0.1)Если Docker доступен на вашей машине, вы можете развернуть прямо от Docker как то, как я это сделал для пространства для HuggingFace.
Вы можете следовать аргументу командной строки, указанного в последнем разделе, чтобы изменить последнюю строку Dockerfile , чтобы удовлетворить ваши потребности.
Создайте изображение Docker:
docker build -t yuzumarker.fontdetection .Запустите изображение Docker:
docker run -it -p 7860:7860 yuzumarker.fontdetectionПроект также развернут в пространстве объятий: https://huggingface.co/spaces/gyrojeff/yuzumarker.fontdetection
Если вы используете эту работу, пожалуйста, укажите следующим образом. Спасибо.
@misc{qin2023yuzumarkerfont,
author = {Haoyun Qin},
title = {YuzuMarker.FontDetection},
year = {2023},
url = {https://github.com/JeffersonQin/YuzuMarker.FontDetection},
note = {GitHub repository}
}