dailenson / SDT

This repository is the official implementation of Disentangling Writer and Character Styles for Handwriting Generation (CVPR23).
MIT License
956 stars 81 forks source link

新手向教程:使用CPU训练你的字体 #56

Open chengtx809 opened 7 months ago

chengtx809 commented 7 months ago

本文是在基于 #43 的基础上更改而来,原作者没有提供对于CPU的训练教程,我创建了使用CPU的训练程序,特此补充(如果你使用英伟达显卡训练,请移步作者的教程,本文只是给没有显卡而想要使用CPU训练的人群阅读:)

本教程偏小白向,可能会过于啰嗦,还望见谅

0.下载代码:

image

1.安装python3.8(其他版本可能会报错!)

官网链接:https://www.python.org/downloads/release/python-380/ 官网下载慢的话,我自己下载了一份拷到蓝奏云,各位可以直接下: https://chengtx.lanpw.com/iJ6W21m7s13i 密码:fid4

2.安装库:

我试跑一轮下来,安装了这些库: 以下是Python 3.8没有自带的库及其安装命令:

  1. certifi - 安装命令:pip install certifi
  2. charset-normalizer - 安装命令:pip install charset-normalizer
  3. colorama - 安装命令:pip install colorama
  4. easydict - 安装命令:pip install easydict
  5. einops - 安装命令:pip install einops
  6. fastdtw - 安装命令:pip install fastdtw
  7. filelock - 安装命令:pip install filelock
  8. fsspec - 安装命令:pip install fsspec
  9. idna - 安装命令:pip install idna
  10. Jinja2 - 安装命令:pip install Jinja2
  11. lmdb - 安装命令:pip install lmdb
  12. MarkupSafe - 安装命令:pip install MarkupSafe
  13. mpmath - 安装命令:pip install mpmath
  14. networkx - 安装命令:pip install networkx
  15. numpy - 安装命令:pip install numpy
  16. opencv-contrib-python - 安装命令:pip install opencv-contrib-python
  17. packaging - 安装命令:pip install packaging
  18. pillow - 安装命令:pip install pillow
  19. protobuf - 安装命令:pip install protobuf
  20. PyYAML - 安装命令:pip install PyYAML
  21. requests - 安装命令:pip install requests
  22. setuptools - 安装命令:pip install setuptools
  23. six - 安装命令:pip install six
  24. sympy - 安装命令:pip install sympy
  25. tensorboardX - 安装命令:pip install tensorboardX
  26. torch - 安装命令:pip install torch
  27. torchaudio - 安装命令:pip install torchaudio
  28. torchvision - 安装命令:pip install torchvision
  29. tqdm - 安装命令:pip install tqdm
  30. typing_extensions - 安装命令:pip install typing_extensions
  31. urllib3 - 安装命令:pip install urllib3

你只需要win+R打开cmd,然后依次执行以上命令 如果下载速度较慢,只要几十~几百kb/s,可以依次执行以下命令把pip换成清华源,下载速度会很快:

python -m pip install --upgrade pip
pip config set global.index-url `https://pypi.tuna.tsinghua.edu.cn/simple

如果换源失败,请自行百度“pip换源“,这里不过多赘述 这些库可能有点多,但我实测一轮下来就是安装了这么多:( 如果你还遇到类似:ModuleNotFoundError: No module named 'tqdm'的报错,说明你缺少单引号里的库,需要安装 如我给出的报错信息就要在cmd里执行pip install tqdm来安装库 如果还有关于库安装的问题,自行百度吧:)

3.下载预训练模型:

解压最开始下载的代码文件,在里面新建一个名为checkpoint的文件夹: image 从readme文件里的百度网盘下载预训练模型checkpoint-iter199999.pth 如果百度网盘太慢,我也将其复制了一份到123云盘(超过100M蓝奏云放不了啊啊啊啊) https://www.123pan.com/s/TmBBjv-xDlaH.html 最后将下载下来的checkpoint-iter199999.pth文件放入创建的checkpoint文件夹中

4.下载pkl文件:

依旧提供蓝奏云链接: https://chengtx.lanpw.com/iDQqn1m7vyqh 密码:5qvj 然后在代码目录新建名为data的文件夹 将下载下来的压缩包解压进data文件夹中 image 3个pkl文件应该位于代码根目录下的data\CASIA_CHINESE文件夹中,如上图所示

5.下载适用于CPU训练的user_generate_cpu.py文件:

这是我在原基础user_generate.py代码更改而来,使其使用cpu训练而不是cuda 依旧蓝奏云: https://chengtx.lanpw.com/iC9XO1m7x2gh 密码:9vwa 把文件解压,得到user_generate_cpu.py文件并放入代码文件夹中: image

6.更改gmm.py文件:

recording 打开models文件夹下的gmm.py,如上图 image 进入后把文件内的3个"cuda"改为“cpu”(3个“cuda”位置如上图) image 改完之后应该是上面这样子: 我也提供了改完之后的gmm.py文件 https://chengtx.lanpw.com/iF2Ze1m7y7gd 密码:fskz 下载下来解压后替换models文件夹内的gmm.py文件

7.数据预处理:

在代码根目录新建style_samples文件夹: image 2024.5.12补: 我使用的是windows画图,把画布调成300*300,直接写完后保存到style_samples文件夹内 然后在style_samples文件夹下新建一个python文件,填入这段代码并运行:

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}") 

这段代码运行后会二值化图片,如果没有这一步会导致生成效果不理想!

8.开始训练!

很高兴你能看到这里,这是本教程的最后一步!!! 回到代码根目录,在地址栏输入cmd并回车 recording 在弹出的黑窗口中输入: python user_generate_cpu.py --pretrained_model .\checkpoint\checkpoint-iter199999.pth --style_path .\style_samples 然后等待一下,出现以下界面 image 恭喜你成功训练!!! 训练完成的图片可以在Generated文件夹下找到 image

若还有问题,欢迎留言,看到后我会第一时间处理!

CreeperAWA commented 7 months ago

大佬,你教程里下载user_generate_cpu.py的链接是data.7z,解压以后并没有user_generate_cpu.py

chengtx809 commented 7 months ago

大佬,你教程里下载user_generate_cpu.py的链接是data.7z,解压以后并没有user_generate_cpu.py

放错链接了: https://chengtx.lanpw.com/iC9XO1m7x2gh 密码:9vwa 这个才是

chengtx809 commented 7 months ago

9vwa

已经改完教程链接了,现在看应该是正常的

maygyd commented 7 months ago

大佬 image user_generate.py是不是没加上cpu啊 另外,这是我的报错 image

maygyd commented 7 months ago

大佬 image user_generate.py是不是没加上cpu啊 另外,这是我的报错 image

我也重装过一遍了,还是一样

chengtx809 commented 7 months ago

大佬 image user_generate.py是不是没加上cpu啊 另外,这是我的报错 image

好像是的(捂脸, 现在更改教程:) 这个报错我倒是没有见过,确认下python版本是不是3.8,我试过非3.8版本会有不兼容报错,实在不行就把python全卸了只装个3.8

chengtx809 commented 7 months ago

大佬 image user_generate.py是不是没加上cpu啊 另外,这是我的报错 image

我也重装过一遍了,还是一样

我查了一下,是样本图像的问题,数据格式有问题。要更换下样本。 我可以分享下我采集样本的方法:把一堆字写在纸上并且用扫描软件扫描,然后在电脑截图,把一个个字单独截出来再存下来。我使用的截图软件是pixpin,是不会出现任何问题的

tamako33 commented 6 months ago

非常感谢大佬的教程,我在使用过程中还是遇到了如下问题,询问gpt之后也没找到解决办法,想请教大佬这个是什么原因导致的,应该如何解决

图片alt

maygyd commented 6 months ago

非常感谢大佬的教程,我在使用过程中还是遇到了如下问题,询问gpt之后也没找到解决办法,想请教大佬这个是什么原因导致的,应该如何解决

图片alt

输入数量够吗

tamako33 commented 6 months ago

非常感谢大佬的教程,我在使用过程中还是遇到了如下问题,询问gpt之后也没找到解决办法,想请教大佬这个是什么原因导致的,应该如何解决 图片alt

输入数量够吗

非常感谢dalao的回复,跑起来了,犯了一个很低级的错误(存放图片的文件夹与命令行的文件夹名称不一致) sry!!! i5-12600KF跑起来大概95.26s/it 然后2%进度稳定蓝屏,使用gpu的话会报cuda的错 UM)H~W(NHKCX`$EM0XVRW{L

ouremeng commented 5 months ago

大佬,我是纯小白,前面几步已经按照教程设置好了,最后一步输入后按回车只是换行,没有任何反应,可能是什么原因(°ー°〃)

coling0 commented 3 months ago

小白感谢大佬提供的脚本,代码在windows10/winserver2016+python3.9.7中得到复现,正常运行,但是经过对比发现一些点: 提供40张图 环境1:windows10+i3-10100+32G 运行时间大概10小时 环境2:windserver2016+双路至强Gold5222+256G 差不多9个半小时 CPU都是跑满100%,不知道为撒差别这么小😂

Snipaste_2024-05-15_22-03-06

maygyd commented 3 months ago

[自动回复]Sorry,the DALAO you talked with is so busy that can't answer you forever,please never send amessages again.

chengtx809 commented 3 months ago

小白感谢大佬提供的脚本,代码在windows10/winserver2016+python3.9.7中得到复现,正常运行,但是经过对比发现一些点: 提供40张图 环境1:windows10+i3-10100+32G 运行时间大概10小时 环境2:windserver2016+双路至强Gold5222+256G 差不多9个半小时 CPU都是跑满100%,不知道为撒差别这么小😂

Snipaste_2024-05-15_22-03-06

我个人也不是很了解这方面知识,目前只做过LLM在CPU上跑的优化 我12代i9跑完大概4h。可以做个参考😂

chengtx809 commented 3 months ago

非常感谢大佬的教程,我在使用过程中还是遇到了如下问题,询问gpt之后也没找到解决办法,想请教大佬这个是什么原因导致的,应该如何解决 图片alt

输入数量够吗

非常感谢dalao的回复,跑起来了,犯了一个很低级的错误(存放图片的文件夹与命令行的文件夹名称不一致) sry!!! i5-12600KF跑起来大概95.26s/it 然后2%进度稳定蓝屏,使用gpu的话会报cuda的错 UM)H~W(NHKCX`$EM0XVRW{L

抱歉现在才看到哈,我个人实测下是不会出现蓝屏,可以具体提供下蓝屏代码看看?

chengtx809 commented 3 months ago

大佬,我是纯小白,前面几步已经按照教程设置好了,最后一步输入后按回车只是换行,没有任何反应,可能是什么原因(°ー°〃)

是不是路径的问题?照着教程是木有问题的欸

aceliuchanghong commented 2 months ago

@chengtx809 你这儿的style_samples可以发我zip看看吗,麻烦了,谢谢

chengtx809 commented 2 months ago

@chengtx809 你这儿的style_samples可以发我zip看看吗,麻烦了,谢谢

我现在在学校,等明天周末回家了我发你

chengtx809 commented 2 months ago

@chengtx809 你这儿的style_samples可以发我zip看看吗,麻烦了,谢谢

你试试直接微软自带的Windows画图,画布300*300,直接默认画笔,把写好的存到style_samples。然后再在style_samples目录下建一个python文件,写这段二值化代码:

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}") 

然后运行程序,程序会把图片二值化(就去掉灰度),在跑下就能复现出比较好的结果了 对了,字迹笔画细一点的样本出来效果会好一点

gudaoxongdi commented 2 months ago

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

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

chengtx809 commented 2 months ago

@chengtx809 你这儿的style_samples可以发我zip看看吗,麻烦了,谢谢

style_samples.zip 文件在这里