zi2zi-chain: 中国书法字体图片生成和字体制作的一站式开发

在zi2zi-pytorch的基础上,做了进一步的修复和完善。本项目github对应网址为https://github.com/not-bald-owl/zi2zi-chain/tree/master

修复部分为:针对预处理部分的函数弃用、生僻字无法生成、训练和推理部分单卡支持改为多卡并行、以及扩展从本地的txt文件进行字体图片生成等功能。

完善部分为:对生成后的字体图片进行了优化,使得生成的图片更加清晰;同时,新增了字体(.ttf或者.otf)制作的功能。

新楷体——楷书-方正多宝塔碑

方正多宝塔碑推理效果如下:
方正多宝塔碑楷体

新楷体——楷书-毛笔书法多宝塔碑

多宝塔碑推理效果如下:
多宝塔碑楷体

新楷体——楷书-柳公权

柳公权-玄秘塔碑推理效果如下:
柳公权玄秘塔碑

新楷体——楷书-赵孟頫三门记

赵孟頫推理效果如下:
赵孟頫三门记楷体

新楷体——楷书-魏碑

魏碑推理效果如下:
魏碑楷体

方正隶书——何绍基隶书

何绍基隶书效果如下:
何绍基隶书

字体图片生成 使用指南

Requirement

安装的库版本如下:

  • Python 3.7
  • CUDA 10.2
  • cudnn 7.6.5
  • pytorch 1.5.1
  • pillow 7.1.2
  • numpy 1.18.1
  • scipy 1.4.1
  • imageio 2.8.0

预处理会生成二进制文件

为了避免I/O瓶颈,在训练过程中,需要对数据进行预处理,将数据转换为二进制格式并持久化到内存中。

第一步:形成配对数据集 font2img.py

模式1 Font2Font

首先从网上下载原字体和目标字体(.ttf或者.otf),然后运行font2img.py(运行以下代码需要将字体文件放置与font2img.py同一目录下),生成配对数据集。

python font2img.py --src_font=src.ttf
                   --dst_font=trg.otf
                   --charset=CN
                   --sample_count=1000
                   --sample_dir=dir
                   --label=0
                   --filter
                   --shuffle
                   --mode=font2font

提供了四种默认字符集:CN(简体中文)、CN_T(繁体中文)、JP(日语)、KR(韩语)。您还可以指定一个单行文件,系统将生成其中字符的图像。

如果您想要使用特定文本(valid.txt)验证网络,请运行以下命令。

python font2img.py --src_font=src.ttf
                   --dst_font=trg.otf
                   --charset=valid.txt
                   --sample_count=len(infer.txt)
                   --sample_dir=dir
                   --label=0
                   --mode=font2font

valid.txt 应该是一个只有一行的文件。

模式2 Font2Imgs

当我们不满足于使用网上字体生成目标字体图片,而是拥有或者制作了自己的目标字体图片时,可以使用模式2。

此时原字体图片还是使用ttf生成,而目标字体图片则使用自己制作的图片(如.png格式)。

注意:目标字体图片的命名格式为 该图片对应的汉字~下面作者字典对应的值.图片格式的后缀名。

如果我们拥有若干张多宝塔碑的图片,图片格式为.gif,则命名为 啊~顏真卿多寶塔體.gif哎~顏真卿多寶塔體.gif皑~顏真卿多寶塔體.gif 等。

对于特定格式的图片,也可以使用我写的data_preprocess.py文件来批量更改图片数据格式。

writer_dict = {
    '智永': 0, ' 隸書-趙之謙': 1, '張即之': 2, '張猛龍碑': 3, '柳公權': 4, '標楷體-手寫': 5, '歐陽詢-九成宮': 6,
    '歐陽詢-皇甫誕': 7, '沈尹默': 8, '美工-崩雲體': 9, '美工-瘦顏體': 10, '虞世南': 11, '行書-傅山': 12, '行書-王壯為': 13,
    '行書-王鐸': 14, '行書-米芾': 15, '行書-趙孟頫': 16, '行書-鄭板橋': 17, '行書-集字聖教序': 18, '褚遂良': 19, '趙之謙': 20,
    '趙孟頫三門記體': 21, '隸書-伊秉綬': 22, '隸書-何紹基': 23, '隸書-鄧石如': 24, '隸書-金農': 25,  '顏真卿-顏勤禮碑': 26,
    '顏真卿多寶塔體': 27, '魏碑': 28
}
python font2img.py --src_font=src.ttf
                   --dst_imgs=target_path
                   --sample_count=1000
                   --sample_dir=dir
                   --mode=font2imgs
模式3 Imgs2Imgs

当原图片和目标图片都不需要从现有的字体生成时,可以使用模式3。此时src_imgs和dst_imgs都需要指定为图片的路径。

操作比较简单,只需要对原图片和目标图片进行一个拼接。但要注意的是,原图片文件夹和目标图片文件夹的图片必须是一一对应的、顺序一致的

python font2img.py --src_imgs=source_path
                   --dst_imgs=target_path
                   --sample_count=1000
                   --sample_dir=dir
                   --mode=imgs2imgs

第二步:配对数据集的预处理-转换为二进制文件 package.py

在获取所有图像后,运行package.py将图像及其对应标签转换为二进制格式。

这里的–dir对应的路径即是第一步生成的配对数据集的文件夹。其中,split_ratio范围在[0,1]之间。

python package.py --dir=image_directories
                  --save_dir=binary_save_directory
                  --split_ratio=0.2

运行后,您将在 –save_dir 指定的文件夹下找到两个对象:train.objval.obj,分别用于训练和验证。

如果您想要使用特定文本进行推断/验证网络,请运行以下命令。

python package.py --dir=image_directories
                  --save_dir=binary_save_directory
                  --split_ratio=0

请注意,当split_ratio=0,val.obj是一个空文件。所以您可以通过某种方式将train.obj重命名为infer.obj或val.obj。

Experiment文件夹的布局
experiment/
└── data
    ├── train.obj
    └── val.obj

在项目的根目录下创建一个experiment目录,并在其中创建一个data目录来放置这两个二进制文件。

第三步:训练网络 train.py

开始训练请运行以下命令:

参数含义解释如下:

  • --experiment_dir=experiment:指定实验的目录,用于存储训练过程中生成的样本、日志和检查点等文件。
  • --gpu_ids=cuda:0:指定要使用的GPU编号,在这里是使用cuda编号为0的GPU进行训练。
  • --batch_size=32:指定每个训练批次的样本数量为32。
  • --epoch=100:指定训练的总轮数为100轮。
  • --sample_steps=200:指定每隔多少步(iterations)生成一次样本。
  • --checkpoint_steps=500:指定每隔多少步(iterations)保存一次模型检查点。
  • --schedule=10:指定学习率将在多少个epochs之间减半。
单卡运行
python train.py --experiment_dir experiment 
				--gpu_ids cuda:0 
                --batch_size 32 
                --epoch 100
                --sample_steps 200 
                --checkpoint_steps 500

schedule 在这里表示学习率将在多少个epochs之间减半。如果不存在,训练命令会在experiment_dir下创建sample,logs,checkpoint目录,您可以在其中查看和管理训练的进度。

在训练过程中,您会在checkpoint目录中找到两个或多个checkpoint文件N_net_G.pthN_net_D.pth,其中N表示步数。

警告:如果您的 checkpoint_steps 较小,您将在checkpoint路径中找到大量的checkpoint文件,并且您的磁盘空间将被填满无用的checkpoint文件。您可以删除无用的checkpoint文件以节省磁盘空间。

多卡并行
python train.py --experiment_dir experiment 
				--gpu_ids cuda:0 cuda:1
                --batch_size 32 
                --epoch 100
                --sample_steps 200 
                --checkpoint_steps 500

第四步:模型推理——生成字体图片 infer.py

训练结束后,您可以运行以下命令来推理测试数据,生成对应的字体图片。

使用val.obj进行推理

以下是对每个参数含义的解释:

  • --experiment_dir experiment:指定实验的目录,即存储训练过程中生成的样本、日志和检查点等文件的目录。
  • --batch_size 32:指定每个推理批次的样本数量为32。
  • --gpu_ids cuda:0:指定要使用的GPU编号,在这里是使用cuda编号为0的GPU进行推理。
  • --resume {the saved model you select}:指定要恢复的模型文件,用于进行推理。
  • --obj_pth obj_path:指定二进制文件的路径,用于推理时加载相关的对象文件。
  • --infer_dir:指定推理结果保存的文件夹。
python infer.py --experiment_dir experiment
                --batch_size 32
                --gpu_ids cuda:0 
                --resume {the saved model you select}
                --obj_pth obj_path
                --infer_dir infer_obj

例如,如果您想要使用经过100步训练的模型100_net_G.pth100_net_D.pth,您应该使用**–resume=100**。

使用一行文字进行推理(适用数据不多的情况)
python infer.py --experiment_dir experiment
                --gpu_ids cuda:0
                --batch_size 32
                --resume {the saved model you select}
                --from_txt
                --src_font {your model\'s source font file}
                --src_txt "宜將剩勇追窮寇不可沽名學霸王天若有情天亦老人間正道是滄桑"
                --infer_dir infer_sentence

src_txt 是你想要推理的文字。

使用本地的txt文件进行推理(适用数据较多的情况)
python infer.py --experiment_dir experiment
                --gpu_ids cuda:0
                --batch_size 32
                --resume {the saved model you select}
                --from_txt2
                --src_font {your model\'s source font file}
                --src_txt_file GB2312.txt
                --infer_dir infer_GB2312

src_txt_file 是你想要推理的本地txt文件路径。

此时experiment目录下的布局为:
experiment/
├── checkpoint
└── data
    ├── train.obj
    └── val.obj
├── sample
├── infer

字体制作 使用指南

字体制作部分的思路分为两步:

  1. 先对infer推理生成的图片再做一次预处理,平滑笔画上的锯齿毛边,减少图像噪点,同时提高清晰度;

  2. 对处理后的图片进行矢量化、生成字体。

FontGenerator
├──potrace SVG生成软件
├──readme-asset 资源
└──src 源代码

Requirement

安装的库版本如下:

  • opencv-python
  • pillow
  • numpy
  • ffpython

依赖软件安装

Potrace

用于生成 svg 文件,Windows 环境下无需安装(已经放置在项目文件夹中)

FontForge

用于生成字体,目前仅支持在 Windows 下安装后将 D:\ProgramFiles\FontForgeBuilds\bin 放入 PATH 中的方式来使用 ffpython 库。推荐查阅官方文档以添加其他支持。

具体添加path的方法如下:
fontforge添加路径的方法

主要函数说明

preprocess_image_otsu
  • enhance(2.0): 增强图像对比度。2.0 增加对比度;数值越大,对比度越高。
  • medianBlur(img_np, 5): 减少图像噪点。5 是核大小;数值越大,图像越平滑。
  • adaptiveThreshold(..., 21, 5):
    • 21: 局部阈值化的核大小;数值越大,结果越平滑。
    • 5: 在阈值化中从均值或加权均值中减去的常数。
  • threshold(..., cv2.THRESH_OTSU): 应用 Otsu 方法自动找到最佳阈值。
bitmap_to_svg
  • --opttolerance 0.2: Potrace 中的曲线优化容差。数值越小,保留的位图细节越多。
  • --alphamax 3.5: Potrace 中曲线平滑的最大角度。数值越大,曲线越平滑。

生成字体 Generator/src/generator_main.py

python Generator/src/generator_main.py experiment/infer/0 experiment/my_first_font.ttf

其中,第一个参数是推理图片目录,即infer_directory;第二个参数是生成字体的路径及名称,即output_font_name。

此时experiment目录下的布局为:
experiment/
├── checkpoint
└── data
    ├── train.obj
    └── val.obj
├── sample
├── infer
├── processed
├── char_svg
├── my_first_font.ttf

参数说明

  • processed/: 经过第二次预处理的图片目录。
  • char_svg/: 存储字符转换为SVG格式的图片目录。
  • my_first_font.ttf: 一个名为 “my_first_font” 的 TrueType 字体文件,为从char_svg目录中生成的字体。

如果目标是想要制作自己的字体,则可以将my_first_font.ttf直接下载使用;如果想要对推理的图片进行二次创作,如抠图、填充、拼接等,则可以使用processed目录或者char_svg目录下的图片,这两个目录下图片提供了三种图片格式(.png、.bmp、.svg)供下载使用。

Pre-trained model

本项目提供训练好的模型,有方正多宝塔碑、多宝塔碑、柳公权楷书、魏碑、赵孟頫三门记、何绍基隶书、金农隶书供大家下载使用。

Acknowledgements

Code derived and rehashed from:

License

Apache 2.0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值