您需要一个程序,从经验中有机地学习和提高分类准确性。
我建议深度学习,深入学习这会成为一个微不足道的问题。
您可以在Tensorflow上重新训练初始v3模型:
如何重新定义新类别的初始层 。
在这种情况下,您将训练卷积神经网络将对象分类为可口可乐可以与否。
这可能是一个非常幼稚的想法(或者可能根本不起作用),但所有可乐罐的尺寸都是固定的。因此,如果相同的图像同时包含罐头和瓶子,那么您可以通过尺寸考虑将它们分开(瓶子会更大)。现在由于缺少深度(即3D映射到2D映射),瓶子可能看起来缩小并且没有尺寸差异。您可以使用恢复一些深度信息 立体成像 然后恢复原始大小。
另一种方法是使用。提取特征(关键点) 尺度不变的特征变换 (SIFT)或 加快了强大的功能 (冲浪)。
它是在实施的 OpenCV的 2.3.1。
您可以使用中的功能找到一个很好的代码示例 Features2D + Homography找到一个已知对象
两种算法对缩放和旋转都不变。由于它们使用功能,您也可以处理 闭塞 (只要有足够的关键点可见)。
图片来源:教程示例
对于SIFT,处理需要几百毫秒,SURF的速度要快一些,但它不适合实时应用。 ORB使用FAST,其在旋转不变性方面较弱。
我喜欢你的问题,无论是否偏离主题:P
一个有趣的一面;我刚刚完成了我的学位课程,其中包括机器人和计算机视觉。我们这个学期的项目与你描述的项目非常相似。
我们必须开发一种机器人,使用Xbox Kinect在各种照明和环境条件下检测任何方向的焦炭瓶和罐。我们的解决方案涉及在Hue通道上结合霍夫圆变换使用带通滤波器。我们能够稍微限制环境(我们可以选择在何处以及如何定位机器人和Kinect传感器),否则我们将使用SIFT或SURF变换。
你可以阅读我们的方法 我关于这个主题的博客文章 :)
有趣的问题:当我浏览你的瓶子图像时,我认为它也是一个可以。但是,作为一个人,我所做的就是告诉它不同之处在于我注意到它也是一个瓶子......
那么,为了区分罐头和瓶子,如何简单地先扫描瓶子?如果找到一个,在寻找罐头之前屏蔽标签。
如果你已经在做罐头,那么实施起来并不难。真正的缺点是它使处理时间加倍。 (但是考虑到现实世界的应用程序,你最终还是想要做瓶子;-)
如果你对它是实时的感兴趣,那么你需要的是添加一个预处理过滤器来确定用重型东西扫描的内容。一个好的快速,非常实时的预处理过滤器,可以让你扫描更可能是可口可乐的东西,而不是在转移到更多的东西之前是这样的:搜索图像的最大补丁距离的一定容差的颜色 sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) 你的可口可乐可以。从非常严格的颜色容差开始,逐步实现更宽松的颜色容差。然后,当您的机器人在规定的时间内用完以处理当前帧时,它会将当前找到的瓶子用于您的目的。请注意,您必须调整RGB中的RGB颜色 sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) 让他们做对。
sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
此外,这似乎真的很愚蠢,但你确保打开 -oFast 编译C代码时编译器优化?
-oFast
我不知道OpenCV,但从逻辑上看问题我认为你可以通过改变你正在寻找的图像来区分瓶子和罐头,即可口可乐。你应该加入到罐头的顶部,因为罐头可以在可口可乐的顶部有银色衬里,如果是瓶子,就没有这样的银色衬里。
但显然这个算法会在隐藏罐头顶部的情况下失败,但在这种情况下,即使是人类也无法区分两者(如果瓶子/罐头的可口可乐部分只是可见的话)
有一个名为HALCON的计算机视觉包 MVTec公司 其演示可以为您提供良好的算法思路。有很多类似于您的问题的示例,您可以在演示模式下运行,然后查看代码中的运算符,并了解如何从现有的OpenCV运算符实现它们。
我已经使用这个包快速为这样的问题原型复杂算法,然后找到如何使用现有的OpenCV功能实现它们。特别是对于您的情况,您可以尝试在OpenCV中实现运算符中嵌入的功能 find_scaled_shape_model 。一些运营商指出有关算法实现的科学论文,这有助于找出如何在OpenCV中做类似的事情。希望这可以帮助...
有许多颜色描述符用于识别对象,下面的文章比较了很多对象。当与SIFT或SURF结合使用时,它们特别强大。单独的SURF或SIFT在可口可乐图像中不是很有用,因为它们不识别很多兴趣点,需要颜色信息来帮助。我在项目中使用带有SURF的BIC(边界/内部像素分类),它可以很好地识别物体。
Web图像检索的颜色描述符:比较研究
请看看Zdenek Kalal's 捕食者跟踪器 。它需要一些培训,但它可以主动了解被跟踪对象在不同方向和比例下的看法,并实时进行!
源代码可在他的网站上找到。在里面 MATLAB ,但也许社区成员已经完成了Java实现。我已经成功地在C#中重新实现了TLD的跟踪器部分。如果我没记错的话,TLD正在使用Ferns作为关键点检测器。我使用SURF或SIFT(已经由@stacker建议)重新获取对象,如果它被跟踪器丢失了。跟踪器的反馈使得随着时间的推移可以轻松构建筛选/冲浪模板的动态列表,这些模板随着时间的推移能够以非常高的精度重新获取对象。
如果您对我的C#跟踪器实现感兴趣,请随时询问。
回答这个问题已经晚了几年。随着CNN在过去5年中将技术发展到极限,我现在不会使用OpenCV来完成这项任务! ( 的 我知道你在问题中特别想要OpenCv功能 强> 我觉得物体检测算法,如Faster-RCNNs,YOLO,SSD等,与OpenCV功能相比,可以显着提高这个问题。如果我现在要解决这个问题(6年后!!)我肯定会使用 的 快RCNN 强> 。
我要寻找的第一件事就是颜色 - 就像RED一样,在图像中进行红眼检测时 - 有一定的颜色范围需要检测,考虑到周围区域的一些特征,如距离另一只眼睛的距离。确实在图像中可见。
1:第一个特征是颜色,红色是非常主导的。在检测到可口可乐红之后,有几个感兴趣的项目 1A:这个红色区域有多大(是否有足够的数量来确定真实的能否--10个像素可能还不够), 1B:它是否包含标签的颜色 - “可口可乐”或波浪。 1B1:是否足以考虑它是一个标签的概率很高。
第1项是一种捷径 - 如果图像中存在鼻涕,则进行预处理 - 继续进行。
所以,如果是这种情况,那么我可以利用我的图像片段并开始更多地缩小相关区域 - 基本上看看周围的区域/边缘......
2:给定1中的上述图像区域ID - 验证所讨论项目的周围点[边缘]。 - 答:有没有看起来可以顶部或底部 - 银? B:一个瓶子看起来可能是透明的,但玻璃桌也是如此 - 玻璃桌/架子或透明区域也是如此 - 如果是这样的话,可能会出现多种可能性。 A MIGHT有一个红色的帽子,它可能没有,但它应该有瓶顶/螺纹螺丝的形状,或帽子。 C:即使A和B失败,它仍然可以是一个部分.. 这是部分因为部分瓶子/部分可能看起来相同而更复杂,所以更多的处理测量红色区域的边缘到边缘。小瓶子的大小可能相似。
3:经过上面的分析,那时我会看一下刻字和波浪标识 - 因为我可以指导我搜索单词中的一些字母因为你可能没有所有的文字,因为没有全部的可以,波将在某些点与文本对齐(距离方向),这样我就可以搜索该概率,并知道在距离为x的波点处应该存在哪些字母。
我很喜欢 达伦库克的 和 堆垛机的答案 这个问题。我正在把我的想法投入评论那些,但我相信我的方法太具有答案性,不能离开这里。
简而言之,您已经确定了一种算法,以确定在太空中的特定位置存在可口可乐徽标。您现在正在尝试确定适用于区分可口可乐的任意方向和任意缩放因子的启发式方法 罐 来自其他对象,包括: 瓶子 , 广告牌 , 广告 ,和 可口可乐用具 所有与这个标志性的标志相关联。您没有在问题陈述中调出许多其他案例,但我认为它们对您的算法的成功至关重要。
这里的秘诀是确定什么是视觉特征 能够 包含或通过负空间,其他可用于罐头的可乐产品具有哪些特征。为此, 目前的最佳答案 当且仅当“瓶子”未被识别时,通过瓶盖,液体或其他类似的视觉启发法的存在,勾画出选择“罐头”的基本方法。
问题是这会破裂。例如,瓶子可能是空的并且没有盖子,导致假阳性。或者,它可能是 一个部分瓶子 具有额外功能损坏,再次导致错误检测。毋庸置疑,这不是优雅的,对我们的目的也没有效果。
为此,最正确的罐头选择标准如下:
您的分类可能如下所示:
这在视觉上向用户突出显示检测到的内容,强调可能正确地被检测为损坏的罐头的弱阳性。
每个属性的检测具有非常不同的时间和空间复杂性,并且对于每种方法,快速通过 http://dsp.stackexchange.com 为您的目的确定最正确和最有效的算法是非常合理的。我的目的是纯粹而简单地强调这一点 通过使候选检测空间的一小部分无效来检测某物是否是罐 对于这个问题来说,这不是最有效或最有效的解决方案,理想情况下,您应该采取相应的相应措施。
嘿,恭喜 黑客新闻发布! 总的来说,这是一个非常好的问题,值得它收到的宣传。 :)
为了加快速度,我会利用这样一个事实:你不会被要求找到任意图像/物体,特别是有可口可乐标志的物体。这很重要,因为这个标识非常独特,它应该在频域中具有特征性的,尺度不变的特征,特别是在RGB的红色通道中。也就是说,水平扫描线(在水平对齐的徽标上训练)遇到的红色到白色到红色的交替图案在通过徽标的中心轴时将具有独特的“节奏”。这种节奏将在不同的尺度和方向上“加速”或“减速”,但仍将按比例保持相同。您可以通过徽标识别/定义几十个这样的扫描线,水平和垂直扫描线以及几个对角线的星形图案。将这些称为“签名扫描线”。
在目标图像中搜索此签名是一个简单的问题,即以水平条带扫描图像。寻找红色通道中的高频(指示从红色区域移动到白色区域),并且一旦找到,查看它是否跟随训练期间识别的频率节奏之一。找到匹配后,您将立即知道扫描线在徽标中的方向和位置(如果您在训练期间跟踪这些内容),那么从那里识别徽标的边界是微不足道的。
如果这不是一个线性有效的算法,或者差不多如此,我会感到惊讶。它显然没有解决你的罐装歧视,但至少你会有你的标志。
(更新:对于瓶子识别,我会寻找与徽标相邻的焦炭(棕色液体) - 也就是说, 内 瓶子。或者,在空瓶的情况下,我会寻找一个 帽 它总是具有与徽标相同的基本形状,大小和距离,通常都是白色或红色。寻找带帽的纯色椭圆形状 应该 是,相对于徽标。当然不是万无一失,但你的目标应该是找到 简单 那些 快速 。)
(距离我的图像处理时间已经过去了几年,所以我把这个建议保持在高水平和概念上。我认为它可能会略微接近人眼的操作方式 - 或者至少我的大脑是如何操作的!)
的 深度学习 强>
收集至少几百个含有可乐罐的图像,注释它们周围的边界框作为正面类别,包括可乐瓶和其他可乐产品标记它们的负面类别以及随机对象。
除非您收集非常大的数据集,否则请执行针对小型数据集使用深度学习功能的技巧。理想情况下使用支持向量机(SVM)与深度神经网络的组合。
将图像提供给先前训练的深度学习模型(例如GoogleNet)后,不使用神经网络的决策(最终)层进行分类,而是使用先前图层的数据作为训练分类器的功能。
OpenCV和Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html
OpenCV和SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
即使人类在第二张图片中区分瓶子和罐子也不困难(假设瓶子的透明区域是隐藏的)?
它们几乎是相同的,除了一个非常小的区域(也就是说,罐子顶部的宽度有点小,而瓶子的包装纸在整个宽度相同,但是稍微改变一下吧?)
我想到的第一件事就是检查瓶子的红顶。但它仍然是一个问题,如果瓶子没有顶部,或者是否部分隐藏(如上所述)。
我想到的第二件事就是瓶子的透明度。 OpenCV有一些关于在图像中查找透明对象的工作。检查以下链接。
OpenCV会议记录会议纪要2012-03-19
OpenCV会议记录会议纪要2012-02-28
特别注意这一点,看看它们检测玻璃的准确程度如何:
查看他们的实施结果:
他们说这是本文的实施 “寻找玻璃的测地学活动轮廓框架”,K。McHenry和J. Ponce,CVPR 2006 。
它可能对你的情况有所帮助, 但如果瓶子装满了问题又会出现问题。
所以我想在这里,您可以首先搜索瓶子的透明体,或者是横向连接到两个透明物体的红色区域,这显然是瓶子。 (理想情况下,图像如下。)
现在,您可以删除黄色区域,即瓶子的标签,并运行算法以查找罐头。
无论如何,这个解决方案也有其他解决方案中的不同问题。
但无论如何,如果图片中没有上述问题,这似乎是一个更好的方法。
可能晚了太多年了,但仍然是一个尝试的理论。
红色标识区域的边界矩形与瓶子/罐的整体尺寸的比率是不同的。在罐子的情况下,应该是1:1,而瓶子的不同(有或没有盖子)。 这应该可以很容易地区分这两者。
更新: 由于它们各自的尺寸差异,徽标区域的水平曲率在Can和Bottle之间将是不同的。如果你的机器人需要拿起罐子/瓶子,并且你相应地决定了握把,这可能特别有用。