使用机器学习创建自己的Emojis 表情
对于图像生成方向目前通常使用的方法是生成对抗网络或扩散模型。尽管这两种方法有的不同的特点,但是他们的一个共同点是模型训练对机器资源的要求很高,如果我们要以一种全新的风格创建一个图像,模型将需要从头开始训练,这可能需要更多的时间和资源,例如比较熟悉的StyleGan[3]是在拥有8个Tesla V100 gpu的NVIDIA DGX-1上训练了大约一周的时间。
但是,如果我们没有这样的硬件资源和时间怎么办?是否可以玩转图像生成? 在本文中,我们将描述一种图像生成方法,该方法无需额外的模型训练和昂贵的设备就可以在不同的图像风格之间切换。
目标
我们的主要目标是创建一个通用的嵌入提取器。 这个嵌入提取器用于比较图像和表情符号的各个部分。然后我们使用它来创建一个生成各种样式的图像的图像生成器。 在本文中,将考虑两种创建嵌入提取器的方法,这两种方法会在下面详细说明。 所以首先,我们为生成器和训练嵌入提取器准备一个数据集。
数据集
用到的数据集是包含了需要创建的头像各个部件,因为需要通过组合这些部件来生成图像。那么如何创建这个数据集呢,最直接的方法是可以手动创建每个单独的部件,但是这种方法太慢并且不灵活。所以这里选择了一个更加灵活和省时的方法:创建多个模板,并将这些模板相互组合。
我们可以创建五种类型的眼睛、嘴巴和脸型,通过组合可以为我们提供 125 种不同的表情符号。
所以这里我们准备了一个Python的脚本,来生成这些部件的模板,这些模板我们使用SVG格式保存。生成后模板以后,就需要从每个部件中提取嵌入,然后将它们保存为“avatar_part - embedding”对。通过这个配对,我们就能够在不同的艺术风格之间快速切换,而无需额外的模型训练。我们可以通过两种不同的方法来创建这个嵌入:1、通过预训练的 ResNet50 ;2、通过定制的自编码器。预训练ResNet50 不需要额外的训练,但自编码器则需要重新训练会花费一些时间。
为了达到更好的效果,对于预训练的ResNet50 可能还需要进一步的微调,但是无论使用那种方式我们都需要一些数据集进行训练或微调,所以还需要有一个数据集来支持这样工作。所以这里我们选择了 CELEBA 的数据集(这个应该算是最大的人脸数据集了)。使用脚本将数据集的人脸分割成段并将它们保存到文件夹中。现在,我们有了嘴巴数据集、眼睛数据集等。在这个脚本中使用 BiSeNet [1] 进行人脸分割,因为这些都是现成的不需要我们额外的工作。
模型架构
架构是通过一个输入层、一个输出层和三个隐藏层来表示。输入层获取一张图像,将它转换成306x306像素大小。
在第一个隐藏层中,通过BiSeNet[1]对人脸进行分段分割。
在第二个隐藏层中是嵌入提取模型,他返回每个部件的提取的特征
在第三个隐藏层中,我们将第二个隐藏层的的每一个输出与每个可能的表情符号部分进行比较。然后通过计算余弦相似度实现比较
第三个隐藏层的输出是与面部余弦相似度最大的表情符号。最后,输出层是一个创建表情函数,将这些部分进行组合生成完整的表情符号,整个流程如下:
完整文章:
https://avoid.overfit.cn/post/65e58d9868e349ed8380b6a980112dba