| título | emoji | color de color | colorto | sdk | app_port |
|---|---|---|---|---|---|
Yuzumarker.fontdetection | ? | azul | amarillo | estibador | 7860 |
Primer modelo de reconocimiento de fuentes CJK (chino, japonés, coreano)
Este repositorio también contiene datos para generar automáticamente un conjunto de datos de imágenes de texto de escena con diferentes fuentes. El conjunto de datos se genera utilizando el paquete de fuentes CJK por VCB-Studio y miles de imágenes de fondo de Pixiv.net.
Los datos de PIXIV no se compartirán ya que solo se raspa al azar. Puede preparar su propio conjunto de datos de fondo que se ajuste a su distribución de datos como desee.
Para el corpus de texto,
Todo el texto también se mezcla con texto en inglés para simular datos del mundo real.
dataset/fonts .dataset/pixivimages .python dataset_filename_preprocess.pyAhora la preparación está completa. El siguiente comando se puede usar para generar el conjunto de datos:
python font_ds_generate_script.py 1 1Tenga en cuenta que el comando es seguido por dos parámetros. El segundo es dividir la tarea en múltiples particiones, y el primero es el índice de la tarea particionada para ejecutarse. Por ejemplo, si desea ejecutar la tarea en 4 particiones, puede ejecutar los siguientes comandos en paralelo para acelerar el proceso:
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 El conjunto de datos generado se guardará en el directorio dataset/font_img .
Tenga en cuenta que batch_generate_script_cmd_32.bat y batch_generate_script_cmd_64.bat son scripts por lotes para Windows que pueden usarse para generar el conjunto de datos en paralelo con 32 particiones y 64 particiones.
Dado que la tarea puede ser finalizada de manera inesperada o deliberada por el usuario. El script tiene un mecanismo de almacenamiento en caché para evitar volver a generar la misma imagen.
En este caso, es posible que el script no pueda detectar la corrupción en caché (podría ser causado por terminar al escribir a los archivos) durante esta tarea, por lo que también proporcionamos un script que verifica el conjunto de datos generado y elimina las imágenes y etiquetas corruptas.
python font_ds_detect_broken.pyDespués de ejecutar el script, es posible que desee volver a ejecutar el script de generación para llenar los agujeros de los archivos corruptos eliminados.
Si desea ejecutar el script de generación en clusters de Linux, también proporcionamos el script de configuración de entorno linux_venv_setup.sh .
El requisito previo es que tiene un clúster de Linux con python3-venv instalado y python3 está disponible en la ruta.
Para configurar el entorno, ejecute el siguiente comando:
./linux_venv_setup.sh El script creará un entorno virtual en el directorio venv e instalará todos los paquetes requeridos. El script se requiere en la mayoría de los casos, ya que el script también instalará libraqm , que se requiere para la representación de texto de PIL y a menudo no se instala de forma predeterminada en la mayoría de las distribuciones de servidores de Linux.
Una vez configurado el entorno, puede compilar un programador de tareas para implementar la tarea de generación en paralelo.
La idea principal es similar al uso directo del script, excepto que aquí aceptamos tres parámetros,
TOTAL_MISSION : el número total de particiones de la tareaMIN_MISSION : el índice de partición mínima de la tarea para ejecutarMAX_MISSION : el índice de partición máxima de la tarea para ejecutary el comando de compilación es el siguiente:
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 > .outPor ejemplo, si desea ejecutar la tarea en 64 particiones y desea acelerar el trabajo en 4 máquinas, puede compilar el siguiente comando en cada máquina:
# 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.outLuego puede ejecutar el archivo de objeto compilado en cada máquina para iniciar la tarea de generación.
./mission-1-16.out # Machine 1
./mission-17-32.out # Machine 2
./mission-33-48.out # Machine 3
./mission-49-64.out # Machine 4También hay otro script de ayuda para verificar el progreso de la tarea de generación. Se puede usar como lo siguiente:
python font_ds_stat.pyLa generación está unida a CPU, y la velocidad de generación depende en gran medida del rendimiento de la CPU. De hecho, el trabajo en sí es un problema de ingeniería.
Algunas fuentes son problemáticas durante el proceso de generación. El script tiene una lista de exclusión manual en config/fonts.yml y también admite la detección de fuentes no calificadas en la mosca. El script se omitirá automáticamente las fuentes problemáticas y las registrará para una futura capacitación en modelos.
Tenga el conjunto de datos listo en el directorio dataset , puede comenzar a capacitar el modelo. Tenga en cuenta que puede tener más de una carpeta de conjunto de datos, y el script los fusionará automáticamente siempre que proporcione la ruta a la carpeta por argumentos de línea de comando.
$ 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)En nuestro conjunto de datos sintetizado,
| Columna vertebral | Data agosto | Previamente | Cultivo Texto Bbox | Preservar Aspecto Relación | Producción Norma | Tamaño de entrada | Hiper Parámetro | Precursor | Comprometerse | Conjunto de datos | Precisión |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Profundo | ✔️* | ✅ | Sigmoideo | 105x105 | I 1 | [No se puede converger] | 665559f | I 5 | bfloat16_3x | ||
| Profundo | ✔️* | ✅ | Sigmoideo | 105x105 | IV 4 | [No se puede converger] | 665559f | I | bfloat16_3x | ||
| Resnet-18 | Sigmoideo | 512x512 | I | 18.58% | 5C43F60 | I | flotante32 | ||||
| Resnet-18 | Sigmoideo | 512x512 | II 2 | 14.39% | 5A85FD3 | I | bfloat16_3x | ||||
| Resnet-18 | Tanh | 512x512 | II | 16.24% | FF82FE6 | I | bfloat16_3x | ||||
| Resnet-18 | ✅* 8 | Tanh | 512x512 | II | 27.71% | A976004 | I | bfloat16_3x | |||
| Resnet-18 | ✅* | Tanh | 512x512 | I | 29.95% | 8364103 | I | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoideo | 512x512 | I | 29.37% [parada temprana] | 8D2E833 | I | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoideo | 416x416 | I | [Tendencia inferior] | D5A3215 | I | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoideo | 320x320 | I | [Tendencia inferior] | AFCDD80 | I | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmoideo | 224x224 | I | [Tendencia inferior] | 8B9DE80 | I | bfloat16_3x | |||
| Resnet-34 | ✅* | Sigmoideo | 512x512 | I | 32.03% | 912d566 | I | bfloat16_3x | |||
| Resnet-50 | ✅* | Sigmoideo | 512x512 | I | 34.21% | E980B66 | I | bfloat16_3x | |||
| Resnet-18 | ✅* | ✅ | Sigmoideo | 512x512 | I | 31.24% | 416c7bb | I | bfloat16_3x | ||
| Resnet-18 | ✅* | ✅ | ✅ | Sigmoideo | 512x512 | I | 34.69% | 855E240 | I | bfloat16_3x | |
| Resnet-18 | ✔️* 9 | ✅ | ✅ | Sigmoideo | 512x512 | I | 38.32% | 1750035 | I | bfloat16_3x | |
| Resnet-18 | ✔️* | ✅ | ✅ | Sigmoideo | 512x512 | III 3 | 38.87% | 0693434 | I | bfloat16_3x | |
| Resnet-50 | ✔️* | ✅ | ✅ | Sigmoideo | 512x512 | III | 48.99% | BC0F7FC | II 6 | bfloat16_3x | |
| Resnet-50 | ✔️ | ✅ | ✅ | Sigmoideo | 512x512 | III | 48.45% | 0F071A5 | II | bfloat16_3x | |
| Resnet-50 | ✔️ | ✅ | ✅ | ✅ 11 | Sigmoideo | 512x512 | III | 46.12% | 0F071A5 | II | bfloat16 |
| Resnet-50 | ❕ 10 | ✅ | ✅ | Sigmoideo | 512x512 | III | 43.86% | 0F071A5 | II | bfloat16 | |
| Resnet-50 | ❕ | ✅ | ✅ | ✅ | Sigmoideo | 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)Disponible en: https://huggingface.co/gyrojeff/yuzumarker.fontdetection/tree/main
Tenga en cuenta que, dado que entrené todo en Pytorch 2.0 con torch.compile , si desea usar el modelo de petróleo, necesitaría instalar Pytorch 2.0 y compilarlo con torch.compile como en demo.py
Para implementar la demostración, necesitaría todo el conjunto de datos de fuentes en ./dataset/fonts o un archivo de caché que indica fuentes del modelo llamados font_demo_cache.bin . Esto se lanzará más tarde como recurso.
Para implementar, primero ejecute el siguiente script para generar la imagen de fuentes de demostración (si tiene el conjunto de datos de fuentes):
python generate_font_sample_image.pyLuego ejecute el siguiente script para iniciar el servidor de demostración:
$ 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)Si Docker está disponible en su máquina, puede implementar directamente con Docker como lo hice para Huggingface Space.
Puede seguir el argumento de la línea de comando proporcionado en la última sección para cambiar la última línea del Dockerfile para acomodar sus necesidades.
Construye la imagen Docker:
docker build -t yuzumarker.fontdetection .Ejecute la imagen Docker:
docker run -it -p 7860:7860 yuzumarker.fontdetectionEl proyecto también se implementa en Huggingface Space: https://huggingface.co/spaces/gyrojeff/yuzumarker.fontdetection
Si usa este trabajo, cite de la siguiente manera. Gracias.
@misc{qin2023yuzumarkerfont,
author = {Haoyun Qin},
title = {YuzuMarker.FontDetection},
year = {2023},
url = {https://github.com/JeffersonQin/YuzuMarker.FontDetection},
note = {GitHub repository}
}