关于opencv:使用Azure Machine学习来检测图像中的符号

Use Azure Machine learning to detect symbol within an image

4年前,我发布了这个问题,得到了一些超出我技能水平的答案。我刚刚参加了一个构建之旅会议,他们谈到了机器学习,这让我想到了使用ML解决我的问题的可能性。我在Azure网站上找到了这个,但我认为它对我没有帮助,因为它的范围非常窄。

以下是我想要达到的目标:

我有一个源图像:

source image

我想在上面的图片中包含以下哪一个符号(如果有的话):

symbols

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

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

ML是解决这个问题的好工具吗?如果有的话,有什么开始的建议吗?


据我所知,牛津项目(MS Azure cv api)不适合您的任务。他们的API非常关注与人脸相关的任务(检测、验证等)、OCR和图像描述。显然,你不能扩展他们的模型,也不能从现有的模型中训练新的模型。好的。

然而,即使我不知道一个现成的解决方案来解决您的对象检测问题;有足够简单的方法,您可以尝试,这将给您一些起点结果。好的。

例如,这里有一个简单的方法可以使用:好的。

1)创建数据集:这可能是更为乏味的一步,矛盾的是,这是至关重要的一步。我假设你有很多图片可以使用。您需要做的是选择一个固定的窗口大小并提取正负示例。enter image description here好的。

如果数据集中的某些图像大小不同,则需要将其重新调整为公用大小。你不需要太疯狂的尺寸,大概30x30的图片就足够了。为了使事情更简单,我也会把图像变成灰度。好的。

2)选择分类算法并对其进行培训:有大量的分类算法。但是如果你是新来的机器学习者,我会选择一个我最了解的。记住这一点,我会查看逻辑回归,它会给出不错的结果,对于初学者来说这很容易,并且有很多库和教程。例如,这个还是这个。首先,我要说的是集中在一个二进制分类问题上(比如图中是否有一个UD标志),当你掌握了这个问题,你可以跳到多类的情况下。也有相关的资源,或者您可以始终拥有多个模型,每个徽标一个模型,并分别为每个模型运行这个配方。好的。

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

您还需要拆分数据集,为培训保留一些示例,为验证保留一个子集,为测试保留另一个子集。同样,有不同的方法可以做到这一点,但我会尽可能地保持这个答案的幼稚。好的。

3)执行位置检测。现在让我们开始的乐趣的一部分。给你你想要的任何图像的坐标模型和运行产生的图片在那里是一个标志。有不同的方式,这样做,我想描述的困境可能是最好的那一个NOR更高效,但它已经在我的个人的意见。

你是要扫描的图片,提取的像素在一"窗口",这些像素的重新标度的大小你选择在步骤1,然后送他们到你的模型。

Extracting windows to feed the model

如果你的答案,然后积极的模型给你一个窗口的原始图像中的标记。自从你的出现在不同的尺度标志可能需要重复这个过程在不同的窗口大小。你将需要调整的金额之间的窗口空间。

4)重复出来。在第一次迭代,它很可能你会得到了很多假阳性。然后你需要把那些负面的例子和retrain AS模型。这将是在每个迭代的迭代过程,希望对你会有少少少的假阳性和假阴性。

祝你一次你是合理的解决方案,你可能想提高它。你可能想尝试其他类分类算法SVM学习人工神经网络或深、或尝试更好的目标检测框架样中提琴-琼斯。所以,你可能会需要使用交互想把你所有的解决方案(你可以使用交互是从一开始)。在这个时刻,我打赌你会有足够的,你想使用或准备使用opencv的一个框架和案例,你会有一个公平的理解什么事下罩。

所以,你只是去回答所有这些disregard opencv目标检测和在一个样本教程。另一个问题的答案或把另一个从一个样本。祝你好运!

好的。