基于图片生成古诗

基于图片生成古诗

实现方法

我们在看图说话时,一般都是先看看图片上有什么内容,比如一张图里有山有水还有很多的植物,那我们对这张图的第一印象就是一张风景图,然后我们再根据图片上某一个具体的景物做详细的描述。

想让机器看图生成古诗,可以表示为如下步骤:

  1. 对图像分类,比如这个图像是风景图,再确切一点,是有湖、骛、荷花的风景图。这样就可以得到这个图的关键词。
  2. 由上一步得到的关键词,通过古诗生成模型,来生成有关图片的古诗。

下面,将把这个项目分成以下几个部分:图片分类、古诗生成、网页搭建。

图片分类

自己重新训练47%准确率

采用ResNet50预训练模型,微调后准确率在65%左右

图片——>标签——>关键词

如:输入图像

image-20240616202651925

得到类别和具体标签:

image-20240616202721506

诗句生成

关键词的构造

在上一节得到了具体类别后,要建立一个标签(英文)到关键词(字或者词)的映射,根据语义手动构造即可

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
29
30
31
32
33
34
def write_label_key_dict():
fileHandle = open('label_key_dict.txt', 'wb')
# 图片标签与key_word对应关系
l1 = ['江海湖', '鱼游水', '鱼']
l2 = ['春花', '秋落', '春红', '春风', '秋凉', '枝', '桃']
l3 = ['杯', '盘']
l4 = ['桃', '枝']
l5 = ['金', '盘']
l6 = ['飞', '飞高']
l7 = ['山', '野']
l8 = ['楼', '高', '阁']
l9 = ['树', '林', '枝']
l10 = ['车', '车路']
label_key_dict = {'beaver': l1, 'dolphin': l1, 'otter': l1, 'seal': l1, 'aquarium_fish': l1, 'flatfish': l1,
'ray': l1, 'shark': l1, 'trout': l1, 'whale': l1, 'orchid': l2, 'poppie': l2, 'rose': l2,
'sunflower': l2, 'tulip': l2, 'bottle': l3, 'bowl': l3, 'can': l3, 'cup': l3,
'plate': l3, 'apple': l4, 'mushroom': l4, 'orange': l4, 'pear': l4, 'sweet_pepper': l4,
'clock': l5, 'computer keyboard': l5, 'lamp': l5, 'telephone': l5, 'television': l5,
'bed': l5, 'chair': l5, 'couch': l5, 'table': l5, 'wardrobe': l5,
'bee': l6, 'beetle': l6, 'butterfly': l6, 'caterpillar': l6, 'cockroach': l6,
'bear': l7, 'leopard': l7, 'lion': l7, 'tiger': l7, 'wolf': l7,
'bridge': ['桥'], 'castle': l8, 'house': l8, 'road': ['路', '道'], 'skyscraper': l8,
'cloud': ['云'], 'forest': ['林'], 'mountain': ['山'], 'plain': ['平'], 'sea': ['海'],
'camel': ['沙'], 'cattle': l7, 'chimpanzee': l7, 'elephant': l7, 'kangaroo': l7,
'fox,': l7, 'porcupine': l7, 'possum': l7, 'raccoon': l7, 'skunk': l7,
'crab': ['鱼'], 'lobster': ['鱼'], 'snail': ['地'], 'spider': ['地'], 'worm': ['地'],
'baby': ['儿', '小子'], 'man': ['夫'], 'womam': ['女'], 'boy': ['郎'], 'girl': ['女'],
'crocodile': l7, 'dinosaur': l7, 'lizard': l7, 'snake': l7, 'turtle': l7,
'hamster': l7, 'mouse': l7, 'rabbit': l7, 'shrew': l7, 'squirrel': l7,
'maple_tree': l9, 'oak_tree': l9, 'palm_tree': l9, 'pine_tree': l9, 'willow_tree': l9,
'bicycle': l10, 'bus': l10, 'motorcycle': l10, 'pickup truck': l10, 'train': l10,
'lawn_mower': l10, 'rocket': l10, 'streetcar': l10, 'tank': l10, 'tractor': l10}
pickle.dump(label_key_dict, fileHandle)
fileHandle.close()

数据预处理

样本全部选择的是五言绝句。

把样本全部处理成形如([千山鸟飞绝,万径人踪灭,孤舟蓑笠翁,独钓寒江雪])的形式

提取诗句中的所有字,统计频率,按照出现次数递减排序,给这些字从0开始编号

word ——>id ——>word

由此也可以得到诗句的向量(对于诗句,开头字符BOS定为’[‘(id =2),结尾字符EOS定为’]’(id =3))都是五言绝句,不需要填充

使用word2vec对字向量训练,输入一个关键字能得到与其语义相近的关键字

上一节得到的图像标签”castle”—(label_key_dict)—>[‘楼’, ‘高’, ‘阁’], 可通过word2vec得到其相近的关键字

数据输入与输出

X(Decoder输入:诗句)

Y(Decoder输出:诗句)

Z(Encoder输入:关键字构成的向量)
下图是X和Y的构造方法

image-20240616205650612

对关键字向量Z,每个诗句对应固定容量为4的字向量,通过图片得到的标签可再经过word2vec得到与其词义相近的字,组成关键字向量。

模型构建

采用transformer模型


基于图片生成古诗
https://wendyflv.github.io/2024/06/07/基于图片生成古诗/
作者
Wendyflv
发布于
2024年6月7日
许可协议