使用 Azure 机器学习检测图像中的符号

Use Azure Machine learning to detect symbol within an image

4 年前,我在 Azure 网站上发布了 this question and got a few answers that were unfortunately outside my skill level. I just attended a build tour conference where they spoke about machine learning and this got me thinking of the possibility of using ML as a solution to my problem. i found this,但我认为它对我没有帮助,因为它的范围非常狭窄。

这是我想要实现的目标:

我有一张源图片:

我想知道上图中包含以下哪个符号(如果有):

比较需要支持轻微失真、缩放、颜色差异、旋转和亮度差异。

要匹配的符号数最终至少会大于 100。

机器学习是解决这个问题的好工具吗?如果是这样,有什么入门技巧吗?

据我所知,Project Oxford (MS Azure CV API) 不适合您的任务。他们的 API 非常专注于人脸相关任务(检测、验证等)、OCR 和图像描述。显然您不能扩展他们的模型或从现有模型训练新模型。

但是,即使我不知道针对您的对象检测问题的现成解决方案;有足够简单的方法可供您尝试,这会给您一些起点结果。

例如,您可以使用以下简单方法:

1) 创建数据集: 这可能是更乏味的一步,但矛盾的是,这是至关重要的一步。我假设您有大量图像可供使用。你需要做的是选择一个固定的 window 大小并提取正面和负面的例子。

如果数据集中的某些图像大小不同,您需要将它们重新调整为通用大小。您不需要对尺寸过于执着,可能 30x30 图片就足够了。为了让事情变得更容易,我也会把图像变成灰度。

2) 选择一个分类算法并训练它: 那里有大量的分类算法。但是如果你是机器学习的新手,我会选择我最了解的。牢记这一点,我会检查逻辑回归,它会给出不错的结果,这对初学者来说很容易,并且有很多库和教程。例如,this one or this one. At first I would say to focus in a binary classification problem (like if there is an UD logo in the picture or not) and when you master that one you can jump to the multi-class case. There are resources for that too 或者您始终可以有多个模型,每个徽标一个,并且 运行 每个模型分别有此配方。

要训练你的模型,你只需要读取在步骤 1 中生成的图像并将它们转换为向量并相应地标记它们。那将是为您的模型提供数据集的数据集。如果您使用的是灰度图像,那么向量中的每个位置都对应于 0-255 范围内的像素值。根据算法,您可能需要将这些值重新缩放到 [0-1] 范围内(这是因为某些算法对该范围内的值执行得更好)。请注意,在这种情况下重新调整范围相当容易 (new_value = value/255)。

您还需要拆分您的数据集,保留一些示例用于训练,一个子集用于验证,另一个用于测试。同样,有不同的方法可以做到这一点,但我尽可能让这个答案天真。

3) 执行检测: 那么现在让我们开始有趣的部分。给定您想要 运行 模型的任何图像,并在图片中有徽标的地方生成坐标。有不同的方法可以做到这一点,我将描述一种可能 不是最好的也不是更有效的方法 ,但在我看来它更容易开发。

您将扫描图片,提取 "window" 中的像素,将这些像素重新缩放为您在步骤 1 中选择的大小,然后将它们提供给您的模型。

如果模型给你一个肯定的答案,那么你在原始图像中标记 window。由于徽标可能以不同的比例显示,因此您需要使用不同的 window 尺寸重复此过程。您还需要在 windows.

之间调整 space 的数量

4) 冲洗并重复: 在第一次迭代中,您很可能会得到很多误报。然后您需要将这些作为负面示例并重新训练您的模型。这将是一个迭代过程,希望在每次迭代中,您的误报和漏报会越来越少。

一旦您对自己的解决方案感到相当满意,您可能想要改进它。您可能想尝试其他分类算法,如 SVM or Deep Learning Artificial Neural Networks, or to try better object detection frameworks like Viola-Jones. Also, you will probably need to use crossvalidation 来比较您的所有解决方案(您实际上可以从一开始就使用交叉验证)。到这一刻,我敢打赌你会足够自信地想要使用 OpenCV 或其他随时可用的框架,在这种情况下,你会对幕后发生的事情有一个公平的理解。

此外,您也可以忽略所有这些答案,而去学习像这样的 OpenCV 对象检测教程 one. Or take another answer from another question like this one。祝你好运!