4 年前,我发布了这个问题,但不幸的是,我得到了一些超出我技能水平的答案。我刚刚参加了一个构建巡回会议,他们谈到了机器学习,这让我想到了使用 ML 作为我的问题的解决方案的可能性。我发现了这个,但我认为它对我没有帮助,因为它的范围很窄。
这是我想要实现的目标:
我有一个源图像:
并且我想在上图中包含以下符号之一(如果有):
比较需要支持轻微的失真、缩放、颜色差异、旋转和亮度差异。
要匹配的符号数量最终将至少大于 100。
ML 是解决这个问题的好工具吗?如果是这样,任何开始提示?
据我所知,Project Oxford (MS Azure CV API) 不适合您的任务。他们的 API 非常专注于人脸相关的任务(检测、验证等)、OCR 和图像描述。显然你不能扩展他们的模型或从现有的模型中训练新的模型。
但是,即使我不知道针对您的对象检测问题的开箱即用解决方案;您可以尝试一些足够简单的方法,这会给您一些起点结果。
例如,这是一个可以使用的简单方法:
1)创建你的数据集: 这可能是更乏味的一步,但自相矛盾的是,这是至关重要的一步。我会假设你有大量的图像可以使用。你需要做的是选择一个固定的窗口大小并提取正面和负面的例子。
如果数据集中的某些图像大小不同,则需要将它们重新缩放为通用大小。您不需要对尺寸过于疯狂,可能 30x30 的图像就足够了。为了让事情变得更容易,我也会将图像转换为灰度。
2)选择一个分类算法并训练它: 那里有大量的分类算法。但如果你是机器学习的新手,我会选择我最了解的一个。记住这一点,我会检查逻辑回归,它给出了不错的结果,对于初学者来说很容易,并且有很多库和教程。例如,this或this。一开始我会说专注于二分类问题(比如图片中是否有 UD 标志),当你掌握了这个问题后,你可以跳转到多分类案例。也有相关资源,或者您始终可以为每个徽标创建多个模型,并分别为每个模型运行此配方。
要训练您的模型,您只需读取步骤 1 中生成的图像并将它们转换为向量并相应地标记它们。那将是为您的模型提供数据的数据集。如果您使用灰度图像,则向量中的每个位置将对应于 0-255 范围内的像素值。根据算法,您可能需要将这些值重新调整到 [0-1] 范围内(这是因为某些算法在该范围内的值表现更好)。请注意,在这种情况下重新调整范围相当容易(new_value = value/255)。
您还需要拆分数据集,保留一些示例用于训练,一个子集用于验证,另一个用于测试。同样,有不同的方法可以做到这一点,但我会尽可能天真地回答这个问题。
3)执行检测: 现在让我们开始有趣的部分。给定任何您想要运行模型并在有徽标的图片中生成坐标的图像。有不同的方法可以做到这一点,我将描述一种可能不是最好的也不是更有效的方法,但在我看来它更容易开发。
您将扫描图片,在“窗口”中提取像素,将这些像素重新缩放为您在步骤 1 中选择的大小,然后将它们提供给您的模型。
如果模型给你一个肯定的答案,那么你在原始图像中标记那个窗口。由于徽标可能以不同的比例出现,您需要使用不同的窗口大小重复此过程。您还需要调整窗口之间的空间量。
4)冲洗并重复: 在第一次迭代中,您很可能会得到很多误报。然后你需要把这些作为负面例子并重新训练你的模型。这将是一个迭代过程,希望在每次迭代中,误报和漏报都会越来越少。
一旦你对你的解决方案感到相当满意,你可能想要改进它。您可能想尝试其他分类算法,例如SVM或深度学习人工神经网络,或者尝试更好的对象检测框架,例如Viola-Jones。此外,您可能需要使用交叉验证来比较所有解决方案(您实际上可以从一开始就使用交叉验证)。到现在为止,我敢打赌,您将有足够的信心使用 OpenCV 或其他现成的框架,在这种情况下,您将对幕后发生的事情有一个公平的了解。
你也可以忽略所有这些答案,去学习一个像这样的 OpenCV 对象检测教程。或者从像这样的另一个问题中得到另一个答案。祝你好运!