正文
图 5:使用它们的惯用背景颜色所描绘的 18 种属性的精灵宝可梦。
本文检测了卷积神经网络(也称为 ConvNet)在指定精灵宝可梦游戏中的精灵后,执行宝可梦属性分类任务的表现。我将会展示收集的数据、预处理和训练流程,并会以所选模型的性能指标结束。所有的数据、实现代码、结果,以及对所有步骤做出解释的 Jupyter Notebook 都可以在一个 GitHub 库找到:
我将使用游戏精灵来训练模型。而从 Veekun(2017)能够获得数据集(精灵包)。这些精灵包拥有游戏的第 1 代到第 5 代的精灵。虽然又发布了新的游戏(和新的妖怪),但它们使用了三维动画模型,因此从游戏中提取资源会更困难,将其以转换成机器学习方法所支持的格式也会更难。因此本文将仅使用到第五代游戏为止的精灵宝可梦(共有 649 个)。
随即可以发现,游戏机硬件和软件的不同,造成了游戏间细节级别上的差异。任天堂发布的第一代掌上游戏机 Game Boy,尽管在数据集中存在一些色调信息,但单个精灵的色调几乎没有发生变化(如 Bulbasaur 是绿色,Charmander 是红色,而 Squirtle 是蓝色;如图 6 所示)。随着研究从 Game Boy Advance 进展到到任天堂 DS,我们能发现其细节水平不仅体现在色调方面,还体现在形状方面。
初看之下,我们还能识别图像分类任务中所遇到的一些典型问题。这些图像大小不同。尽管所有的图像的长宽比保持在 1:1,但它们已经从第一代的 40 像素宽度发展到了第五代的 96 像素宽度(请注意图 6 中每个精灵边界的刻度)。
图 6. 正如游戏和各代版本中所见,这是三个精灵宝可梦的变体样本。
此外,并非所有精灵在每个图像中都会填充相同的空间,最老一代的精灵似乎会填充图像相对更大的部分。这在相同代之间也会发生,特别是在更新游戏中,往往会涉及每个精灵宝可梦的大小差异以及进化(图 7)。
图 7:第五代游戏中的妙蛙种子的进化路线。随着精灵宝可梦进化,它也会变大,就会填充图像中更大的部分。
图像居中(Image Centering)
为了解决这个问题,我们要应用一些计算机视觉技术来识别图像中的主要对象,给它定下边界框,并将图像居中在这个框上。这个流程是:
1. 将图像转换为灰度。
2. 在图像上应用 Sobel 滤波器来突出精灵的边缘。Sobel 滤波器是一个 3×3 的卷积核(convolutional kernel,之后会介绍这些便利的工具的更多信息,也也可参见 Sckikit-Image, 2017),其会尽量逼近图像的梯度。对于给定的图像'A',Sobel 算子被定义为:
3. 填充图像中的孔,获得精灵宝可梦的轮廓。
4. 计算轮廓的凸包(Convex Hull),即包括轮廓中所有像素的最小凸多边形。
5. 根据之前计算的凸包定义矩形边界框。
6. 选择边界框内的内容,并将大小调整为 64 x 64 像素。
在遵循上述描述的流程之后,我们得到了新的精灵,其使图像上的精灵的填充率最大化。这些步骤是通过使用 skimage 完成的(skimage 是一个用于 Python 编程语言的图像处理库)。图 8 显示了第一代三个初始精灵和妙蛙花(Venusaur)的居中转换流程。
我们所提出的流程对于当前所面临的任务非常有效。由于其有着非常简洁的白色背景且我们的图片是非常简单的精灵,这样的结果也在我们的预料之中。
最后,让我们将我们的方法应用于我们所有的精灵和图像。图 9 显示了一群精灵宝可梦的结果。
图 9:几种第五代精灵宝可梦的居中处理结果
目标变量
现在我们有了全部的精灵宝可梦的图像来建立我们的图像数据集,我们必须根据我们想要预测的变量对其进行分类。在这篇论文中,我们将尝试仅使用每个精灵宝可梦的图像并根据其正确的属性对其分类。例如,在图 10 中,我们尝试使用边界框内的图像将精灵宝可梦分为 18 种属性之一,试图匹配其真实属性(在每个精灵宝可梦下方显示)。
图 10:精灵宝可梦和其各自的属性的样本。 顶行:妙蛙草 (左) 和波波 (右)。底行:大钢蛇 (左) 和菊石神 (右)
但是有一个问题。大多数精灵宝可梦,像图 9 和 图 10 的那些精灵宝可梦有双重属性。也就是说,它的真实属性将是那 18 种属性列表里的两种不同属性的组合。例如,在图 10 中,妙蛙草是草属性和毒属性,同时具有两种属性的优缺点。
考虑到这一点,我们必须对组合的属性进行目标分类。即使我们忽视属性顺序(也就是说[火与岩石] 和 [岩石与火] 是一个属性),我们最终还是会得到 171 个可能的类。(事实上,这个数字会小一点,154,因为并不是所有的组合都在游戏中存在)。
更糟的是,一些组合非常少见(图11),只有一个或者两个精灵宝可梦,从而限制了可用的学习样本。
图11:一些罕见的属性组合。顶行:熔岩蜗牛(Magcargo (左) )和溜溜糖球(Surskit (右)); 底行: 花岩怪(Spiritomb (左) )和席多蓝恩(Heatran (右))