给定带有速度计的图像,赛车代理应该如何考虑车辆的速度?

人工智能 卷积神经网络 游戏-ai 光学字符识别 亚历克斯网 光流
2021-10-22 04:47:38

我正在开发一个游戏 AI,它试图掌握赛车模拟。我已经在我玩游戏的游戏画面上训练了一个 CNN (AlexNet),并将按键作为目标。由于 CNN 仅在逐帧的基础上进行预测,并且由于 GPU 内存限制,我将图像输入调整为 160x120,它无法读取速度计,因此它似乎对其当前速度没有感觉。

我想了不同的方法来解决这个问题:

  1. 将捕获的图像裁剪为速度计的大小,以英里/小时显示当前速度,并将低分辨率的游戏图像以及当前速度的相对高分辨率图像 (70x30) 输入神经网络,它根据两张图像进行预测。

  2. 由于我不知道 AlexNet 是否也可以用作 OCR,所以我的第二个想法是在裁剪后的图像上使用现有的(如 tesseract-ocr/PyTesser)并将其输出提供给全连接层。

  3. 我已经尝试实现一个光流算法,但遗憾的是,没有一个 Python 算法似乎能输出良好的实时结果。我想知道我是否可以输入当前帧以及最后一帧,并让 AlexNet 找出运动。

由于处理必须实时进行,而且我发现的 pytesser 的唯一性能评估报告的处理时间约为 100 毫秒(从未测试过)。

我的问题是:哪种方法最有效?

光流方法的优势在于人工智能也知道其他汽车在哪个方向移动。

1个回答

从研究的角度来看,选项 1 将是一个非常有趣的选项。我无法想象 CNN 目前必须具备足够的能力来学习数字的概念并以有用的方式应用它们。如果是模拟车速表,情况会有所不同。但是尝试一下并看看你可以用这种方法实现什么会很有趣。我还没有读过任何研究论文,在那里可以掌握这样的挑战。

如果您不太关心研究而是让这个项目工作,我会提出一种类似于选项 2 的方法。您提到的 OCR 工具旨在识别符号,即使是扭曲或难以阅读的符号。在您的情况下,这些数字看起来总是相同的,并且很可能总是处于固定位置。因此,对于手头的问题,使用花哨的 OCR 算法或神经网络是矫枉过正的。您可以编写一个简单的算法来裁剪速度计,使用 10 个特定内核搜索 10 种可能的模式(0 到 9)并根据结果计算速度。这可以有效地实现,而无需训练 CNN 或其他一些复杂的算法。


实现方法:

回答评论中的第一个问题。这个算法真的很简单。您的图像将由 2D 数组表示(或者如果您使用颜色,则可能是 3D 数组)。您需要做的就是找出您的数字是什么样子并存储适当的数组。你应该最终得到 10 个不同的数组,对应 10 个不同的数字。

要确定当前图片中是否有数字,您只需检查该数字的数组是否是当前图片数组的子集。数组匹配的位置也将指示数字的位置。您对所有 10 个数字执行此操作,然后可以根据结果计算速度表上显示的实际值。

如果数字看起来总是完全相同,这很容易。在这种情况下,您可以简单地查找完全匹配。如果有细微的变化,您可以查找与您的模板数组相似的图像数组部分。只需将每个像素值的差异的绝对值相加,如果它低于某个阈值,您就有了匹配项。这里的所有都是它的。

在 python 中,我喜欢使用PIL进行这种图像处理,但也有其他框架。