Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

教程:从手写字体到A4纸打印(GPU篇) #78

Open
P0etry-rain opened this issue Apr 17, 2024 · 35 comments
Open

教程:从手写字体到A4纸打印(GPU篇) #78

P0etry-rain opened this issue Apr 17, 2024 · 35 comments

Comments

@P0etry-rain
Copy link

P0etry-rain commented Apr 17, 2024

Part1.手写训练集

推荐使用Sai2

先更改Sai2手写笔按键设置 把按键改成激活橡皮擦

具体操作

按住笔的按键的同时,点击选择橡皮擦就能更改过来

根据图片进行设置 尤其左边要关闭笔压(无笔压) 推荐配置如下
PixPin

然后写30-50个字 尽量让字在正中央 并保存为png或jpg到文件夹内
Handwrite1

Note

有一个叫富士通Fujitsu Q506/Q507/Q508的工业平板支持wacom手写笔 用于手写效果不错 本文的手写体数据集来源于该设备

还有同类的设备Q508和Q507 性能基本一致 但是Q508市面上并未有对应的键盘可以购买

更多有关Q508平板的内容可以查看酷安帖子https://www.coolapk.com/feed/51879006

较为推荐Q507设备 和键盘搭配的使用体验较为不错 不过性能所限 只能轻办公和视频

配置1为:英特尔X5-z8550 2G或4G运行内存 64GB硬盘

配置2为:英特尔X7-z8700 2G或4G运行内存 64GB硬盘

内存和硬盘都是板载 增加容量比较困难 需要热风枪换存储芯片

闲鱼市场价RMB250-300左右

Part2.环境准备

以WSL2-Ubuntu 20.04.06LTS为例

#安装conda
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
bash Anaconda3-2024.02-1-Linux-x86_64.sh
#列表很长 要多次按回车
#推荐使用python3.8
conda update conda
conda create -n pytorch python=3.8

安装完毕后重启一次终端 以刷新配置 重启后显示为

(base) azuma@seren-PC:~$

启动名为pytorch虚拟conda环境 推荐在pytorch虚拟conda环境下进行操作

conda activate pytorch
#将会被更改为
(pytorch) azuma@seren-PC:~$

conda配置和修改

#conda修改源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/
conda config --set show_channel_urls yes
#python修改源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python -m pip install --upgrade pip

安装pytorch

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

下载SDT-master

git clone https://github.com/dailenson/SDT
cd SDT-master

安装SDT-master所需依赖

pip install certifi
pip install charset-normalizer
pip install colorama
pip install easydict
pip install einops
pip install fastdtw
pip install filelock
pip install fsspec
pip install idna
pip install Jinja2
pip install lmdb
pip install MarkupSafe
pip install mpmath
pip install networkx
pip install numpy
pip install opencv-contrib-python
pip install packaging
pip install pillow
pip install protobuf
pip install PyYAML
pip install requests
pip install setuptools
pip install six
pip install sympy
pip install tensorboardX
pip install tqdm
pip install typing_extensions
pip install urllib3

下载checkpoint模型

https://www.123pan.com/s/TmBBjv-xDlaH.html

下载pkl文件

https://chengtx.lanpw.com/iDQqn1m7vyqh 密码:5qvj

#在SDT-master中新建checkpoint文件夹存放模型
azuma@seren-PC:~/SDT-master$ mkdir checkpoint
#将checkpoint-iter199999.pth放入checkpoint文件夹

#再创建文件夹/data/CASIA_CHINESE
mkdir ./data/CASIA_CHINESE
#将character_dict.pkl Chinese_content.pkl writer_dict.pkl放入/data/CASIA_CHINESE

完成后目录结构

├── checkpoint
│   └── checkpoint-iter199999.pth
├── data
│   └── CASIA_CHINESE
│       ├── character_dict.pkl
│       ├── Chinese_content.pkl
│       └── writer_dict.pkl

Part3.模型训练

创建style_samples并把手写图片放入

azuma@seren-PC:~/SDT-master$ mkdir style_samples

假设checkpoint-iter199999.pth放置在checkpoint文件夹

手写图片在style_samples文件夹

完成后目录结果如下

├── checkpoint
│   └── checkpoint-iter199999.pth
└── style_samples
    ├── 1.png
    ├── 2.png
    ├── 3.png
    ├── 4.png
    ├── 50.png

Handwrite2

运行训练命令

python user_generate.py --pretrained_model ./checkpoint/checkpoint-iter199999.pth --style_path ./style_samples

完成后目录如下

└── Generated
    └── Chinese_User
        ├── 俺.png
        ├── 熬.png
        ├── 鏊.png
        ├── 邶.png
        ├── 箅.png
        ├── 臂.png
        ├── 鳔.png
        ├── 摈.png
        ├── 粲.png
        ├── 躔.png
        ├── 齿.png
        ├── 茺.png
        ├── 宠.png
        ├── 辞.png
        ├── 抖.png
        ├── 矾.png
        ├── 烽.png
        ├── 桴.png
        ├── 簧.png

Generated

Part4.生成图处理

# 回到主目录
cd ~
# 安装nvm
sudo apt-get install curl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
# 安装node
nvm install --lts

使用打包字體說明書https://github.com/chiaoooo/PngToTTF

git clone https://github.com/chiaoooo/PngToTTF
cd PngToTTF
mkdir svg_separate
mkdir crop_v5
# mkdir final_font 测试不成功 # node readfile.js 测试不成功
cp ~/SDT-master/Generated/Chinese_User/* ~/PngToTTF/crop_v5/
# 安装依赖
npm install potrace
# PNG ---> SVG转换
node potrace.js
# 安装依赖 推荐处于pytorch虚拟conda环境
pip install picosvg
# SVG ---> SVG
node run_pico.js

pico文件夹中即为生成好的svg

Part5.TTF字体生成

安装FontForge 并在FontForge目录下创建一个SVG目录 并把生成好的svg放进去
fontforge2

运行脚本
fontforge

# 导入系统库
import fontforge,os,psMat


def main():
    '''
    主函数
    '''
    # 定义参数
    img_list = list()

    # 获取文件列表
    for file in os.listdir(img_dir):
            if os.path.splitext(file)[1].lower() in '.svg':
                img_list.append(file)
    print('当前总图片数量: %d' % len(img_list))
    
    # 循环处理图片
    # 创建字体
    font = fontforge.font()
    font.encoding = 'UnicodeFull'
    font.version = '1.0'
    font.weight = 'Regular'
    if font_name:
        font.fontname = font_name
        font.familyname = f'{font_name}-family'
        font.fullname = f'{font_name}-fullname'
    else:
        font.fontname = 'test'
    for img_path in img_list:
        
        # 获取unicode
        codestr = os.path.splitext(img_path)[0]
        code = ord(codestr)
            
        
        # 创建字符
        glyph = font.createChar(code, "uni"+codestr)
        glyph.importOutlines(os.path.join(img_dir,img_path))
        
        # 位移调整
        base_matrix = psMat.translate(0,0)
        glyph.transform(base_matrix)
        
        # 写入ttf
    font.generate(output)      

        
    print('全部处理结束,svg文件若要删除自行处理')


if __name__ == "__main__":
    '''
    程序入口
    '''
    img_dir = './SVG' #上一步png转换至svg存放的路径
    output='./test.ttf' #test.ttf
    font_name='test'
    main()

会弹出一些报错 大多能用 有空的话会把这一步优化一下
最后生成字体即可
TTF

Part6.手写模拟生成

下载Release:https://github.com/kivvi3412/HandWrite
如果需要打印在A4纸上 推荐参数如下

# 对于A4纸来说 以下参数有比较好的效果
2480x3508
字体大小65 行距85 字距2
留白 20 20 20 20
行间距扰动 2 0 0 0 0 0.1 #已经很乱了 参数可以小一点

设置如图所示
TEST2

打印效果如下
TEST

非常感谢以下git仓库和教程提供的帮助

#43
https://github.com/chiaoooo/PngToTTF
https://github.com/luguoyixiazi/png2ttf
https://github.com/kivvi3412/HandWrite

@dailenson
Copy link
Owner

太强了 收下我的膝盖,已置顶!

@dailenson dailenson pinned this issue Apr 17, 2024
@P0etry-rain
Copy link
Author

太强了 收下我的膝盖,已置顶!

感谢大佬捧场 只是做了一些微不足道的举手之劳

@pledge42
Copy link

根据作者的方法,成功的复现了!!
第一张是生成的字,第二张是提供的字,第三张是之前生成的字
image
image
image
简单说一下规律,这个模型对笔画的宽度有着十分严格的限制,只要笔画宽了,就容易出“草书”
解决方法和楼主说的一样,笔宽12,画面100%
我是拿鼠标画的,就调整成,笔宽6,画面50%,这样就方便画一点

@dailenson
Copy link
Owner

根据作者的方法,成功的复现了!! 第一张是生成的字,第二张是提供的字,第三张是之前生成的字 image image image 简单说一下规律,这个模型对笔画的宽度有着十分严格的限制,只要笔画宽了,就容易出“草书” 解决方法和楼主说的一样,笔宽12,画面100% 我是拿鼠标画的,就调整成,笔宽6,画面50%,这样就方便画一点

我感觉其实笔画宽不宽不重要,重要的是你得关掉压力渲染,维持笔画的宽度是均匀的。

@pledge42
Copy link

根据作者的方法,成功的复现了!! 第一张是生成的字,第二张是提供的字,第三张是之前生成的字 image image image 简单说一下规律,这个模型对笔画的宽度有着十分严格的限制,只要笔画宽了,就容易出“草书” 解决方法和楼主说的一样,笔宽12,画面100% 我是拿鼠标画的,就调整成,笔宽6,画面50%,这样就方便画一点

我感觉其实笔画宽不宽不重要,重要的是你得关掉压力渲染,维持笔画的宽度是均匀的。

经过实测并不是仅仅需要关掉压低渲染,本人尝试各种数据
包括手写OCR,ipad采集,再加上sai ver.2,都有失败案例
使用sai ver.2 时,第一次并没有像楼主说的,画面100%,笔画12
而是选择了样本数据50,画面50%,笔画12,为了方便使用鼠标绘画
跑出的结果和手写OCR或ipad采集差距不大
第一次认为是字没有沾满整个背景,于是进行裁剪处理,跑出的结果更差了
于是推断和笔画宽度有直接联系,第二次选择画面50%,笔画6,样本数量30,数据结构非常完美

@dailenson
Copy link
Owner

image

image

image

哈喽!这三张图我可以放在仓库主页的readme里面吗?我会详细注明图的来源!

@P0etry-rain
Copy link
Author

P0etry-rain commented Apr 18, 2024

哈喽!这三张图我可以放在仓库主页的readme里面吗?我会详细注明图的来源!

不胜荣幸 乐意至极

@dbsan2333
Copy link

太强了!
另外比较好奇,使用sai写的这个过程是不是也可以在纸上手写再扫描代替?另外如果训练集的图片有噪点或者污渍等,对训练结果是否有影响

@dailenson
Copy link
Owner

哈喽!这三张图我可以放在仓库主页的readme里面吗?我会详细注明图的来源!

不胜荣幸 乐意至极

已更新,增加了Practical Application章节!

@dailenson
Copy link
Owner

太强了! 另外比较好奇,使用sai写的这个过程是不是也可以在纸上手写再扫描代替?另外如果训练集的图片有噪点或者污渍等,对训练结果是否有影响

可以看下这个issue#59 ,里面有你想了解的东西,背景噪声的影响还是比较大的。

@P0etry-rain
Copy link
Author

哈喽!这三张图我可以放在仓库主页的readme里面吗?我会详细注明图的来源!

不胜荣幸 乐意至极

已更新,增加了Practical Application章节!

希望教程可以帮助到更多的人

@luckdr
Copy link

luckdr commented May 8, 2024

你好,可以提供一下你做好的这数据集吗,我想做一下测试看程序有没有问题

@chengtx809
Copy link

大佬强啊,学习下,回去改改我的教程(这段时间忙着做大模型没时间看这个仓库

@chengtx809
Copy link

image
生成出来的,效果还可以欸

@chengtx809
Copy link

我直接用了Windows自带的画图,画布调成300*300,触屏写的(我华为电脑有触屏)
然后用了这段二值化py代码

from PIL import Image  
import os  
# 设置二值化阈值  
threshold = 128  
current_dir = os.getcwd()  

for filename in os.listdir(current_dir):  
    if filename.endswith(('.jpg', '.png')):  
        img = Image.open(filename)  
        gray_img = img.convert('L')  
        binary_img = gray_img.point(lambda x: 255 if x > threshold else 0, '1')  
        binary_filename = filename.rsplit('.', 1)[0] + '_binary.' + filename.rsplit('.', 1)[1]  
        binary_img.save(binary_filename)  
          
        print(f"保存为:{binary_filename}")
        try:  
            os.remove(filename)  
            print(f"已删除:{filename}")  
        except OSError as e:  
            print(f"无法删除 {filename}.{e.strerror}") 

效果还挺可以

@chengtx809
Copy link

我整理了一下步骤,如果没有GPU想用cpu跑的朋友可以看看我的这篇cpu版教程 #56

@chengtx809
Copy link

大佬在图片转ttf的那块能不能更详细的讲下🙏

@P0etry-rain
Copy link
Author

P0etry-rain commented May 18, 2024

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

@chengtx809
Copy link

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

Part4那好像没看太懂,能不能分享下具体步骤,谢谢

@chiaoooo
Copy link

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

Part4那好像没看太懂,能不能分享下具体步骤,谢谢

這位已經寫得很詳細了,不然你可以點進專案裡也有我寫的 readme 可以實踐一下。

@chiaoooo
Copy link

chiaoooo commented May 19, 2024

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

想知道您那邊遇到不成功是哪裡沒安裝好呢?照理來說執行 npm install 就可以下載所有所需套件並正確生成字型的 svg 檔案了。另外也想請問您方便提供您的手寫數據圖像嗎?我想自行做個測試,謝謝!

@chengtx809
Copy link

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

想知道您那邊遇到不成功是哪裡沒安裝好呢?照理來說執行 npm install 就可以下載所有所需套件並正確生成字型的 svg 檔案了。另外也想請問您方便提供您的手寫數據圖像嗎?我想自行做個測試,謝謝!

好的,我一会试试。我把图像都打包在这了
1.zip
大佬测试完能不能把生成的字体文件给我,谢谢🙏(其实是懒得折腾了

@aceliuchanghong
Copy link

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

想知道您那邊遇到不成功是哪裡沒安裝好呢?照理來說執行 npm install 就可以下載所有所需套件並正確生成字型的 svg 檔案了。另外也想請問您方便提供您的手寫數據圖像嗎?我想自行做個測試,謝謝!

好的,我一会试试。我把图像都打包在这了 1.zip 大佬测试完能不能把生成的字体文件给我,谢谢🙏(其实是懒得折腾了

1.zip
你所需要的文件,
hello [chengtx809] ,可以把你的style_samples打个包发一下吗,我这儿不管怎么做都是草书

@chengtx809
Copy link

哈喽!这三张图我可以放在仓库主页的readme里面吗?我会详细注明图的来源!

不胜荣幸 乐意至极

已更新,增加了Practical Application章节!

希望教程可以帮助到更多的人

楼主,你的 手写训练集 可以发一下吗,我想测试一下到底和我的哪儿不同

好的,我要等到周末回到家才能发,我现在还在学校,数据在家里的电脑上(哭

@chengtx809
Copy link

大佬在图片转ttf的那块能不能更详细的讲下🙏

已经很详细了 不过是png转svg再导入fontforge字体生成软件而已 没有什么需要特别注意的地方倒是

想知道您那邊遇到不成功是哪裡沒安裝好呢?照理來說執行 npm install 就可以下載所有所需套件並正確生成字型的 svg 檔案了。另外也想請問您方便提供您的手寫數據圖像嗎?我想自行做個測試,謝謝!

好的,我一会试试。我把图像都打包在这了 1.zip 大佬测试完能不能把生成的字体文件给我,谢谢🙏(其实是懒得折腾了

1.zip 你所需要的文件, hello [chengtx809] ,可以把你的style_samples打个包发一下吗,我这儿不管怎么做都是草书

谢谢大佬做的ttf哈,已经用上了

@gudaoxongdi
Copy link

gudaoxongdi commented May 30, 2024

简单说一下规律,这个模型对笔画的宽度有着十分严格的限制,只要笔画宽了,就容易出“草书” 解决方法和楼主说的一样,笔宽12,画面100% 我是拿鼠标画的,就调整成,笔宽6,画面50%,这样就方便画一点

确实,跟画笔的粗细关系很大。
二值笔-粗
第1张是按照说明,在sai里用二值笔,关闭压感,粗细为12,结果生成的还是很潦草的。
二值笔-细
第2张,其它条件一样,就是把粗细调成3,生成的就不怎么潦草了。
ai-细
第3张是在AI里,用相对细的线条写的,生成的也不怎么潦草了。

@Tj-jiaoao
Copy link

iPad端用Procreate写效果挺好的,然后用white背景输出,转到Notability里转为墨迹,就可以针对某些字精修了

@yicone
Copy link

yicone commented Jun 17, 2024

iPad端用Procreate写效果挺好的,然后用white背景输出,转到Notability里转为墨迹,就可以针对某些字精修了

大佬,能发下手写的图片,以及生成的效果吗?

我用的是iPad 以及Apple Notes 中的第三只笔(书写时笔画宽度不变),笔画宽度选了最细,但生成的结果,虽然不再是狂草,但与输入的风格差异仍然非常大。
#75 (comment)

@yicone
Copy link

yicone commented Jun 17, 2024

简单说一下规律,这个模型对笔画的宽度有着十分严格的限制,只要笔画宽了,就容易出“草书” 解决方法和楼主说的一样,笔宽12,画面100% 我是拿鼠标画的,就调整成,笔宽6,画面50%,这样就方便画一点

确实,跟画笔的粗细关系很大。 二值笔-粗 第1张是按照说明,在sai里用二值笔,关闭压感,粗细为12,结果生成的还是很潦草的。 二值笔-细 第2张,其它条件一样,就是把粗细调成3,生成的就不怎么潦草了。 ai-细 第3张是在AI里,用相对细的线条写的,生成的也不怎么潦草了。

你好。你前面提到,笔画粗细一致且“够细“,生成的字符就不怎么潦草了,但是从你分享的图中看去,生成结果和输入的风格差异也是很大,想请教你找到原因了吗?

@yicone
Copy link

yicone commented Jun 17, 2024

根据作者的方法,成功的复现了!! 第一张是生成的字,第二张是提供的字,第三张是之前生成的字 image image image 简单说一下规律,这个模型对笔画的宽度有着十分严格的限制,只要笔画宽了,就容易出“草书” 解决方法和楼主说的一样,笔宽12,画面100% 我是拿鼠标画的,就调整成,笔宽6,画面50%,这样就方便画一点

你好。从你分享的图中看去,生成结果和输入的风格差异也是很大,想请教你找到原因了吗?

@HughesField
Copy link

您好,请问使用user_generate.py之后得到的模仿图片没有自己的书写风格是怎么回事呢?自己试了不同的风格样本,但是最后生成的图片都是一样的。确认风格样本和检查点文件路径都是正确的,运行也没有报错。希望能得到您的解答,非常感谢。

@aceliuchanghong
Copy link

image
现阶段各个版本的,都达不到理想的效果,这个mdb文件里面的坐标怎么生成的呀,很想请教一下

2 similar comments
@aceliuchanghong
Copy link

image
现阶段各个版本的,都达不到理想的效果,这个mdb文件里面的坐标怎么生成的呀,很想请教一下

@aceliuchanghong
Copy link

image
现阶段各个版本的,都达不到理想的效果,这个mdb文件里面的坐标怎么生成的呀,很想请教一下

@tvsunny
Copy link

tvsunny commented Jul 17, 2024

感谢感谢,依赖库的安装太重要啦

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests