【问题标题】:Creating OpenCV Haar Classifier from an existing model从现有模型创建 OpenCV Haar 分类器
【发布时间】:2014-06-02 03:27:58
【问题描述】:
我想做一个识别螺丝的应用程序。
每个螺丝的尺寸和形状都有一个标准,并且有软件可以提供每个螺丝的 360 3d 模型(例如 Autocad)
我想知道是否有任何方法可以采用现有模型(某些扩展)并从中创建Haar classifier。
如果不清楚,我不想为每个模型拍摄数千张照片。我想以某种方式重用现有模型
谢谢
【问题讨论】:
标签:
java
android
c++
opencv
object-detection
【解决方案1】:
Haar 分类器对 2D 图像进行操作,用于训练和识别。它需要一组归一化的正二维图像(带螺丝)和一组归一化的负二维图像(不带螺丝)来训练分类器。因此,如果这是您的问题,则无法直接使用 3D 模型对其进行训练。当然,您可以使用 3D 模型渲染 2D 图像,但我理解您在问题末尾的评论,这不是您想要做的。
此外,根据您的实际任务,Haar 分类器不太可能成为首选方法。一些重要的问题是:你能分割图像中的螺丝吗?图像中可以有几个螺丝吗?它是分类任务还是您知道图像中存在哪种螺钉类型?您需要本地化还是仅与识别有关?您的螺丝可能的姿势是否受到限制(或者由于分割可以预先归一化)?
请注意,Haar 分类器旨在“学习”具有相似姿势的类的不同实例的外观变化(例如不同人或多或少直立的脸,即人脸检测),而不是用于处理完全不同的姿势同一个物体,甚至不是 2D,更不用说 3D。所以它可能只适用于非常有限的场景。
更新:
一些提示可以引导您走向正确的方向:
如果你可以分割螺丝并想尝试一种简单的方法,尝试将其视为 2D 问题(假设螺丝不直立)并根据图像矩进行归一化。
如果您可以分割螺丝并希望将其视为 2D/3D 问题(将 3D 模型投影到 2D 图像),您可以查看我的(现在旧的)research 以高效外观-基于 3D 模型生成的视图的匹配。
如果您无法分割螺钉并且您知道图像中存在哪种类型的螺钉,您可以从工业机器视觉库中查看所谓的几何图案匹配,例如来自 Halcon 的基于形状的匹配。它还提供基于 CAD 类数据的培训。
如果您无法分割螺钉并且您不知道图像中存在哪种类型的螺钉,您可以训练深度卷积神经网络进行分类任务,然后使用 3. 进行验证和定位。
【解决方案2】:
简而言之:我认为这是不可能的,除非您能够根据各种光照条件真实地渲染您的 3D 模型。
Haar 和 LBP 分类器确实使用某种纹理信息,因此纯形状信息是不够的,afaik。 (因此,HoG 可能会或可能不会更适合这种方法,而不是 HAAR)
对于 haar 分类器训练,您可以使用不同的材质和光照条件以及各种姿势来渲染您的 3D 模型。但是,您需要背景图像作为负样本和渲染螺丝的背景(但之后您也可以使用 opencv_createsamples 工具将螺丝合并到背景)。
因此,根据您渲染螺丝的真实性或适当程度,您可以将它们用于您的训练。请记住,实际上,相同类型的两个螺钉看起来并不完全相同,长度可能会略有不同(取决于生产质量),并且可能存在变形或“噪音”,例如可能存在的毛刺完美的模型,也许您必须在渲染中考虑到这一点。
此外,请记住,如果 haar 和 lbp 级联分类器仅从单个姿势(如正面或侧面,而不是同时)覆盖一个类别,则它们的效果最好,这减少了使用单 3D 模型。
有时,3D 模型可以与倒角匹配结合使用,以将它们与 2D 模型进行比较。