image processing:“可口可乐jar”识别的algorithm改进

过去几年中我最感兴趣的项目之一是关于image processing的项目。 我们的目标是build立一个能够识别可口可乐“jar头”的系统 (注意,我强调“jar头”这个词,你会在一分钟内看到为什么)。 您可以在下面看到一个示例,可以在具有缩放和旋转的绿色矩形中识别。

模板匹配

项目的一些限制:

  • 背景可能非常嘈杂。
  • jar头可以有任何规模旋转 ,甚至方向(在合理范围内)。
  • 图像可能有一定程度的模糊性(轮廓可能不完全是直的)。
  • 图像中可能有可口可乐瓶,algorithm只能检测jar头
  • 图像的亮度可能会有很大的变化(所以你不能在颜色检测上“太多”)。
  • jar子可以部分隐藏在侧面或中间,可能部分隐藏在瓶子后面。
  • 在图像中完全没有可能 ,在这种情况下,你必须找不到任何东西,并写下这样的消息。

所以你最终可能会遇到这样棘手的事情(在这种情况下,我的algorithm完全失败):

总失败

前段时间我做了这个项目,做了很多乐趣,而且我有一个体面的实现。 以下是关于我的实现的一些细节:

语言 :使用OpenCV库在C ++中完成。

预处理 :对于图像预处理,即将图像转换为更加原始的forms给予algorithm,我使用了2种方法:

  1. 将颜色区域从RGB更改为HSV,并根据“红色”色调进行过滤,在某个阈值以上进行饱和以避免类橙色,并对低值进行过滤以避免产生深色调。 最终的结果是一个二进制的黑白图像,其中所有的白色像素将代表匹配这个阈值的像素。 很明显,图像中仍然有很多垃圾,但是这会减less你需要处理的尺寸数量。 二值化的图像
  2. 使用中值滤波进行噪声滤波(取所有邻居的中值像素值并用此值replace像素)以降低噪声。
  3. 使用Canny边缘检测filter在2个先例步骤之后获得所有项目的轮廓。 轮廓检测

algorithm :我为这个任务select的algorithm本身是从这个真棒书籍特征提取,被称为广义霍夫变换 (有别于正则霍夫变换)。 它基本上说了几件事情:

  • 你可以在不知道parsing方程的情况下在空间中描述一个物体(这里就是这种情况)。
  • 它能抵抗像缩放和旋转等图像变形,因为它将基本上针对比例因子和旋转因子的每个组合来testing图像。
  • 它使用algorithm将“学习”的基本模型(模板)。
  • 剩余在轮廓图像中的每个像素将基于从模型中学习的内容投票给另一像素,该像素将被认为是对象的中心(就重力而言)。

最后,最后得到一个热图,例如在这里jar子轮廓的所有像素都会投票给它的引力中心,所以你将会在相同的像素中得到很多的投票。中心,并将在热图中看到一个高峰,如下所示:

GHT

一旦你有了这一点,一个简单的基于阈值的启发式可以给你的中心像素的位置,从中你可以导出的规模和旋转,然后绘制你的小矩形周围(最终规模和旋转因素显然是相对于你原始模板)。 理论上至less…

结果 :现在,虽然这种方法在基本案例中起作用,但在一些领域却严重缺乏:

  • 这是非常缓慢 ! 我没有强调这一点。 需要几乎整整一天来处理30个testing图像,显然是因为我有一个非常高的旋转和平移比例因子,因为一些jar子很小。
  • 当图像中的瓶子完全丢失时,由于某种原因,几乎总是find瓶子而不是jar子(也许是因为瓶子更大,因此像素更多,因此票数更多)
  • 模糊的图像也是不好的,因为投票结果在中心周围的随机位置像素,从而结束了一个非常嘈杂的热图。
  • 翻译和旋转方面的差异已经达到了,但是没有定位,这意味着没有直接面对相机目标的一个jar子没有被识别。

你能帮助我改进我的具体algorithm,只使用OpenCVfunction来解决上述四个具体问题吗?

我希望有些人也会从中学到一些东西,毕竟我不仅想问问题的人应该学习。 🙂

另一种方法是使用尺度不变特征变换 (SIFT)或加速稳健特征 (SURF)提取特征(关键点)。

它在OpenCV 2.3.1中实现。

您可以在Features2D + Homography中使用functionfind一个很好的代码示例来查找已知对象

两种algorithm对缩放和旋转都是不变的。 由于他们使用的function,你也可以处理遮挡 (只要足够的关键点是可见的)。

在这里输入图像说明

图片来源:教程示例

SIFT的处理需要几百毫秒,SURF速度更快,但不适合实时应用。 对于旋转不变性,ORB使用较弱的FAST。

原始文件

  • SURF:加快了强大的function
  • 尺度不变关键点的特征图像特征
  • ORB:SIFT或SURF的高效替代品

为了加快速度,我会利用这个事实,即不要求你find一个任意的图像/对象,而是一个具有可口可乐标志的图像/对象。 这是重要的,因为这个标志是非常独特的,它应该在频域中有特征的尺度不变的特征,特别是在RGB的红色通道中。 也就是说,水平扫描线(在水平alignment的标识上训练)遇到的红到白到红的交替模式在穿过标识的中心轴时将具有独特的“节奏”。 节奏将在不同的尺度和方向上“加速”或“减速”,但是仍然按比例相等。 您可以识别/定义几十个这样的扫描线,在水平和垂直方向上穿过标识,还有几个对angular线,以星爆图案。 将这些称为“签名扫描线”。

签名扫描线

在目标图像中search这个签名是一个简单的事情,即以水平条扫描图像。 在红色通道中寻找高频(指示从红色区域移动到白色区域),一旦发现,看看是否跟随训练课程中确定的一个频率节奏。 一旦find了匹配,您将立即知道扫描线在徽标中的方向和位置(如果您在训练过程中跟踪这些事情),那么从中识别徽标的边界是微不足道的。

如果这不是一个线性有效的algorithm,或者几乎如此,我会感到惊讶。 这显然不能解决你的瓶子歧视,但至less你会有你的标志。

(更新:为了识别瓶子,我会在标识附近寻找可乐(棕色液体) – 也就是瓶子内部 ,或者在空瓶子的情况下,我会寻找一个总是有相同的基本形状,大小和距离的标志,一般都是白色或红色。search一个纯色eliptical形状,一个帽子应该是,相对于标志,当然不是万无一失,但你的目标应该是快速find容易的人。)

(从我的image processing时代开始已经有几年了,所以我把这个build议保持在高层次和概念上,我认为它可能稍微接近人眼的运作方式 – 或者至less我的大脑是如何运作的!

有趣的问题:当我瞥了一下你的瓶子图像,我以为它也是一个jar子。 但是,作为一个人,我做了什么来区分是我注意到它也是一个瓶子…

因此,要分开jar头和瓶子,先简单扫描瓶子怎么样? 如果你find一个,在找jar之前掩盖标签。

如果你已经在做jar子,不难实现。 真正的缺点是它会使处理时间加倍。 (但是,想到现实世界的应用程序,你最终会想要做瓶子;-)

即使人类在第二个图像中(如果瓶子的透明区域被隐藏)区分瓶子和jar子也不难吗?

他们几乎是一样的,除了一个很小的区域(也就是说,jar头顶部的宽度有点小,而瓶子的包装宽度始终是相同的,只是一个小的变化吧?)。

我想到的第一件事就是检查瓶子的红色顶部。 但如果瓶子没有顶部,或者部分隐藏(如上所述),仍然是一个问题。

我想到的第二件事是关于瓶子的透明度。 OpenCV有一些在图像中查找透明对象的工作。 检查下面的链接。

  • OpenCV会议logging分钟2012-03-19

  • OpenCV会议logging分钟2012-02-28

特别是看这个看他们如何准确地检测玻璃:

  • OpenCV会议logging分钟2012-04-24

看他们的结果:

在这里输入图像说明

他们说这是"A Geodesic Active Contour Framework for Finding Glass" by K. McHenry and J. Ponce, CVPR 2006.的论文"A Geodesic Active Contour Framework for Finding Glass" by K. McHenry and J. Ponce, CVPR 2006. 。 (下载文件)

这可能对您的情况有所帮助, 但是如果瓶子被填满问题又会再次出现。

所以我想在这里,你可以先search瓶子的透明体,也可以search一个红色的区域,这个红色的区域横向连接着两个透明的物体,这显然是瓶子。 (理想情况下,如下图所示。)

在这里输入图像说明

现在,您可以删除黄色区域,即瓶子的标签,然后运行algorithm来查找jar子。

无论如何,这个解决scheme在其他解决scheme中也有不同的问题。

  1. 它只有在你的瓶子是空的时才有效。 在这种情况下,您将不得不search两种黑色之间的红色区域(如果可口可乐液体是黑色的)。
  2. 另一个问题,如果透明部分被覆盖。

但无论如何,如果在图片中没有上述问题,这似乎是一个更好的方法。

我真的很喜欢Darren Cook和堆垛机对这个问题的答案 。 我正在把自己的想法投入到对这些问题的评论中,但是我相信我的做法太复杂了,不能离开这里。

简而言之,您已经确定了一种algorithm,以确定可口可乐徽标存在于特定位置的太空中。 您现在试图确定适用于区分可口可乐jar与其他物体的启发式方法,包括:与这个标志性标识相关的瓶子广告牌广告可口可乐用具 。 你在问题陈述中没有提到这些额外的案例,但是我觉得它们对你algorithm的成功至关重要。

这里的秘诀就是确定一个可以包含什么样的视觉特征,或者通过消极的空间来确定其他可口可乐产品中不存在的特征。 为此, 当前最好的答案勾画出一个基本的方法来select“jar”,当且仅当“瓶”没有被识别,或者是瓶盖,液体或其他类似的视觉启发式的存在。

问题是这个失败。 例如,一瓶可能是空的,缺less一个帽子,导致误报。 或者,它可能是一个部分瓶子 ,附加function损坏,再次导致错误的检测。 不用说,这不是优雅的,对我们的目的也不是有效的。

为此,jar头的最正确的select标准似乎如下:

  • 正如你在问题中所描绘的那样,物体轮廓的形状是正确的吗? 如果是这样,+1。
  • 如果我们假设存在自然光或人造光,我们是否会检测到瓶子上的铬轮廓,表示这是否由铝制成? 如果是这样,+1。
  • 我们是否相对于我们的光源( 光源检测中的 说明性video链接 )确定对象的镜面特性是否正确? 如果是这样,+1。
  • 我们是否可以确定任何有关物体的其他属性,将其标识为一个jar子,包括但不限于徽标的拓扑图像倾斜,物体的方向,物体的并置(例如,平面表面像一个表或​​其他jar的情况下),并存在一个拉环? 如果是这样,每个+1。

您的分类可能如下所示:

  • 对于每个候选人比赛,如果检测到可口可乐标志的存在,绘制一个灰色边框。
  • 对于+2以上的每场比赛,画一个红色边框。

这在视觉上向用户突出了所检测到的内容,强调了可能正确地被检测为损坏的jar的弱阳性。

每个属性的检测都带有非常不同的时间和空间复杂性,对于每种方法,快速通过http://dsp.stackexchange.com是非常合理的,可以为您的目的确定最正确和最有效的algorithm。; 我的目的是纯粹而简单地强调, 通过使候选检测空间的一小部分无效检测是否是可能的,并不是解决这个问题的最有力和最有效的方法,理想情况下,您应该采取适当的行动因此。

嘿,祝贺黑客新闻发布! 总的来说,这是一个值得宣传的好问题。 🙂

看着形状

以甘蔗jar头/瓶子的红色部分的形状。 请注意jar头在顶部如何稍微收缩,而瓶子标签是笔直的。 你可以通过比较红色部分在整个长度上的宽度来区分这两者。

看重点

一种区分瓶子和jar子的方法是材料。 一个瓶子由塑料制成,而一个jar子由铝金属制成。 在光线充足的情况下,查看镜面reflection将是从jar头标签告诉瓶子标签的一种方式。

据我所知,这是一个人如何分辨这两种标签之间的区别。 如果照明条件差,那么区分两者肯定会有一些不确定性。 在这种情况下,您必须能够检测到透明/半透明瓶本身的存在。

请看看Zdenek Kalal的“ 捕食者”追踪器 。 它需要一些培训,但它可以积极地学习跟踪对象如何看待不同的方向和尺度,并实时进行!

源代码可以在他的网站上find。 这是在MATLAB中 ,但也许有一个Java实现已经由社区成员完成。 我用C#成功地重新实现了TLD的跟踪器部分。 如果我没有记错,TLD正在使用Ferns作为关键点检测器。 我使用SURF或SIFT(已由@stackerbuild议)重新获取对象,如果它被跟踪器丢失的话。 跟踪器的反馈使得用时间build立筛选/冲浪模板的dynamic列表变得很容易,其随时间使得能够以非常高的精度重新获得对象。

如果您对我的C#实现跟踪器感兴趣,请随时询问。

如果你不只限于一个不在你的限制范围内的摄像头,也许你可以使用像Xbox Kinect这样的距离传感器。 有了这个,你可以执行深度和颜色匹配的图像分割。 这允许更快地分离图像中的对象。 然后,您可以使用ICP匹配或类似的技术,甚至匹配jar的形状,而不仅仅是它的轮廓或颜色,并且假设它是圆柱形的,如果您之前有3D目标的扫描,这可能是任何方向的有效选项。 这些技术通常很快,特别是在用于解决速度问题的特定目的时。

此外,我可以build议,不一定准确或速度,但为了乐趣,你可以使用一个训练有素的neural network在你的色调分割图像来识别jar的形状。 这些速度非常快,通常可以达到80/90%的精度。 培训将是一个漫长的过程,虽然你将不得不手动识别每个图像的jar头。

我会检测红色矩形:RGB – > HSV,filter红色 – >二值图像, closures (膨胀然后侵蚀,在MATLAB中被称为imclose

然后查看从最大到最小的矩形。 在已知位置/比例中具有较小矩形的矩形都可以被移除(假设瓶子比例是恒定的,较小的矩形将是瓶盖)。

这会给你留下红色的矩形,那么你需要以某种方式检测标识,以判断它们是红色矩形还是焦炭jar。 像OCR,但有一个已知的标志?

这可能是一个非常天真的想法(或根本不可能),但所有的可乐jar的尺寸是固定的。 因此,如果相同的图像同时包含一个jar子和一个瓶子,那么你可以通过尺寸考虑来区分它们(瓶子将变得更大)。 现在,由于缺less深度(即3D映射到2D映射),可能会出现瓶子收缩并且尺寸没有差异的情况。 您可以使用立体成像恢复一些深度信息,然后恢复原始大小。

嗯,其实我觉得我正在做一些事情 (这就像有史以来最有趣的问题 – 所以尽pipefind可以接受的答案,不要继续尝试find“完美”的答案,这真是一种遗憾)。 。

一旦你find了标志,你的麻烦就完成了一半。 那么你只需要弄清楚标志周围的区别。 另外,我们希望尽可能less做一点。 我觉得这其实是这个简单的部分

标志周围是什么? 对于一个jar子,我们可以看到金属,尽pipe有照明的效果,不会改变其基本颜色。 只要我们知道标签的angular度,我们可以知道它的正上方,所以我们看看它们之间的区别:

在这里,标志的上方和下方是完全黑暗的,颜色一致。 在这方面比较容易。

在这里,上面和下面是轻的,但颜色仍然一致。 这是全silverlight的,全silverlight的金属看起来很罕见,还有一般的silverlight。 另外,它与一个已经被识别出来的红色已经足够稀疏,足够接近红色,所以你可以追踪它的整个长度的形状来计算可以被认为是金属jar的百分比。 真的,你只需要jar子里的一小部分就可以知道它是它的一部分,但是你仍然需要find一个平衡点,以确保它不仅仅是一个空的金属瓶子。

最后,棘手的一个。 但不是那么棘手,一旦我们只是通过我们可以直接看到红色包装上面(和下面)看到的东西。 它的透明度,这意味着它会显示任何背后的东西。 这很好,因为背后的东西不可能和jar子里的silverlight圆形金属一样。 背后可能有很多不同的东西,这会告诉我们,它是一个空的(或充满了清澈的液体)的瓶子,或一致的颜色,这可能意味着它是充满液体或瓶只是在纯色。 我们正在做最接近顶部和底部的工作,正确的颜色在正确的位置的机会是相当渺茫的。 我们知道这是一个瓶子,因为它没有得到jar子的关键视觉元素,与瓶子后面的可能相比,这是相对简单的。

(最后一个是我能find的最大的一个空的大型可口可乐瓶 – 有趣的是,这个瓶盖和环是黄色的,这表明可能不应该依赖瓶盖的发红)

在极less数情况下,瓶子后面有一种类似的silverlight阴影,即使在塑料的抽象化后,或者瓶子里充满了同样的silverlight液体,我们也可以回到我们可以粗略估计的正如我所提到的,银的形状是圆形的,并遵循jar的形状。 但即使我在image processing方面缺乏一定的知识,听起来也很慢。 更好的是,为什么不通过一次检查徽标的边缘来确定这里是否有相同的silverlight? 啊,但是如果jar子背后有一样的silverlight呢? 那么,我们确实必须更多地关注形状,再次看着jar头的顶部和底部。

根据这一切如何完美无缺,这可能会非常缓慢,但我想我的基本概念是首先检查最简单和最接近的事情。 在做出其他元素的形状的努力之前,通过围绕已经匹配的形状的颜色差异(这看起来这是最微不足道的部分)。 列出它,它是:

  • find主要的吸引力(红色的标志背景,可能的标志本身的方向,虽然万一jar头被拒绝,你需要专注于红色)
  • validation形状和方向,再次通过非常鲜明的红色
  • 检查形状周围的颜色(因为它是快速和无痛的)
  • 最后,如果需要的话,请确认主要景点周围的颜色形状是否正确。

如果你不能做到这一点,这可能意味着jar头的顶部和底部被覆盖,而人类可以用来可靠地区分jar头和瓶子的唯一可能的事情是闭塞和reflection的jar头,这将是一个难以处理的战斗。 然而,要进一步走下去,可以使用其他答案中提到的半透明扫描技术来跟踪jar头/瓶子的angular度来检查更多的瓶状特征。

有趣的额外噩梦可能包括一个方便坐在瓶子后面的金属jar,它的金属恰好显示在标签的上方和下方,只要沿着红色的整个长度扫描标签 – 这实际上更多的是一个问题,因为你没有发现一个jar子,你可以有,而不是考虑你实际上检测到一个瓶子,包括意外jar。 在这种情况下,杯子是半空的!


作为一个免责声明,我没有经验也没有想过在这个问题之外的image processing,但它是如此有趣,让我深思熟虑,并在阅读所有其他答案后,我认为这可能是最简单最有效的方法来完成它。 就个人而言,我只是很高兴我实际上不必考虑编程!

编辑

在MS油漆中绘制一个不好的图画 另外,看看我在MS Paint中所做的这个绘图…这是绝对可怕的,而且还不完全,但是仅仅基于形状和颜色,你可以猜测它可能会是什么样子。 实质上,这是唯一需要打扰扫描的东西。 当你仔细观察这种非常独特的形状和颜色的组合时,还有什么可能呢? 我没有画的那一点,白色背景,应该被认为是“任何不一致的东西”。 如果它有一个透明的背景,它可以越过几乎任何其他的形象,你仍然可以看到它。

我不知道OpenCV,但从逻辑上看问题,我认为你可以通过改变你正在寻找的图像,即可口可乐来区分瓶子和jar头。 你应该加上jar头的顶部,因为可以在可口可乐的顶部有silverlight的衬里,如果瓶子里面没有这样的silverlight衬里。

但是很显然,如果jar子的顶部被隐藏,这个algorithm就会失败,但是在这种情况下,即使人类也不能区分这两者(如果只有可口可乐瓶子/jar子是可见的)

我喜欢这个挑战,想要给出一个解决这个问题的答案,我想。

  1. 提取徽标的特征(关键点,描述符,如SIFT,SURF)
  2. 将点与标志的模型图像匹配(使用匹配器如Brute Force)
  3. 估计刚体坐标(PnP问题 – SolvePnP)
  4. 根据刚体估算帽子的位置
  5. 做反投影并计算瓶盖的图像像素位置(ROI)(我假设你有相机的固有参数)
  6. 用方法检查盖子是否在那里。 如果有的话,这是瓶子

检测帽是另一个问题。 它可以是复杂的或简单的。 如果我是你,我会简单地检查ROI中的颜色直方图。

如果我错了,请给予反馈。 谢谢。

有一堆用于识别对象的颜色描述符,下面的文档比较了很多。 与SIFT或SURF结合使用时,它们特别强大。 SURF或SIFT本身在可口可乐的形象中并不是很有用,因为他们不认可很多兴趣点,所以需要颜色信息来帮助。 我在项目中使用SURF的BIC(边界/内部像素分类),并且很好地识别对象。

Web图像检索的颜色描述符:比较研究

我喜欢你的问题,不pipe是否与主题无关:P

一个有趣的旁白; 我刚刚完成了一个学位课程,涉及机器人和计算机视觉。 我们这个学期的项目和你描述的那个非常相似。

我们不得不开发一种机器人,使用Xbox Kinect来检测各种照明和环境条件下任何方向的可乐瓶和jar头。 我们的解决scheme包括在Hue通道上结合hough circle变换使用带通滤波器。 我们能够限制环境(我们可以select在哪里以及如何定位机器人和Kinect传感器),否则我们将使用SIFT或SURF变换。

你可以在我的博客文章上阅读关于我们的方法的主题 🙂

作为所有这些优秀解决scheme的替代scheme,您可以训练您自己的分类器,使您的应用程序对错误有效。 例如,您可以使用哈尔训练 ,为您的目标提供许多正面和负面的图像。

只提取jar头可以是有用的,并且可以与透明物体的检测结合。

MVTec有一个名为HALCON的计算机视觉软件包,它的演示可以给你很好的algorithm思路。 有很多类似于您的问题的示例,您可以在演示模式下运行,然后查看代码中的运算符,并了解如何从现有的OpenCV运算符实现它们。

我已经使用这个包来快速地为这样的问题build立复杂的algorithm原型,然后find如何使用现有的OpenCV特性来实现它们。 特别是对于你的情况,你可以尝试在OpenCV中实现embedded在运算符find_scaled_shape_model中的function。 一些运营商指出了关于algorithm实现的科学论文,可以帮助我们find在OpenCV中如何做类似的工作。 希望这可以帮助…

深度学习

收集至less几百张包含可乐jar头的图像,注释周围的边界框为正面的类,包括可乐瓶和其他可乐产品标签负面的类和随机的对象。

除非您收集一个非常大的数据集,否则使用小数据集的深度学习function的技巧。 理想情况下使用支持向量机(SVM)和深度neural network的组合。

一旦将图像提供给先前训练过的深度学习模型(例如GoogleNet),而不是使用neural network的决策(最终)层进行分类,则可以使用先前的图层数据作为特征来训练分类器。

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

你需要一个程序,从经验中有机地学习和提高分类的准确性。

我会build议深入的学习,深入的学习这成为一个微不足道的问题。

您可以重新训练Tensorflow的初始v3模型( https://www.tensorflow.org/tutorials/image_retraining )。

在这种情况下,你将会训练一个卷积neural network来把一个对象分类为可口可乐或者不可以。

如果你对它是实时感兴趣的,那么你需要添加一个预处理filter,以确定什么被扫描与重型的东西。 一个好的快速,非常实时的预处理filter,可以让你扫描更可能是可口可乐的东西,而不是在转移到更多的有缺陷的东西之前是这样的:search图像寻找最大的补丁从可口可乐jar的sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) , 从一个非常严格的颜色容差开始,然后按照更宽松的颜色容差工作。 然后,当你的机器人用完一个分配的时间来处理当前帧,它使用目前find的瓶子为你的目的。 请注意,你将不得不在sqrt(pow(red,2) + pow(blue,2) + pow(green,2))调整RGB颜色,使它们恰到好处。

另外,这是gona看起来真的很愚蠢,但是当编译你的C代码时,你确保打开-oFast编译器优化吗?

在这个页面上有些离奇的答案,等于评论如

  • “用SIFT!”

  • “使用Kinect!”

如果您对图像识别的实际计算机科学不感兴趣,而您只是想“使用”某些东西(如SIFT或Kinect),那么现在无处不在的就是使用常用的图像识别系统。

从2017年开始,多年来,图像识别技术广泛而平凡。

您将不再坐下来尝试从头开始实现图像识别,而不必坐下来开始收集和显示地图,或者从头开始渲染HTML。 你只是使用谷歌的tensorflow(他们已经达到了build立芯片,为了善良的目的,处理tensorflow更快),克拉里法,bluemix什么的。

例如,要使用Bluemix,这是几行代码….

 func isItACokeCan() { // we'll use the excellent Just# library to do rest calls. // liveImageData is like // = UIImageJPEGRepresentation(picture from iPhone camera, 0.40) var jds = JustSessionDefaults() jds.headers = ["Accept-Language":"en"] let specificJust = JustOf<HTTP>(defaults: jds) let u: String = "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify" + "?api_key= ... your API key ..." + "&version=2016-05-20" + "&classifier_ids= ... your Classifier name ... " specificJust.post( u, files: ["x.jpeg": .data("x.jpeg", liveImageData!, "image/jpeg")] ) { r in if r.ok { DispatchQueue.main.async { self.processResult(r.json) } } else { DispatchQueue.main.async { self.doResults("network woe?") } } } } func processResult(_ rr: Any?){ let json = JSON(rr!) print("\(json)") } 

(注意,当然,现在所有的设备现在都包含了(非常棒的)ONBOARD图像识别function,尤其是与相机配合使用的面部识别function。

Siri,Google Maps,BAAS等系统以及主要的image processing工作 – 显然是谷歌文本search本身 – 都在改变着游戏规则。

自从六年前问这个问题以来,注意到了令人难以置信的差异。

通过一切手段,如果你在图像识别的实际计算机科学,去为它。 但是这个质量保证似乎更多地是对技术的回顾(“使用SIFT!”)

The first things I would look for are color – like RED , when doing Red eye detection in an image – there is a certain color range to detect , some characteristics about it considering the surrounding area and such as distance apart from the other eye if it is indeed visible in the image.

1: First characteristic is color and Red is very dominant. After detecting the Coca Cola Red there are several items of interest 1A: How big is this red area (is it of sufficient quantity to make a determination of a true can or not – 10 pixels is probably not enough), 1B: Does it contain the color of the Label – "Coca-Cola" or wave. 1B1: Is there enough to consider a high probability that it is a label.

Item 1 is kind of a short cut – pre-process if that doe snot exist in the image – move on.

So if that is the case I can then utilize that segment of my image and start looking more zoom out of the area in question a little bit – basically look at the surrounding region / edges…

2: Given the above image area ID'd in 1 – verify the surrounding points [edges] of the item in question. A: Is there what appears to be a can top or bottom – silver? B: A bottle might appear transparent , but so might a glass table – so is there a glass table/shelf or a transparent area – if so there are multiple possible out comes. A Bottle MIGHT have a red cap, it might not, but it should have either the shape of the bottle top / thread screws, or a cap. C: Even if this fails A and B it still can be a can – partial.. This is more complex when it is partial because a partial bottle / partial can might look the same , so some more processing of measurement of the Red region edge to edge.. small bottle might be similar in size ..

3: After the above analysis that is when I would look at the lettering and the wave logo – because I can orient my search for some of the letters in the words As you might not have all of the text due to not having all of the can, the wave would align at certain points to the text (distance wise) so I could search for that probability and know which letters should exist at that point of the wave at distance x.