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

news2024/12/24 8:59:48

在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:

  • zi2zi-pytorch by EuphoriaYan
  • pix2pix-tensorflow by yenchenlin
  • Domain Transfer Network by yunjey
  • ac-gan by buriburisuri
  • dc-gan by carpedm20
  • origianl pix2pix torch code by phillipi
  • zi2zi by kaonashi-tyc
  • zi2zi-pytorch by xuan-li
  • Font2Font by jasonlo0509

License

Apache 2.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

过去8年,编程语言的流行度发生了哪些变化?PHP下降,Objective-C已过时

前天有一个汇总9个不同排名数据的“地表最强”编程语言排行榜,为了更好地理解语言流行度的变化,作者将2016年的类似调查结果与2024年的数据进行了比较。 虽然2016年的调查只包含6个排名,但它仍然提供了宝贵的参考数据。 我们来看看详细的情…

C++之String类(下)

片头 嗨喽~ 我们又见面啦,在上一篇C之String类(上)中,我们对string类的函数有了一个初步的认识,这一篇中,我们将继续学习string类的相关知识。准备好了吗?咱们开始咯~ 二、标准库中的string类 …

业务封装与映射 -- AMP BMP GMP

概述 不同单板支持不同的封装模式,主要包括: AMP (Asynchronous Mapping Procedure,异步映射规程)BMP (Bit-synchronous Mapping Procedure,比特同步映射规程)GMP (Generic Mapping Procedure,通用映射规程) AMP/BMP&#xff1a…

Qt_绘图

目录 1、绘图核心类 2、QPainter类的使用 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 3、QPen类的使用 3.1 使用画笔 4、QBrush类的使用 4.1 使用画刷 5、绘制图片 5.1 测试QPixmap 5.1.1 图片移动 5.1.2 图标缩小 5.1.3 旋转图片 5.1.4 将…

【逐行注释】MATLAB下的粒子滤波代码(三维状态与观测,可直接复制粘贴到MATLAB上面运行)

文章目录 程序设计1. 介绍2. 系统模型3. 算法步骤源代码(直接复制到MATLAB上面可以运行)运行结果程序设计 1. 介绍 粒子滤波(Particle Filter, PF)是一种基于贝叶斯理论的递归估计方法,广泛用于动态系统状态的估计和跟踪。该方法通过一组粒子(即假设的状态)及其权重来…

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

5款惊艳全网的AI写作论文神器!从此告别写作烦恼!

在当今的学术研究和写作领域,撰写高质量的论文是一项挑战性的任务。幸运的是,随着人工智能技术的发展,AI论文写作工具逐渐成为帮助学者和学生提高写作效率的重要工具。这些工具不仅能够提高写作效率,还能帮助研究者生成高质量的论…

ECharts 快速使用

最终效果 使用介绍 echarts图表的绘制,大体分为三步: 根据 DOM实例,通过 echarts.init方法,生成 echarts实例构建 options配置对象,整个echarts的样式,皆有该对象决定最后通过实例.setOption方法&#xf…

【测试-BUG篇】软件测试的BUG知识你了解多少呢?

文章目录 1. 软件测试的生命周期2. BUG3. BUG的生命周期4. 与开发人员起争执怎么办 1. 软件测试的生命周期 🍎软件测试 贯穿整个软件的生命周期; 🍎软件测试的生命周期是指测试流程; ①需求分析 用户角度:软件需求是…

C++:一文搞懂友元类(friend class)

C的友元(friend)是个很重要的概念,好些朋友对此却很迷惑,本文将对友元类(friend class)详细讲解,一文搞懂。 友元的特性: 1、使用friend修饰的友元类可以访问本类的私有成员(priva…

中国电信解锁万亿参数大模型:TeleAI的创新与突破

首个由万卡集群训练出来的万亿参数大模型,已被一家央企解锁。 具体而言,为了推动纯国产人工智能的探索,带来这条新路径的正是中国电信人工智能研究院(TeleAI)。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…

坡印廷矢量(也叫功率流密度,对面积积分就是功率)

坡印廷矢量在静电场,静磁场,恒定电流的电场,和时变电磁场中的表达式不同。 我们看时变电磁场的坡印廷矢量 坡印廷矢量就等于这个,其中的电场和磁场是实数表示的 坡印廷矢量用复数形式的场求 这里的E和H是复数表示的场&#xff0…

电影票接口api对接有哪些优势?

一、业务功能拓展方面的优势 多平台整合可以整合多个影院票务系统,通过一个接口获取众多影院的信息,包括影院、影厅、座位、影片、场次、日期及票价等信息,方便在自己的应用程序中展示这些信息,从而实现电影票的在线预订、支付和…

人工智能价格战——如何降低成本让人工智能更易于普及

十年前,开发人工智能 (AI) 是只有大公司和资金充足的研究机构才能负担得起的事情。必要的硬件、软件和数据存储成本非常高。但从那时起,情况发生了很大变化。一切始于 2012 年的 AlexNet,这是一种深度学习模型,展示了神经网络的真…

微服务jvisualvm解析部署使用全流程

1、介绍 VisualVM 是Netbeans的profile 2、启动 进入正在使用的jdk下bin目录,运行jvisualvm.exe。 3、选中要监控的线程 4、安装gc插件 5、插件安装报错 VisualVM: Plugins Centers 访问这个地址,找到对应版本再配置 https://visualvm.github.io/uc/…

【CKA】六、四层负载-Service应用

6、四层负载-Service应用 1. 考题内容: 2. 答题思路: 1、编辑front-end的deploy服务,添加端口信息 2、暴露svc端口 3. 官网地址: https://kubernetes.io/zh-cn/docs/tutorials/services/connect-applications-service/#the-ku…

nominatim部署OSM离线地图

第一步:准备一个大内存的服务器,磁盘PG大小根据实际导入的数据确定,全量数据1T,osm.pdf属于压缩文件,如果能下载,但下载很慢,可以尝试用迅雷下载。 osm.pdf下载 osm.pdf另外一个下载路径 全量数…

学生党有福了!国内最好的4款AI论文润色机构

在当今学术研究和写作领域,AI技术的应用已经变得越来越普遍。AI论文润色工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。这些工具极大地提高了写作效率和质量,尤其对于学生党来说,选择合适的AI论…

基于单片机多功能称重系统设计

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

2024年3分钟手把手教你激活Guitar Pro 8破解版

Guitar Pro是一款专业的吉他制谱软件,现在已更新至Guitar Pro8,新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Windows如何安装激活。 GuitarPro8安装包和许可证密钥夸克…