| Titel | Emoji | farblich | Colorto | SDK | app_port |
|---|---|---|---|---|---|
Yuzumarker.FontDection | ? | Blau | Gelb | Docker | 7860 |
Erster CJK-Schriftstellungsmodell (Chinesisch, Japanisch, Koreanisch)
Dieses Repository enthält auch Daten zum automatischen Generieren eines Datensatzes mit Szenetextbildern mit unterschiedlichen Schriftarten. Der Datensatz wird mit dem CJK-Schriftart von VCB-Studio und Tausenden von Hintergrundbild von pixiv.net generiert.
Die Pixiv -Daten werden nicht gemeinsam genutzt, da sie nur zufällig abgekratzt sind. Sie können Ihren eigenen Hintergrunddatensatz vorbereiten, der zu Ihrer Datenverteilung passt, wie Sie möchten.
Für den Textkorpus,
Alle Text werden auch mit englischer Text gemischt, um reale Daten zu simulieren.
dataset/fonts .dataset/pixivimages .python dataset_filename_preprocess.pyJetzt ist die Vorbereitung abgeschlossen. Der folgende Befehl kann verwendet werden, um den Datensatz zu generieren:
python font_ds_generate_script.py 1 1Beachten Sie, dass der Befehl zwei Parameter folgt. Die zweite besteht darin, die Aufgabe in mehrere Partitionen aufzuteilen, und der erste ist der Index der verteilten Aufgabe. Wenn Sie beispielsweise die Aufgabe in 4 Partitionen ausführen möchten, können Sie die folgenden Befehle parallel ausführen, um den Vorgang zu beschleunigen:
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 Der generierte Datensatz wird im Verzeichnis dataset/font_img gespeichert.
Beachten Sie, dass batch_generate_script_cmd_32.bat und batch_generate_script_cmd_64.bat Batch -Skripte für Windows verwendet werden können, um den Datensatz parallel zu 32 Partitionen und 64 Partitionen zu generieren.
Da die Aufgabe von dem Benutzer unerwartet oder absichtlich beendet werden kann. Das Skript verfügt über einen Caching-Mechanismus, um das gleiche Bild zu vermeiden.
In diesem Fall kann das Skript möglicherweise nicht in der Lage sein, die Beschädigung im Cache (möglicherweise durch Beenden beim Schreiben in Dateien verursacht werden) während dieser Aufgabe zu erkennen. Daher bieten wir auch ein Skript, das den generierten Datensatz überprüft und die beschädigten Bilder und Beschriftungen entfernen.
python font_ds_detect_broken.pyNach dem Ausführen des Skripts möchten Sie möglicherweise das Generationsskript umgeben, um die Löcher der entfernten beschädigten Dateien zu füllen.
Wenn Sie das Generationskript auf Linux -Clustern ausführen möchten, bieten wir auch das Umgebungs -Setup -Skript linux_venv_setup.sh .
Die Voraussetzung ist, dass Sie einen Linux-Cluster mit python3-venv installiert haben und python3 auf dem Weg erhältlich ist.
Führen Sie den folgenden Befehl aus, um die Umgebung einzurichten:
./linux_venv_setup.sh Das Skript erstellt eine virtuelle Umgebung im venv -Verzeichnis und installiert alle erforderlichen Pakete. Das Skript ist in den meisten Fällen erforderlich, da das Skript auch libraqm installiert, die für die Textrending von PIL erforderlich ist und in den meisten Linux -Serververteilungen häufig nicht standardmäßig installiert wird.
Nachdem die Umgebung eingerichtet ist, können Sie einen Aufgabenplaner für die Bereitstellung von Erzeugungsaufgaben parallel zusammenstellen.
Die Hauptidee ähnelt der direkten Verwendung des Skripts, außer dass wir hier drei Parameter akzeptieren.
TOTAL_MISSION : Die Gesamtzahl der Partitionen der AufgabeMIN_MISSION : Der minimale Partitionsindex der zu ausgeführten AufgabeMAX_MISSION : Der maximale Partitionsindex der zu ausgeführten Aufgabeund der Kompilierungsbefehl lautet wie folgt:
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 > .outWenn Sie beispielsweise die Aufgabe in 64 Partitionen ausführen und die Arbeiten auf 4 Maschinen ausführen möchten, können Sie den folgenden Befehl auf jeder Maschine kompilieren:
# 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.outAnschließend können Sie die kompilierte Objektdatei auf jedem Computer ausführen, um die Erzeugungsaufgabe zu starten.
./mission-1-16.out # Machine 1
./mission-17-32.out # Machine 2
./mission-33-48.out # Machine 3
./mission-49-64.out # Machine 4Es gibt auch ein weiteres Helfer -Skript, um den Fortschritt der Generationsaufgabe zu überprüfen. Es kann wie folgt verwendet werden:
python font_ds_stat.pyDie Erzeugung ist die CPU gebunden und die Erzeugungsgeschwindigkeit hängt stark von der CPU -Leistung ab. In der Tat ist die Arbeit selbst ein technisches Problem.
Einige Schriftarten sind während des Erzeugungsprozesses problematisch. Das Skript verfügt über eine manuelle Ausschlussliste in config/fonts.yml und unterstützt auch die nicht qualifizierte Schrifterkennung im laufenden Fliegen. Das Skript überspringt automatisch die problematischen Schriftarten und protokolliert sie für zukünftiges Modelltraining.
Lassen Sie den Datensatz im dataset vorbereitet. Sie können das Modell mit dem Training beginnen. Beachten Sie, dass Sie mehr als einen Ordner Datensatz haben können und das Skript sie automatisch verschmelzen, solange Sie den Pfad zum Ordner für Befehlszeilenargumente angeben.
$ 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)Auf unserem synthetisierten Datensatz,
| Rückgrat | Daten Aug | Vorbereitet | Ernte Text Bbox | Bewahren Aspekt Verhältnis | Ausgabe Norm | Eingangsgröße | Hyper Param | Accur | Begehen | Datensatz | Präzision |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Deepfont | ✔️* | ✅ | Sigmoid | 105x105 | I 1 | [Kann nicht konvergieren] | 665559f | I 5 | Bfloat16_3x | ||
| Deepfont | ✔️* | ✅ | Sigmoid | 105x105 | IV 4 | [Kann nicht konvergieren] | 665559f | ICH | Bfloat16_3x | ||
| Resnet-18 | Sigmoid | 512x512 | ICH | 18,58% | 5c43f60 | ICH | float32 | ||||
| Resnet-18 | Sigmoid | 512x512 | II 2 | 14,39% | 5a85fd3 | ICH | Bfloat16_3x | ||||
| Resnet-18 | Tanh | 512x512 | Ii | 16,24% | ff82fe6 | ICH | Bfloat16_3x | ||||
| Resnet-18 | ✅* 8 | Tanh | 512x512 | Ii | 27,71% | A976004 | ICH | Bfloat16_3x | |||
| Resnet-18 | ✅* | Tanh | 512x512 | ICH | 29,95% | 8364103 | ICH | Bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoid | 512x512 | ICH | 29,37% [Frühstation] | 8d2e833 | ICH | Bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoid | 416x416 | ICH | [Niedrigerer Trend] | D5A3215 | ICH | Bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoid | 320x320 | ICH | [Niedrigerer Trend] | AFCDD80 | ICH | Bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoid | 224x224 | ICH | [Niedrigerer Trend] | 8b9de80 | ICH | Bfloat16_3x | |||
| Resnet-34 | ✅* | Sigmoid | 512x512 | ICH | 32,03% | 912d566 | ICH | Bfloat16_3x | |||
| Resnet-50 | ✅* | Sigmoid | 512x512 | ICH | 34,21% | E980B66 | ICH | Bfloat16_3x | |||
| Resnet-18 | ✅* | ✅ | Sigmoid | 512x512 | ICH | 31,24% | 416c7bb | ICH | Bfloat16_3x | ||
| Resnet-18 | ✅* | ✅ | ✅ | Sigmoid | 512x512 | ICH | 34,69% | 855e240 | ICH | Bfloat16_3x | |
| Resnet-18 | ✔️* 9 | ✅ | ✅ | Sigmoid | 512x512 | ICH | 38,32% | 1750035 | ICH | Bfloat16_3x | |
| Resnet-18 | ✔️* | ✅ | ✅ | Sigmoid | 512x512 | III 3 | 38,87% | 0693434 | ICH | Bfloat16_3x | |
| Resnet-50 | ✔️* | ✅ | ✅ | Sigmoid | 512x512 | III | 48,99% | BC0F7FC | II 6 | Bfloat16_3x | |
| Resnet-50 | ✔️ | ✅ | ✅ | Sigmoid | 512x512 | III | 48,45% | 0f071a5 | Ii | Bfloat16_3x | |
| Resnet-50 | ✔️ | ✅ | ✅ | ✅ 11 | Sigmoid | 512x512 | III | 46,12% | 0f071a5 | Ii | Bfloat16 |
| Resnet-50 | ❕ 10 | ✅ | ✅ | Sigmoid | 512x512 | III | 43,86% | 0f071a5 | Ii | Bfloat16 | |
| Resnet-50 | ❕ | ✅ | ✅ | ✅ | Sigmoid | 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)Verfügbar unter: https://huggingface.co/gyrojeff/yuzumarker.fontdetction/tree/main
Beachten Sie, dass Sie, da ich alles auf Pytorch 2.0 mit torch.compile trainiert habe. Wenn Sie das vorgezogene Modell verwenden möchten, müssten Sie Pytorch 2.0 installieren und mit torch.compile wie in demo.py kompilieren.
Um die Demo bereitzustellen, benötigen Sie entweder den gesamten Schriftart Datensatz unter ./dataset/fonts oder eine Cache -Datei, die Schriftarten des Modells namens font_demo_cache.bin angibt. Dies wird später als Ressource veröffentlicht.
Führen Sie zum Bereitstellen zunächst das folgende Skript aus, um das Demo -Schriftbild zu generieren (wenn Sie den Datensatz des Schriftarts haben):
python generate_font_sample_image.pyFühren Sie dann das folgende Skript aus, um den Demo -Server zu starten:
$ 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)Wenn Docker auf Ihrem Computer verfügbar ist, können Sie direkt von Docker bereitstellen, wie ich es getan habe, um den Platz zu haben.
Sie können das im letzten Abschnitt angegebene Befehlszeilenargument befolgen, um die letzte Zeile der Dockerfile zu ändern, um Ihre Anforderungen zu erfüllen.
Erstellen Sie das Docker -Bild:
docker build -t yuzumarker.fontdetection .Führen Sie das Docker -Bild aus:
docker run -it -p 7860:7860 yuzumarker.fontdetectionDas Projekt wird auch im Bereich von Huggingface bereitgestellt: https://huggingface.co/spaces/gyrojeff/yuzumarker.fontDection
Wenn Sie diese Arbeit verwenden, zitieren Sie bitte folgende Weise. Danke schön.
@misc{qin2023yuzumarkerfont,
author = {Haoyun Qin},
title = {YuzuMarker.FontDetection},
year = {2023},
url = {https://github.com/JeffersonQin/YuzuMarker.FontDetection},
note = {GitHub repository}
}