2022对春联(春联的生成——用python手把手教(科普难度))
前言 哦,那是一个阳光明媚的下午。作为一个浑水摸鱼的高手,无意中发现了这样一篇文章。 用Python写春联:表达最真挚的祝福和最美好的祝愿 这不是打我的枪。反正我闲着。做点什么比较好。于是我高兴地喝了一杯茶 去看看看看。好家伙,原来对联的图片是生成的。然后问题来了。有没有办法自动生成对联,然后生成图片? 并在本地部署。 所以我有一个大胆的想法 基于RNN(Seq2Seq + Attention)生
前言
哦,那是一个阳光明媚的下午。作为一个浑水摸鱼的高手,无意中发现了这样一篇文章。
用Python写春联:表达最真挚的祝福和最美好的祝愿
这不是打我的枪。反正我闲着。做点什么比较好。于是我高兴地喝了一杯茶
去看看看看。好家伙,原来对联的图片是生成的。然后问题来了。有没有办法自动生成对联,然后生成图片?
并在本地部署。
所以我有一个大胆的想法
基于RNN(Seq2Seq + Attention)生成对联(屁)
是的,我有个大胆的想法,就是让我们基于 Seq2Seq + Attention 来生成对联。然而
好吧,看来我们必须改变主意了。
啊哈,我真的找到了。
环境准备
算了,废话少说。让我们快速开始吧。
在此之前,我们必须准备好我们的环境。
我在这里使用 python 3.8
点安装桨桨
pip 安装 paddlehub
#如果paddlehub安装失败,可以使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeoutu003d100 paddlehub
pip 安装枕头
功能分析
对联生成
感谢飞浆提供的支持PaddleHub我们可以快速实现我们需要的功能。所以我们可以像这样封装我们的代码。
这个真的没什么好说的。
导入 paddlehub 作为集线器
类 HubUtils(对象):
定义__init__(自我):
self.hub u003d 集线器
#模型需要在初始化时加载。这需要时间。加载它以供以后调用,但标题很特殊
self.module_love_words u003d self.hub.Module(nameu003d"ernie_gen_lover_words")
self.module_poetry u003d self.hub.Module(nameu003d"ernie_gen_poetry")
self.module_couplets u003d self.hub.Module(nameu003d"ernie_gen_couplet")
def GetLoveWords(self,curx,sizeu003d5):
生成情话。默认返回五个情话。这被传递到列表中
结果 u003d self.module_love_words.generate(textsu003dcurx, use_gpuu003dTruebeam_widthu003dsize)
返回结果[0]
def GetAcrostic(self,title,lineu003d4,wordu003d7,sizeu003d1):
#默认返回一首歌曲,可以输入标题
self.module_acrostic u003d self.hub.module u003d hub.Module(nameu003d"ernie_gen_acrostic_poetry", lineu003d4, wordu003d7)
结果 u003d self.module\acrostic.generate(textsu003d[title], use_gpuu003dTruebeam_widthu003dsize)
返回结果[0]
def GetPoetry(self,curx,sizeu003d1):
#输入关键句和词生成一首诗,默认为一首
结果 u003d self.module\poetry.generate(textsu003d[curx], use_gpuu003dTruebeam_widthu003dsize)
返回结果[0]
def GetCouplet(self,up_couplet,sizeu003d1):
#输入上层链接,给出下层链接。默认是一个
结果 u003d self.module_couplets.generate(textsu003d[up_couplet],使用_gpuu003dTrue,beam_widthu003dsize)
返回结果[0]
如果 __name__u003du003d"__main__":
huba u003d hubuntilus()
print(Hub.GetCouplet("小母牛飞了"))
print(Hub.GetCouplet("风吹云破天"))
在这里,我还封装了几个有趣的训练模型。
图像生成
现在我们有了对联,接下来要做的就是生成我们的图片。
这实际上非常简单。我们可以直接使用飞行员在背景图片上书写,就像水印一样。
但在此之前,我们必须选择一个漂亮的字体。
我这里还是用windows系统的(实在忍不住了,很多环境配置都是windows系统的,除了办公室没玩过,现在放寒假了......以前玩kali)
打开这个文件夹
C:\Windows\字体
让我们选择一个不错的。
我们先来看看这一代的效果
让我们再次美化他。同时,我们需要让我们的话站起来。
然后我们再画一些点,让它发光。
类 ImgUtils(对象):
def Set_Color(self):
返回随机数.randrange(255)
def 漂亮(自我,博士,宽度,高度):
对于范围内的 i (800):
绘制干扰点
dr.point(xyu003d(random.randrange((宽度)), random.randrange(高度)),
填充u003d(self.Set_Color(), self.Set_Color(), self.Set_Color()))
def CreateImg(self,text,output_pathu003d"output.png",
fontPath u003d r"C:\Windows\Fonts\STXINGKA.TTF",showu003dTrue,
字体大小 u003d 55,漂亮u003d真):
#普通文本
镜头 u003d len(文本)
画布颜色
im u003d Image.new("RGB", (fontSize * lens + 20, (fontSize + 20)), (255, 0, 0))
博士 u003d ImageDraw.Draw(im)
字体 u003d ImageFont.truetype(fontPath, fontSize)
#美化
如果(漂亮):
self.Pretty(dr,fontSize * lens + 20,(fontSize + 20))
文字颜色
dr.text((10, 10), text, fontu003dfont, fillu003d"black")
im.save(输出_path)
如果(显示):
im.show()
def CoupletImg(self,text,input\pathu003d"output.png",
fontPath u003d r"C:\Windows\Fonts\STXINGKA.TTF",showu003dTrue,
字体大小 u003d 55,漂亮u003d真):
镜头 u003d len(文本)
单词 u003d 列表(文本)
画布颜色
im u003d Image.new("RGB", ((fontSize + 20),fontSize * (lens+1) + 20), (255, 0, 0))
博士 u003d ImageDraw.Draw(im)
字体 u003d ImageFont.truetype(fontPath, fontSize)
#美化
如果(漂亮):
self.Pretty(dr,(fontSize + 20),fontSize * lens + 20)
文字颜色
步长 u003d 10
对于单词中的单词:
dr.text((10, step), word, fontu003dfont, fillu003d"black")
step +u003d10+fontSize
im.save(输出_path)
如果(显示):
im.show()
调用
然后我们调用它。
从实用程序导入 ImgUtils,HubUtils
定义主():
huba u003d hubuntilus()
imgUtils u003d ImgUtils()
up_couplet u003d "漂亮的小妹妹"
down_couplet u003d Hub.GetCouplet(up_couplet)[0]
imageUtils.CoupletImg(up\couplet,output\pathu003d"up\couplet.png")
imgUtils.CoupletImg(down_couplet, output_pathu003d"down_couplet.png")
如果 __name__ u003du003d '__main__':
主要()
效果
好像车翻了
总结
这也是我第一次写科普类型(难度)的文章。如有不足,请多多指教
另外,祝大家新年快乐~
更多推荐
所有评论(0)