| título | Emoji | colorfrom | Colorto | sdk | app_port |
|---|---|---|---|---|---|
Yuzumarker.FontDetecção | ? | azul | amarelo | Docker | 7860 |
Modelo de reconhecimento de fonte CJK (chinês, japonês, coreano)
Esse repositório também contém dados para gerar automaticamente um conjunto de dados de imagens de texto da cena com fontes diferentes. O conjunto de dados é gerado usando o pacote de fontes CJK pelo VCB-Studio e milhares de imagem de fundo do Pixiv.net.
Os dados do PIXIV não serão compartilhados, pois são apenas raspados aleatoriamente. Você pode preparar seu próprio conjunto de dados em segundo plano que se encaixaria na sua distribuição de dados como desejar.
Para o corpus de texto,
Todo o texto também é misturado com texto em inglês para simular dados do mundo real.
dataset/fonts .dataset/pixivimages .python dataset_filename_preprocess.pyAgora a preparação está completa. O comando a seguir pode ser usado para gerar o conjunto de dados:
python font_ds_generate_script.py 1 1Observe que o comando é seguido por dois parâmetros. O segundo é dividir a tarefa em várias partições, e a primeira é o índice da tarefa particionada a ser executada. Por exemplo, se você deseja executar a tarefa em 4 partições, poderá executar os seguintes comandos em paralelo para acelerar o processo:
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 O conjunto de dados gerado será salvo no diretório dataset/font_img .
Observe que batch_generate_script_cmd_32.bat e batch_generate_script_cmd_64.bat são scripts em lote para Windows que podem ser usados para gerar o conjunto de dados em paralelo com 32 partições e 64 partições.
Como a tarefa pode ser encerrada inesperadamente ou deliberadamente pelo usuário. O script possui um mecanismo de armazenamento em cache para evitar a re-geração da mesma imagem.
Nesse caso, o script pode não ser capaz de detectar a corrupção no cache (pode ser causada pelo término ao escrever em arquivos) durante essa tarefa, portanto, também fornecemos um script que verifica o conjunto de dados gerado e removendo as imagens e rótulos corrompidos.
python font_ds_detect_broken.pyDepois de executar o script, você pode executar executar o script de geração para preencher os orifícios dos arquivos corrompidos removidos.
Se você deseja executar o script de geração em clusters Linux, também fornecemos o Script de configuração do ambiente linux_venv_setup.sh .
O pré-requisito é que você tem um cluster Linux com python3-venv instalado e python3 está disponível no caminho.
Para configurar o ambiente, execute o seguinte comando:
./linux_venv_setup.sh O script criará um ambiente virtual no diretório venv e instalará todos os pacotes necessários. O script é necessário na maioria dos casos, pois o script também instalará libraqm necessário para a renderização de texto do PIL e geralmente não é instalado por padrão na maioria das distribuições do servidor Linux.
Após a configuração do ambiente, você pode compilar um agendador de tarefas para implantar a tarefa de geração em paralelo.
A idéia principal é semelhante ao uso direto do script, exceto que aqui aceitamos três parâmetros,
TOTAL_MISSION : o número total de partições da tarefaMIN_MISSION : o índice de partição mínima da tarefa para executarMAX_MISSION : o índice de partição máxima da tarefa para executare o comando de compilação é o seguinte:
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 exemplo, se você deseja executar a tarefa em 64 partições e deseja espalhar o trabalho em 4 máquinas, você pode compilar o seguinte comando em 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.outEm seguida, você pode executar o arquivo de objeto compilado em cada máquina para iniciar a tarefa de geração.
./mission-1-16.out # Machine 1
./mission-17-32.out # Machine 2
./mission-33-48.out # Machine 3
./mission-49-64.out # Machine 4Há também outro script auxiliar para verificar o progresso da tarefa de geração. Pode ser usado como seguinte:
python font_ds_stat.pyA geração é limitada à CPU e a velocidade de geração depende altamente dependente do desempenho da CPU. De fato, o trabalho em si é um problema de engenharia.
Algumas fontes são problemáticas durante o processo de geração. O script possui uma lista de exclusão manual em config/fonts.yml e também suporta detecção de fontes não qualificada em tempo real. O script pulará automaticamente as fontes problemáticas e as registrará para treinamento de modelos futuros.
Tenha o conjunto de dados pronto no diretório dataset , você pode começar a treinar o modelo. Observe que você pode ter mais de uma pasta do conjunto de dados e o script o mesclará automaticamente, desde que você forneça o caminho para a pasta por argumentos da linha 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)Em nosso conjunto de dados sintetizado,
| Espinha dorsal | Dados Aug | Pré -terenciado | Cortar Texto Bbox | Preservar Aspecto Razão | Saída Norma | Tamanho de entrada | Hiper Param | Accur | Comprometer-se | Conjunto de dados | Precisão |
|---|---|---|---|---|---|---|---|---|---|---|---|
| DeepFont | ✔️* | ✅ | Sigmóide | 105x105 | I 1 | [Não posso conversar] | 665559f | I 5 | bfloat16_3x | ||
| DeepFont | ✔️* | ✅ | Sigmóide | 105x105 | Iv 4 | [Não posso conversar] | 665559f | EU | bfloat16_3x | ||
| Resnet-18 | Sigmóide | 512x512 | EU | 18,58% | 5C43F60 | EU | Float32 | ||||
| Resnet-18 | Sigmóide | 512x512 | Ii 2 | 14,39% | 5A85FD3 | EU | bfloat16_3x | ||||
| Resnet-18 | Tanh | 512x512 | Ii | 16,24% | FF82FE6 | EU | bfloat16_3x | ||||
| Resnet-18 | ✅* 8 | Tanh | 512x512 | Ii | 27,71% | A976004 | EU | bfloat16_3x | |||
| Resnet-18 | ✅* | Tanh | 512x512 | EU | 29,95% | 8364103 | EU | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmóide | 512x512 | EU | 29,37% [parada antecipada] | 8D2E833 | EU | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmóide | 416x416 | EU | [Tendência mais baixa] | D5A3215 | EU | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmóide | 320x320 | EU | [Tendência mais baixa] | AFCDD80 | EU | bfloat16_3x | |||
| Resnet-18 | ✅* | Sigmóide | 224x224 | EU | [Tendência mais baixa] | 8b9de80 | EU | bfloat16_3x | |||
| Resnet-34 | ✅* | Sigmóide | 512x512 | EU | 32,03% | 912D566 | EU | bfloat16_3x | |||
| Resnet-50 | ✅* | Sigmóide | 512x512 | EU | 34,21% | E980B66 | EU | bfloat16_3x | |||
| Resnet-18 | ✅* | ✅ | Sigmóide | 512x512 | EU | 31,24% | 416C7BB | EU | bfloat16_3x | ||
| Resnet-18 | ✅* | ✅ | ✅ | Sigmóide | 512x512 | EU | 34,69% | 855E240 | EU | bfloat16_3x | |
| Resnet-18 | ✔️* 9 | ✅ | ✅ | Sigmóide | 512x512 | EU | 38,32% | 1750035 | EU | bfloat16_3x | |
| Resnet-18 | ✔️* | ✅ | ✅ | Sigmóide | 512x512 | Iii 3 | 38,87% | 0693434 | EU | bfloat16_3x | |
| Resnet-50 | ✔️* | ✅ | ✅ | Sigmóide | 512x512 | Iii | 48,99% | BC0F7FC | Ii 6 | bfloat16_3x | |
| Resnet-50 | ✔️ | ✅ | ✅ | Sigmóide | 512x512 | Iii | 48,45% | 0F071A5 | Ii | bfloat16_3x | |
| Resnet-50 | ✔️ | ✅ | ✅ | ✅ 11 | Sigmóide | 512x512 | Iii | 46,12% | 0F071A5 | Ii | BFLOAT16 |
| Resnet-50 | ❕ 10 | ✅ | ✅ | Sigmóide | 512x512 | Iii | 43,86% | 0F071A5 | Ii | BFLOAT16 | |
| Resnet-50 | ❕ | ✅ | ✅ | ✅ | Sigmóide | 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)Disponível em: https://huggingface.co/gyrojeff/yuzumarker.fontdetection/tree/main
Observe que, como eu treinei tudo no pytorch 2.0 com torch.compile , se você quiser usar o modelo pré -treinado, precisará instalar o Pytorch 2.0 e compilá -lo com torch.compile como no demo.py
Para implantar a demonstração, você precisaria de todo o conjunto de dados de fonte em ./dataset/fonts ou um arquivo de cache indicando fontes de modelo chamado font_demo_cache.bin . Isso será lançado posteriormente como recurso.
Para implantar, primeiro execute o script a seguir para gerar a imagem da fonte de demonstração (se você tiver o conjunto de dados das fontes):
python generate_font_sample_image.pyEm seguida, execute o script a seguir para iniciar o servidor de demonstração:
$ 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)Se o Docker estiver disponível em sua máquina, você poderá implantar diretamente pelo Docker como eu fiz o espaço do Hugging Space.
Você pode seguir o argumento da linha de comando fornecido na última seção para alterar a última linha do Dockerfile para acomodar suas necessidades.
Construa a imagem do Docker:
docker build -t yuzumarker.fontdetection .Execute a imagem do Docker:
docker run -it -p 7860:7860 yuzumarker.fontdetectionO projeto também é implantado no Hugging Space: https://huggingface.co/spaces/gyrojeff/yuzumarker.fontdetecção
Se você usar este trabalho, cite da seguinte maneira. Obrigado.
@misc{qin2023yuzumarkerfont,
author = {Haoyun Qin},
title = {YuzuMarker.FontDetection},
year = {2023},
url = {https://github.com/JeffersonQin/YuzuMarker.FontDetection},
note = {GitHub repository}
}