| عنوان | الرموز التعبيرية | colorfrom | كولورتو | SDK | app_port |
|---|---|---|---|---|---|
yuzumarker.fontDetection | ؟ | أزرق | أصفر | عامل ميناء | 7860 |
أول نموذج التعرف على الخط (الصينية واليابانية والكورية)
يحتوي هذا المستودع أيضًا على بيانات لإنشاء مجموعة بيانات من صور مشهد مع خطوط مختلفة. يتم إنشاء مجموعة البيانات باستخدام حزمة FONT 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 ، فنحن نوفر أيضًا برنامج STIP 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)على مجموعة البيانات الخاصة بنا ،
| العمود الفقري | البيانات أغسطس | ما قبل | اقتصاص نص Bbox | يحفظ وجه نسبة | الإخراج المعتاد | حجم الإدخال | فرط بارام | دقة | يقترف | مجموعة البيانات | دقة |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Deepfont | ✔* | ✅ | sigmoid | 105x105 | أنا 1 | [لا يمكن أن تتقارب] | 665559f | أنا 5 | bfloat16_3x | ||
| Deepfont | ✔* | ✅ | sigmoid | 105x105 | الرابع 4 | [لا يمكن أن تتقارب] | 665559f | أنا | bfloat16_3x | ||
| RESNET-18 | sigmoid | 512x512 | أنا | 18.58 ٪ | 5C43F60 | أنا | Float32 | ||||
| RESNET-18 | sigmoid | 512x512 | الثاني 2 | 14.39 ٪ | 5A85FD3 | أنا | bfloat16_3x | ||||
| RESNET-18 | تان | 512x512 | الثاني | 16.24 ٪ | FF82FE6 | أنا | bfloat16_3x | ||||
| RESNET-18 | ✅* 8 | تان | 512x512 | الثاني | 27.71 ٪ | A976004 | أنا | bfloat16_3x | |||
| RESNET-18 | ✅* | تان | 512x512 | أنا | 29.95 ٪ | 8364103 | أنا | bfloat16_3x | |||
| RESNET-18 | ✅* | sigmoid | 512x512 | أنا | 29.37 ٪ [المحطة المبكرة] | 8d2e833 | أنا | bfloat16_3x | |||
| RESNET-18 | ✅* | sigmoid | 416x416 | أنا | [الاتجاه السفلي] | D5A3215 | أنا | bfloat16_3x | |||
| RESNET-18 | ✅* | sigmoid | 320 × 320 | أنا | [الاتجاه السفلي] | AFCDD80 | أنا | bfloat16_3x | |||
| RESNET-18 | ✅* | sigmoid | 224x224 | أنا | [الاتجاه السفلي] | 8B9DE80 | أنا | bfloat16_3x | |||
| Resnet-34 | ✅* | sigmoid | 512x512 | أنا | 32.03 ٪ | 912d566 | أنا | bfloat16_3x | |||
| RESNET-50 | ✅* | sigmoid | 512x512 | أنا | 34.21 ٪ | E980B66 | أنا | bfloat16_3x | |||
| RESNET-18 | ✅* | ✅ | sigmoid | 512x512 | أنا | 31.24 ٪ | 416C7BB | أنا | bfloat16_3x | ||
| RESNET-18 | ✅* | ✅ | ✅ | sigmoid | 512x512 | أنا | 34.69 ٪ | 855E240 | أنا | bfloat16_3x | |
| RESNET-18 | ✔* 9 | ✅ | ✅ | sigmoid | 512x512 | أنا | 38.32 ٪ | 1750035 | أنا | bfloat16_3x | |
| RESNET-18 | ✔* | ✅ | ✅ | sigmoid | 512x512 | الثالث 3 | 38.87 ٪ | 0693434 | أنا | bfloat16_3x | |
| RESNET-50 | ✔* | ✅ | ✅ | sigmoid | 512x512 | ثالثا | 48.99 ٪ | BC0F7FC | الثاني 6 | bfloat16_3x | |
| RESNET-50 | ✔ | ✅ | ✅ | sigmoid | 512x512 | ثالثا | 48.45 ٪ | 0F071A5 | الثاني | bfloat16_3x | |
| RESNET-50 | ✔ | ✅ | ✅ | ✅ 11 | sigmoid | 512x512 | ثالثا | 46.12 ٪ | 0F071A5 | الثاني | Bfloat16 |
| RESNET-50 | ❕ 10 | ✅ | ✅ | sigmoid | 512x512 | ثالثا | 43.86 ٪ | 0F071A5 | الثاني | Bfloat16 | |
| RESNET-50 | ❕ | ✅ | ✅ | ✅ | sigmoid | 512x512 | ثالثا | 41.35 ٪ | 0F071A5 | الثاني | 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يتم نشر المشروع أيضًا على مساحة Huggingface: 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}
}