2

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

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

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

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

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

我使用 OpenCV 的关键点检测和最近邻匹配功能取得了一些有限的成功,但想法是会有更广泛的项目列表,可能是 10k 本书,因此以这种方式进行图像比较是不切实际的在每一个上。

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

4

2 回答 2

2

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

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

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

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

于 2018-01-16T17:51:43.987 回答
1

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

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

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

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

    • 负样本应包含没有书籍封面的图像,只有背景等。

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

  1. 标签:

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

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

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

查看这些页面以获取更多信息:

  1. 目标定位和检测
  2. 二值图像分类
于 2018-01-17T06:24:13.480 回答