不确定如何训练 ML 模型来识别静态图像

Posted

技术标签:

【中文标题】不确定如何训练 ML 模型来识别静态图像【英文标题】:Unsure how to train a ML model to recognise static imagery 【发布时间】:2018-06-25 05:36:30 【问题描述】:

我正在尝试为特定用例构建 ML 模型。我已经阅读了各种不同的库,并尝试训练我自己的分类器,但我觉得我所做的不太正确 - 对象检测的设置似乎都是基于你的对象的想法检测可以有多种形式,因此在设计训练方法时要考虑到这一点。我的用例与此不同。

我有想要识别的静态平面图像,例如书籍封面。因此,我不需要提供它的许多图像,而只需要提供它的正面外观的单个图像是有道理的。我想训练一个机器学习模型,这样我就可以在训练后向它展示那本书封面的图像,它会识别它。

训练后的书皮图像可能包括环境因素,例如不同的照明,或另一个角度,但想法是,如果书皮本身在全视图中,它应该能够被识别。

事实证明,在这里弄清楚要做什么是相当困难的。我遇到的每个指南都是为培训可能采取多种形式的对象而设计的。为我的目的改编这些指南没有成功。

我尝试使用 Turi Create 的非常简单的设置,在我为每本书拥有的每个数据点上对其进行训练,然后使用相同的数据进行验证,因为我显然没有训练和验证集。 Turi Create 负责所有培训细节,显然是为每个班级的许多示例而设计的。我觉得我在这里为了我的目的而对其进行了严重的修改。经测试,它也不适用于物体检测。

我使用 OpenCV 的关键点检测和最近邻匹配功能取得了一些有限的成功,但我的想法是会有更广泛的项目列表,可能有 10k 本书,因此在对每一个都有这样的方式。

在过去的一个月里,我一直在学习更多关于 ML 和计算机视觉的知识,但这肯定不是我的专业领域 - 我主要是一名软件开发人员。如果我能在这里得到任何建议,我将不胜感激。

【问题讨论】:

我认为 CBIR 是为了您的目的。基本上,找到关键点,kmeans 得到 BOW,然后投影得到图像特征数据库。对于单个图像,通过 BOW 查找特征和项目,然后在数据库中进行匹配。详情参见论文。这并不容易。 【参考方案1】:

您的问题没有开箱即用的答案(很抱歉),但您需要了解计算机视觉/机器学习的一些关键领域才能解决这个问题。

首先:如果你真的想留在opencv和现有的库中(比如,你不希望这变成一个算法研究项目),我建议如下:

    制作一个小型训练集。请注意,这里的训练集是指书籍封面在其“测试”环境中的图像:不同的角度、不同的照明、不同的背景杂波等。实际上这可能是 50 张图像,这不应该花费太多时间只需手动操作。 取决于您希望它成为对象检测的程度(例如,这是一张只是书皮的图片,还是一张桌子的图片,上面有书,但也可能是订书机或一些东西),你应该包括边界框。 然后使用在 OpenCV 中实现的经典 CV 算法,如 SIFT 或 SURF 或 Hough 变换。我没有详细介绍这些细节,而是将您推荐给related post about extracting Coke cans。那里有一个简洁的讨论,它可能会引导你找到正确的实现。根据您的问题描述,我怀疑这些问题非常相似(例如,您对物体采用多种形式的评论;这也不是可乐罐的问题)。

第二:如果以上内容还不够,您将进行更高级的研究项目。我仍然会推荐 Hough 变换或 SIFT 之类的东西,因为其中的关键见解是您应该能够找到一个非常擅长识别 this 书籍封面的过滤器(或类似过滤器的对象)具体来说。这意味着像典型的深度学习方法这样的东西开箱即用的用处不大。如果您真的想走这条路,请先阅读有关数据增强的内容,然后阅读有关one-shotfew-shot学习的内容,然后阅读迁移学习。这是一条漫长的道路,所以我强烈赞成我建议的第一种方法。

【讨论】:

我还要补充一点,了解测试图像中预期的视点变化量很重要。如果有很多 SIFT 和 SURF 将很难很好地匹配,因为它们会因强烈的观点变化而崩溃。如果这是一个问题,您可以使用 ASIFT 之类的工具,但请注意它会更慢。 好点@TobyCollins。即使有这种谨慎,我确实认为这种更经典的 cv 方法更适合问题的具体情况和提问者希望快速工作的愿望,而不是沿着深度学习/CNN 路径。【参考方案2】:

以下答案可能会帮助您使用卷积神经网络 (CNN) 处理/解决问题。请浏览这些videos 以了解有关该主题的更多信息。

目标:识别平面图像(例如:书籍封面)

    训练集创建:您的训练集必须包含正面和负面图像,其中正面图像是包含书籍封面的图像,而负面图像是不包含书籍封面的图像。

    正样本应该包含,书籍封面图像模糊,相对于相机的不同位置,以不同角度倾斜,具有不同背景,不同照明等(无论您想要返回为正的图像)

    负样本应该包含,没有封面的图片,只有背景等。

您也可以尝试手动创建这些数据集。

    标签:

    目前尚不清楚是否可以找到书籍封面的确切坐标。 所以在这种情况下,输出应该是所有图像中覆盖书籍封面的边界框的 X_start、Y_start、Width 和高度。 对于没有封面的图片(负样本),值为(0,0,0,0)。

    另外简单地将图像分别标记为正样本和负样本的 1 和 0。

    模型微调: 有几个可用的预训练模型。您可以为您的图像简单地微调它。

查看这些页面了解更多信息:

    Object localization and detection Binary Image Classification

【讨论】:

以上是关于不确定如何训练 ML 模型来识别静态图像的主要内容,如果未能解决你的问题,请参考以下文章

Ml.Net 图像分类增量学习

图像识别之Yolov5训练自己的模型

图像识别之Yolov5训练自己的模型

Firebase ML套件:预训练模型

打造自己的图像识别模型项目总结

CoreML 图像模型只识别给定的数据集,如何包含外部数据?