自从我前天进入阿里天池实验室,我就被他吸粉了,嫖了他的服务器和算力,今天看到有个月饼节小活动,刚好自己的模型在训练,有时间了,另外好像天池这个项目点赞topn可以嫖件天池的体恤,刚好没衣服穿了, 就花了几十分钟写了这个天池小活动的代码~欢迎来Star哈哈哈。
活动要求
画月饼+配文字
项目演示
自然语言处理文本生成之对联上下联对答:
上联:良辰良景良偶
文本生成下联:佳男佳女佳缘
自然语言处理文本生成之依图生文:
给出任何一张图片:
生成一段诗歌:

多级轮询月饼对话
多级对话,待会代码讲解再演示多级的。
自动生成月饼
会本地循环生成多个月饼
代码讲解
不要惊讶我几十分钟写完代码。请看作者的名字~cv调包侠
导入库 首先我们需要导入画图和数据计算的相关库。
import random
from numpy import sin, cos, pi
import matplotlib.pyplot as plt
from matplotlib.patches import Arc, Circle, Wedge
from matplotlib.font_manager import FontProperties
import paddlehub as hub
import matplotlib
import os
颜色字码
list0 = ['#F0F8FF', '#FAEBD7', '#00FFFF', '#7FFFD4', '#F0FFFF', '#F5F5DC', '#FFE4C4', '#000000', '#FFEBCD', '#0000FF',
'#8A2BE2', '#A52A2A', '#DEB887', '#5F9EA0', '#7FFF00', '#D2691E', '#FF7F50', '#6495ED', '#FFF8DC', '#DC143C',
'#00FFFF', '#00008B', '#008B8B', '#B8860B', '#A9A9A9', '#006400', '#BDB76B', '#8B008B', '#556B2F', '#FF8C00',
'#9ACD32', '#FFFF00', '#FFA500', '#F5DEB3', '#D02090', '#EE82EE', '#40E0D0', '#FF6347', '#D8BFD8', '#008080',
'#FFFFF0', '#F0E68C', '#E6E6FA', '#FFF0F5', '#7CFC00', '#FFFACD', '#ADD8E6', '#F08080', '#E0FFFF', '#FAFAD2',
'#D3D3D3', '#90EE90', '#FFB6C1', '#FFA07A', '#20B2AA', '#87CEFA', '#8470FF', '#778899', '#B0C4DE', ' #FFE4B5',
'#DA70D6', '#EEE8AA', '#98FB98', '#AFEEEE', '#D87093', '#CD853F', '#FFC0CB', '#DDA0DD', '#B0E0E6', '#800080',
'#FF0000', '#BC8F8F', '#4169E1', '#8B4513', '#FA8072', '#F4A460', '#9932CC', '#8B0000', '#E9967A',
'#8FBC8F'] # 80种不同的颜色
def lucky(self):
length = 20
R = 3 ** 0.5 * length / (3 ** 0.5 * cos(pi / 12) - sin(pi / 12))
r = 2 * sin(pi / 12) * R / 3 ** 0.5
arc1 = Arc([0, length], width=2 * r, height=2 * r,
angle=0, theta1=30, theta2=150, ec=self.pattern, linewidth=4) # ec为线条颜色,fc为填充颜色,可以自由替换
arc2 = Arc([-length / 2, length / 2 * 3 ** 0.5], width=2 * r, height=2 * r,
angle=0, theta1=60, theta2=180, ec=self.pattern, linewidth=4)
arc3 = Arc([-length / 2 * 3 ** 0.5, length / 2], width=2 * r, height=2 * r,
angle=0, theta1=90, theta2=210, ec=self.pattern, linewidth=4)
arc4 = Arc([-length, 0], width=2 * r, height=2 * r, angle=0, theta1=120, theta2=240,
ec=self.pattern, linewidth=4) # ec为线条颜色,fc为填充颜色,可以自由替换
arc5 = Arc([-length / 2 * 3 ** 0.5, -length / 2], width=2 * r, height=2 * r,
angle=0, theta1=150, theta2=270, ec=self.pattern, linewidth=4)
arc6 = Arc([-length / 2, -length / 2 * 3 ** 0.5], width=2 * r, height=2 * r,
angle=0, theta1=180, theta2=300, ec=self.pattern, linewidth=4)
arc7 = Arc([0, -length], width=2 * r, height=2 * r, angle=0, theta1=210, theta2=330,
ec=self.pattern, linewidth=4)
arc8 = Arc([length / 2, -length / 2 * 3 ** 0.5], width=2 * r, height=2 * r,
angle=0, theta1=240, theta2=360, ec=self.pattern, linewidth=4)
arc9 = Arc([length / 2 * 3 ** 0.5, -length / 2], width=2 * r, height=2 * r,
angle=0, theta1=270, theta2=390, ec=self.pattern, linewidth=4)
arc10 = Arc([length, 0], width=2 * r, height=2 * r, angle=0, theta1=300, theta2=420,
ec=self.pattern, linewidth=4)
arc11 = Arc([length / 2 * 3 ** 0.5, length / 2], width=2 * r, height=2 * r,
angle=0, theta1=330, theta2=450, ec=self.pattern, linewidth=4)
arc12 = Arc([length / 2, length / 2 * 3 ** 0.5], width=2 * r, height=2 * r,
angle=0, theta1=0, theta2=120, ec=self.pattern, linewidth=4)
circle = Circle((0, 0), R, ec=self.center, fc=self.roundt, linewidth=4)
wedge1 = Wedge([-2, 2], R - 5, 90, 180,
ec=self.edge, fc=self.sector, linewidth=4)
wedge2 = Wedge([-5, 5], R - 12, 90, 180, ec=self.largefan,
fc=self.largefan_0, linewidth=4) # ec为线条颜色,fc为填充颜色,可以自由替换
wedge3 = Wedge([-2, -2], R - 5, 180, 270, ec=self.edge,
fc=self.sector, linewidth=4)
wedge4 = Wedge([-5, -5], R - 12, 180, 270, ec=self.largefan,
fc=self.largefan_0, linewidth=4)
wedge5 = Wedge([2, -2], R - 5, 270, 360, ec=self.edge,
fc=self.sector, linewidth=4)
wedge6 = Wedge([5, -5], R - 12, 270, 360, ec=self.largefan,
fc=self.largefan_0, linewidth=4)
wedge7 = Wedge([2, 2], R - 5, 0, 90, ec=self.edge, # ec为线条颜色,fc为填充颜色,可以自由替换
fc=self.sector, linewidth=4)
wedge8 = Wedge([5, 5], R - 12, 0, 90, ec=self.largefan,
fc=self.largefan_0, linewidth=4)
art_list = [arc1, arc2, arc3, arc4, arc5, arc6, arc7, arc8, arc9, arc10, arc11, arc12]
art_list.extend([circle, wedge1, wedge2, wedge3, wedge4, wedge5, wedge6, wedge7, wedge8])
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_aspect('equal')
for a in art_list:
ax.add_patch(a)
其中 [0, length] 是这个Arc弧线的圆心,因为这个Arc类是一个椭圆形的一部分,所以其包含圆心、横轴、纵轴等参数,length变量就是arc1圆心的纵坐标,width=2r 和 height=2r 就说明这个椭圆的纵轴和横轴长度相等,其是一个圆,而不是椭圆,变量 r 就是这个圆的半径。angle=0 就是我们不需要对这个圆进行旋转,theta1=30 和 theta2=150 是指明这个弧线的起始角度和终止角度,这里的角度分别是30度和150度。而 ec=‘orange’ 和linewidth=4 分别指边线的颜色和线条宽度,颜色我们设为橙色,宽度为4。而这些弧线的效果图如图2所示,在图中笔者标出了arc1、arc5和arc9这3条弧线的位置,所有弧线按照逆时针方向排列。这些位置大同小异,大家只要计算好其各自的位置参数就行,这里就不再赘述了。
然后我们再画一个圆,这个圆是月饼的主体部分,其圆心和整个月饼的中心是重合的,圆心位置我们选在了坐标原点
这里变量R就是这个大圆的半径,边线颜色(ec)设置为橙色,表面颜色设为白色。 接下来我们再画上一些花纹,这些花纹主要由8个扇形组成,其中有4个大的扇形和4个小的扇形,我们先画一个,代码如下:
为了在图片上显示中文,需要先加载Alibaba-PuHuiTi-Medium字体。
月饼绘制, 接下来我们要画弧线,弧线是月饼边缘的花纹:
plt.axis('off')
font_set = FontProperties(fname="./Alibaba-PuHuiTi-Medium.ttf", size=15)
plt.text(-8.4, -7, '中秋\n快乐', bbox=dict(boxstyle='circle', fc=self.night0, ec=self.night, linewidth=4),
fontproperties=font_set, fontsize=50, color=self.night1) ##ec为线条颜色,color为字体颜色,可以自由替换
plt.text(-45, -33, self.blessing, fontproperties=font_set, fontsize=28, color=self.blessing_0)
plt.ylim([-35, 35])
plt.xlim([-35, 35])
name = 'test' + str(self.number) + '.png' # 生成图片序号
plt.savefig(name) # 保存生成的图片
plt.show()
def plt_show():
pattern = random.choice(list0) # 随机选择一种颜色
center = random.choice(list0)
roundt = random.choice(list0)
edge = random.choice(list0)
sector = random.choice(list0)
largefan = random.choice(list0)
largefan_0 = random.choice(list0)
night = random.choice(list0)
night0 = random.choice(list0)
night1 = random.choice(list0)
blessing = random.choice(list1[0])
blessing_0 = random.choice(list0)
number = random.randint(0, 1000)
good = Battery(pattern, center, roundt, edge, sector, largefan, largefan_0, blessing, blessing_0, number, night,
night0, night1)
good.lucky()
函数接口
使用paddlehub的对联,按图生文,轮询对话接口
PLATO2是一个超大规模生成式对话系统模型。它承袭了PLATO隐变量进行回复多样化生成的特性,能够就开放域话题进行流畅深入的聊天。据公开数据,其效果超越了Google 于2020年2月份发布的 Meena和Facebook AI Research于2020年4月份发布的Blender的效果。plato2_en_base包含310M参数,可用于一键预测对话回复,该Module仅支持使用GPU预测,不支持CPU。
ernie_tiny_couplet是一个对联生成模型,它由ernie_tiny预训练模型经PaddleHub TextGenerationTask微调而来,仅支持预测,如需进一步微调请参考PaddleHub text_generation demo。
ERNIE-GEN 是面向生成任务的预训练-微调框架,首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。此外, ERNIE-GEN 采样多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。ernie_gen_lover_words采用网络搜集的情诗、情话数据微调,可用于生成情话。
if mode == 2:
list1 = [input('请输入对联的上联:')]
list1 = [list1]
plt_show()
list1 = module.generate(texts=list1[0], use_gpu=True, beam_width=1)
plt_show()
if mode == 1:
list1 = readingPicturesWritingPoems.WritingPoem(image="./test1.jpg", use_gpu=True)
list1 = [[list1[0]['Poetrys']]]
print(list1)
plt_show()
if mode == 4:
with module1.interactive_mode(max_turn=6):
while True:
human_utterance = input("[Human]: ").strip()
robot_utterance = module1.generate(human_utterance)
print("[Bot]: %s" % robot_utterance[0])
list1 = [robot_utterance[0]]
plt_show()
if mode == 3:
new = int(input('请输入要制作月饼的个数:'))
for i in range(new):
plt_show()
多级轮询:
人:
机:
人:
机:
等等。。。
演示结束,以娱乐为主~
欢迎到阿里云给我Star~~~阿里云传送门:https://tianchi.aliyun.com/competition/entrance/531836/forum
欢迎关注公众号:
作者:cv调包侠