图像识别的起点?

Starting point for image recognition?

我有一组 274 张彩色图像(每张都是 200x150 像素)。每个图像在视觉上都是不同的。我想构建一个应用程序,它接受一个基本图像集的 up/down-scaled 版本并确定最接近的匹配。

我是一名高级软件工程师,但对图像识别完全陌生。我非常感谢关于从哪里开始的任何建议。

如果您比较的是极其相似的图像,理论上计算两幅图像之间的欧氏距离就足够了。图像必须具有相同的大小才能这样做,因此通常需要重新缩放图像才能这样做(通常较大的图像会按比例缩小)。注意aliasing issues can happen here, so pay some attention to your downsampling algorithm。如果您的图片没有相同的宽高比,也会出现问题。

但是,这在实践中几乎从来没有做过,因为它非常慢。对于尺寸为 WxH 和 3 个颜色通道的 N 张图像,它需要 N x W x H x 3 次比较,这很快就会变得不可行(考虑到许多用户可以拥有超过 1000 张尺寸 >1000x1000 的图像)。

通常我们会尝试将图像缩小为更小的阵列,以更简洁地捕获图像信息,称为 visual descriptor。例如,将一张 1024x1024x3 的图像缩减为 128 长度的矢量。这只需要为参考图像计算一次,然后存储在适当的数据结构中。然后我们可以将查询图像的描述符与参考图像的描述符进行比较。

对于长度为 L 的描述符,为我们的 N 张图像数据集计算距离的成本是 N x L 而不是原来的 N x W x H x 3

因此,问题是要找到 (a) 计算成本低且 (b) 准确捕获图像的有效描述符。这仍然是一个活跃的研究领域,但我可以提出一些建议:

  • 直方图可能是执行此操作的最简单方法,尽管它们对任何光照变化的表现都非常差,并且仅包含颜色信息,没有空间信息。确保在进行任何比较之前标准化直方图
  • 感知散列适用于非常相似的图像或略微裁剪的图像。参见 here
  • GIST 描述符功能强大,但更复杂,请参见here