Skip to content

let deep learning model can recognize char from font file

Notifications You must be signed in to change notification settings

Yakuho/ReadItEasy

Repository files navigation

🚀 ReadItEasy 是一个关于识别字体文件的模型,它通过字体文件进行训练(如ttf、wpff格式),在经过有限次试验中,发现试验中的模型是有效的。模型目的是为了将传入的字体文件可自动识别里面的所有字符。

Introduction

为什么训练这个模型?

这个模型是为了解决基于KNN的字体反爬模型所带来的问题而出现的。在使用KNN算法对字体坐标 进行字符分类上,在一些标准的字体文件上其规范的字体设计和变动性不大,在使用欧式距离计算误差值能够去完成分类各个字符的任务。 但深入研究发现,在不同的字体文件中,通常其坐标可能会出现不规则的情况;就好比人写字,同一个字不同的人写的会有不同的书法。对于字体文件来说就是同一个字, 不同的字体文件会有不同的坐标向量组合。这导致计算欧式距离的时候,会出现相位不对齐的情况,导致鲁棒性很差。

这个模型就想要从函数拟合的角度去解决这个问题,提高字体分类的鲁棒性。

Quick Start Example

环境安装

环境: Python>=3.6.0 Tensorflow>=2.0

$ git clone https://github.com/Yakuho/ReadItEasy
$ cd ReadItEasy
$ pip install -r requirements.txt
模型使用 test.py
class Terminal:
    ...

m = Terminal(weights='./weights/MaoYan.h5',             # 模型的训练后权重路径
             class_list='./datasets/labels/classes.txt' # 模型输出后的字符转换清单路径
)
m.predict(font_file='./evaluate/KS01.ttf')              # 传入字体文件路径进行预测
训练自定义的数据
1. 数据准备
  • 准备字体文件如ttf/woff等数几十个;按照分类的数目类,数目依次增加
2. 工具使用
3. 数据集分割
  • 将上面导出的npz文件的路径复制
  • 使用tools/splitdataset.py对数据集进行分割 (注意: 如果数据集里面包含不同类型, 请手动分割)
4. 生成calsses.txt文件
5. 配置文件

config.json 保存模型的相关设置 solver/config.json 保存模型优化器, 损失函数等相关配置

  • config.json必填项

    • datasets -> class_list: 分类标签清单的路径
    • datasets -> train -> path: 训练集目录
    • datasets -> valid -> path: 验证集目录
    • datasets -> valid -> epochs: 训练的轮次
  • config.json选填项

    • model -> restore: 是否继续恢复训练
    • model -> checkpoint: 恢复训练的checkpoint文件路径
    • model -> pre-training: 是否使用预训练权重
    • model -> weights: 预训练权重的路径
    • save -> model_name: 最后保存模型的名字
    • save -> root_path: 保存模型的路径名
    • save -> ckpt_freq: 检查点保存的频率(epoch为基准)
6. 训练
python train.py
...
{'unicode': 'uniE20A', 'char': '4', 'confidences': 0.99496007}
{'unicode': 'uniE2A0', 'char': '7', 'confidences': 0.98925006}
{'unicode': 'uniE3E1', 'char': '2', 'confidences': 0.9963917}
{'unicode': 'uniEC2F', 'char': '6', 'confidences': 0.989242}
{'unicode': 'uniECA9', 'char': '0', 'confidences': 0.99617445}
{'unicode': 'uniEDB6', 'char': '3', 'confidences': 0.74377424}
{'unicode': 'uniF11E', 'char': '8', 'confidences': 0.9967367}
{'unicode': 'uniF439', 'char': '9', 'confidences': 0.99818087}
{'unicode': 'uniF4E1', 'char': '1', 'confidences': 0.9952153}
{'unicode': 'uniF636', 'char': '5', 'confidences': 0.9941585}
{'unicode': 'x', 'char': '.', 'confidences': 0.9882712}
Inference finished cost 50.727ms

最后要注意的是,classes.txt是与模型是配套的,它指定了模型的输出字符的位置!!!若classes.txt文件和当时训练的模型不一致, 会导致模型预测的位置不对

相当与A模型本来把“1”编码为0位置输入,classes.txt文件的0位置也必须是“1”

Experience

以下是经过不同字体文件训练的数据(GPU: GTX1050,CPU: CORE i5):

RIE(ReadItEasy模型) KNN(K临近算法模型)

数据集 字符主要类型 字符数 标准字体 RIE随机准确率 KNN随机准确率 RIE推理速度 KNN推理速度
猫眼电影 纯数字 12 100% 90.9% 46ms 4ms
大众点评 中文字符+数字 603 100% 100% 2000ms 144ms
汽车之家 纯中文字符 39 100% 100% 190ms 9ms

欢迎在issue投稿更多不同的字体文件加入训练,有更多不同的字体更能增强模型的泛化能力,形成一个通用的字体坐标识别模型

尝试训练该模型, 可供训练字体的数据集有 [Google Drive] [百度网盘 提取码: 0x80]

More details

About

let deep learning model can recognize char from font file

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages