Python中的图像识别初体验:我拿童年马里奥/瓦里奥试试手

图灵汇官网

从我小时候开始,我就非常喜欢玩Game Boy上的游戏,特别是马里奥和瓦里奥这两个平台游戏。有一次,我的祖母在看我玩游戏时,问我这是什么游戏,我告诉她这是超级马里奥。后来,当她再次看到我玩时,她问:“马里奥又回来了?这款游戏已经存在多久了?”其实,那一次我玩的是另一款游戏——瓦里奥。这段回忆激发了我对图像识别的兴趣,我想要训练一个能够准确识别游戏截图的分类器。

在本文中,我采用了两种方法:逻辑回归和卷积神经网络(使用TensorFlow后端和Keras框架)。为了简化叙述,我只展示关键代码片段,完整代码可以在文末找到。

数据准备

为了重现儿时的记忆,我选择了两款游戏:《超级马里奥大陆2-6金币》和《超级马里奥大陆3-瓦里奥大陆》。这两款游戏画面相似,增加了识别难度。我从YouTube视频中截取帧作为数据源,利用Python的pytube库下载视频,并用OpenCV库剪辑出每一帧。最终,我选取了每款游戏各5000张图像,共计10000张图像,并按照80:20的比例分为训练集和测试集。

为了避免视频开头的开场序列和菜单影响数据质量,我跳过了视频的前60秒。然而,视频结尾可能会包含一些噪声,这在后续分析中需要留意。

图像处理

在抓取帧后,我发现图像大小不一,因此将它们统一为64x64像素。为了减少逻辑回归模型的特征数量,我将图像转换为灰度图像。而对于卷积神经网络,则保留了彩色图像。

逻辑回归

我首先采用逻辑回归进行图像分类。逻辑回归是一种基础的二元分类器,适用于简单的图像分类任务。由于本文重点在于展示如何构建图像分类器,因此我没有详细解释算法细节,而是直接展示了结果。

在测试集上,逻辑回归模型的表现令人满意,尽管有些图像被误判,但整体效果良好。特别是在一些过渡屏幕和平台游戏的地图部分,模型表现较差。

卷积神经网络

接下来,我尝试使用卷积神经网络(CNN)进行分类。CNN在图像处理方面具有优势,能够更好地捕捉图像特征。我使用Keras框架构建了CNN模型,包括三个卷积层和两个全连接层。通过数据增强技术,如随机缩放和剪切变换,提高了模型的泛化能力。

CNN在测试集上的表现略逊于逻辑回归,但在快速构建的模型中依然表现不错。通过调整模型结构和参数,可以进一步提升性能。例如,可以增加更多的卷积层或改变激活函数等。

解释模型

为了更好地理解CNN的决策过程,我使用了LIME(局部可解释模型无关解释)工具。LIME能够解释模型对每个像素的依赖关系,从而帮助我们理解模型的决策逻辑。通过对正确和错误分类图像的解释,我们可以看到模型更倾向于依赖哪些区域来进行分类。

结论

本文展示了如何将一个简单的想法转化为图像分类项目,并使用逻辑回归和卷积神经网络两种方法进行实现。尽管逻辑回归在某些情况下表现更好,但卷积神经网络具有更高的潜力,尤其是在处理复杂图像时。未来可以进一步优化模型,如增加更多游戏、改进数据准备方法或引入物体检测技术。

完整代码可以在我的GitHub仓库中找到:https://github.com/erykml/mariovswario

希望这篇改写的文章能对你有所帮助。

本文来源: 图灵汇 文章作者: 赵晓月