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:

  • 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.rhkb.cn/news/436189.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识Linux · 进程等待

目录 前言: 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言: 通过上文的学习,我们了解了进程终止,知道终止是在干什么,终止的三种情况,以及有了退出码,错误码的概念&#xff…

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计共享单车管理网站

单车信息选择骑行 骑行状态留言公告/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 目录 功能图 界面展示 开发目标 开发背景意义 开发意义‌ 开发目的 项目概述‌ 技术选型与理由‌ 系统设计与功能实现‌ 项目可执行性分析 ‌系统架构需求‌ ‌性能需…

leetcode力扣刷题系列——【座位预约管理系统】

题目 请你设计一个管理 n 个座位预约的系统,座位编号从 1 到 n 。 请你实现 SeatManager 类: SeatManager(int n) 初始化一个 SeatManager 对象,它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。 int reserve() 返回可以预约座…

解决 Android WebView 无法加载 H5 页面常见问题的实用指南

目录 1. WebView 简介 2. 常见问题 3. 网络权限设置 4. 启用 JavaScript 5. DOM Storage 的重要性 6. 处理 HTTPS 问题 7. 设置 WebViewClient 8. 调试工具 9. 其他调试技巧 10. 结论 相关推荐 1. WebView 简介 Android WebView 是一种视图组件,使得 And…

【STM32】 TCP/IP通信协议(1)--LwIP介绍

一、前言 TCP/IP是干啥的?它跟SPI、IIC、CAN有什么区别?它如何实现stm32的通讯?如何去配置?为了搞懂这些问题,查询资料可解决如下疑问: 1.为什么要用以太网通信? 以太网(Ethernet) 是指遵守 IEEE 802.3 …

16.安卓逆向-frida基础-HOOK类方法2

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

在线毫米(mm)到像素(px)换算器

具体请前往:在线mm转px工具--将实际长度毫米(Millimeters)单位换算为像素(Pixels)单位

CAN总线的错误类型

前言 CAN总线的错误类型主要包括:位错误、填充错误、格式错误、ACK错误和CRC错误。这里一定要做好CAN总线的错误类型、错误帧类型、节点状态之间的区别。 错误类型是帧传输出错的原因类型;错误帧类型(主动错误帧、被动错误帧)是帧…

(c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区

//内存四区:1.代码区 2.全局区 3.栈区 4.堆区 1.放在代码区的有:1.写的代码:只读的、共享的、存放的二进制机器指令、由操作系统直接管理 2.放在全局区的有:1.全局的(变量或常量) 2.静态的&#xff0…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(1)

在阿里云创建MQTT产品的过程涉及几个关键步骤,主要包括注册阿里云账号、实名认证、开通MQTT服务实例、创建产品与设备等。以下是详细的步骤说明: 一、准备工作 访问阿里云官网,点击注册按钮,填写相关信息(如账号、密码、手机号等)完成注册。注册完成后,需要对账号进行实…

Python爬虫之requests(二)

Python爬虫之requests(二) 前面演示了requests模块的四种请求方式。接下来再来演示下综合的练习。 一、requests模块综合练习 需求:爬取搜狗知乎某一个词条对应的某个范围页码表示的页面数据。 点开搜狗首页,有一个知乎的版块…

敏感字段加密 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 【敏感字段加密】给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线 进行分割; 3、可…

登录功能开发 P167重点

会话技术: cookie jwt令牌会话技术: jwt生成: Claims:jwt中的第二部分 过滤器: 拦截器: 前端无法识别controller方法,因此存在Dispa什么的

QT——初识

目录 前言 1.创建一个QT项目 2.查看生成的文件 3.打印一条hello world! ①使用控件实现 ②使用代码实现 4.Qt的编码格式 5.信号和槽 6.Qt中的坐标系 前言 QT是一款可跨平台的电脑客户端开发软件,本文将介绍一些有关QT使用的基础内容。 1.创建一个…

介绍我经常使用的两款轻便易用的 JSON 工具

第一款是 Chrome Extension,名叫 JSON Viewer Pro,可以在 Chrome 应用商店下载: 点击右上角的 JSON Input,然后可以直接把 JSON 字符串内容粘贴进去,也直接直接加载本地 JSON 文件。 可以在树形显示和图形显示两种模式…

winform—实现窗口传值

winform实现窗口传值 在WinForms应用程序中,实现窗体间传值可以通过几种方式: 方式一通过构造函数传值 第一个窗体 public partial class Form1 : Form{public Form1(){InitializeComponent();}private void buttonOpenForm2_Click(object sender, Ev…

数学建模研赛总结

目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录,希望所写的一些内容能够对大家有所帮助,不足之处欢迎大家批评指正🤝🤝🤝 进度 今天已经是最后一天了&#xf…

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024 前言简介任务定义模型架构Encoding Dialogue InformationCapturing Associated InformationPredicting Emotion and Generating Response损失函数问题前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦…

基于YOLOv8目标检测与chef-transformer(T5)从图像创建食谱

前言 在本文中,将演示如何使用从Roboflow获得的开源产品数据来训练我的YOLOv8模型,然后将其与从Hugging Face获得的chef-transformer(T5)模型集成。应用程序的主要目标是将检测到的对象参数化地发送到语言模型,并在NL…

sentinelhub3.7相比3.4的版本主要变化

sentinelhub3.7相比3.4的版本,主要变化包括: 1. 增加对sentinel 基线04.00数据产品的支持; 2. 将aws数据下载模块独立出来 3.4版本 3.7版本 3. 原来的DataSource改为DataCollection 3.7版本不再支持DataSource 3.4版本中的DataSource 3.7版本使用Data…