通过语义分割实现精确,快速,轻巧的条形码搜索

在图像中搜索对象? 有了培训样本和最少的神经网络知识,今天的任何学生都可以获得一定精度的解决方案。 但是,用于解决该问题的大多数神经网络都很深,因此需要大量数据进行训练,它们在推理阶段的工作速度相对较慢(特别是如果设备没有GPU),它们的重量很大并且非常耗能。 在某些情况下,尤其是对于移动应用程序,上述所有内容可能非常关键。


条形码是具有相当简单结构的对象。 在研究过程中,我们能够使用相对原始的方法非常准确地(我们击败了最新技术)并且足够快地(在平均CPU上实时)搜索这样的简单对象。 另外,我们的探测器非常轻巧,重量仅为30k。 我们将在本文中讨论我们的研究结果。


但是在讨论解决方案之前,值得深入研究主题领域,也许值得从条形码开始。


什么是条形码,为什么要寻找它?


条形码是一组机器可读数据格式的通用名称。 您可能听说过条形码和QR码-这些只是条形码的特例。 在现代世界中,可以在票证,商店商品,官方文件以及许多其他地方找到它们。



条形码通常分为一维(由一组黑白条纹表示)和二维(由小方块或矩形块组成)。 正如您在图中所看到的,通常,各种类型彼此非常相似。


复杂性可以由未指定长度的某些类型的条形码表示。 这样的条形码可以任意长,同时又很薄。



上面的示例是人为的,但是在真实文档中,尤其是在发票中,发现了具有相似比例的条形码。


并且由于这些是机器可读的格式,因此它们应该相对容易地被硬件识别。 但是,识别路径的第一步是搜索,本文将对此进行讨论。


值得注意的是,激光扫描仪和许多应用程序都暗示着人的积极参与-必须将相机/扫描仪明确指向条形码,以便对其进行识别,在这种情况下,搜索的需求自然消失了。 但是,在这种情况下,用户被迫花费额外的精力,这是不好的。 这种方法也不允许识别图像中的多个对象,仅限于一个。


问题说明和质量指标


我们想要从创建的条形码检测器中得到什么?


  1. 查找图像中的所有条形码足够准确*
  2. 查找长而窄的条形码
  3. 在CPU上实时

*建议对阈值IoU = 0.5的对象使用f度量作为准确性的主要指标。 我们还将研究精度,召回率和检测率。


指标的形式定义

首先,我们介绍IoU的概念-联合上的交集(也称为Jaccard索引)。 具有真实( G)和预测( F)对象的遮罩,则将IoU计算为相交面积除以并集面积。

JGF= frac|G capF||G cupF|



显而易见,IoU取值为0到1。现在,基于此度量,我们引入了精度,召回率,f度量和检测率的概念。


样本中有N个对象。 我们将阈值IoU设置为某个固定数字 t(例如0.5)。 对于某些物体 G和检测 F相信如果 JGF get,则找到该对象(1),否则我们认为未找到该对象(0)。 然后 t定义为找到的样本对象的比例, t-对应于至少一个样本对象的检测比例。 f量度标准定义为谐波均值 2tt/t+t


有待了解什么是检测率。 样本中有M张带有对象的图片。 我们计算图片中真实蒙版和预测蒙版之间的IoU,类似地切断了图片的阈值。 检测率是图片中所有真实对象的总IoU与所有预测对象的总IoU大于给定阈值t的图片分数。


在以前的研究中(关于条形码的检测),习惯上使用检测率来评估质量。 但是,让我们考虑这种情况-假设图像中有一个很大的物体和一个很小的物体,但是检测器发现很大而没有发现很小。 在这种情况下,如果阈值非常大,则检测率将仅表示错误。 t接近1。 对于任意阈值,将不超过0.5 t,这也会使f-measure小于1。也就是说,对于这样的示例,f-measure可能会更早地发出错误信号(就较低的阈值而言) t)的检出率。


因此,在我们的实验中,我们依靠f测度,并使用检出率与过去几年的工作进行比较。


受到文字检测器的启发


当速度很重要时,最著名和最受欢迎的物体检测器可能是YOLO(您只看一次)。 还有YOLOv2和YOLOv3的更高版本,但是总的来说,这种方法对于或多或少的正方形对象都是有用的,但是在找到狭窄但非常细长的对象时,这种方法并不是那么强大。


所以我们决定走另一条路。 如您所见,图像中带有文本的线条也非常拉长和狭窄,在科学界中查找图像中文本的任务非常流行(肯定比搜索条形码更受欢迎),并且为此发明了各种基于图形结构的有趣架构。 我们的决定仅受其中提出了PixelLink体系结构的一种文本搜索工作的激励。



该方法的本质如下-让我们解决这样的实例分段问题:


  1. 对于每个像素,我们将解决二进制分类问题(文本/非文本)。
  2. 对于每个像素,我们将预测与相邻像素的8个链接(链接)。 通信意味着这对像素属于一个对象(实例)。
  3. 接收到文本/非文本分割图以及带有图像链接的图后,我们组装了一个图形,其中顶点将是预测其文本类的像素,而边缘是链接。
  4. 我们在此图中找到了连接的组件。
  5. 在每个连接的组件周围,选择最小的包围矩形(例如,使用OpenCV),这将是最终的检测结果。

以图形方式说明了此过程,该图取自原始文章



这种搜索文本的方法可提供与最新技术相当的相当不错的结果。



现在返回条形码。 我们问自己-我们真的需要这些链接吗? 毕竟,与文本相反,在大多数情况下,条形码彼此之间相距甚远。 实际上,根据规范,许多类型的条形码必须与最近的相邻对象有一定的距离。
总的来说,我们认为我们不需要特别的链接,因此对方法进行了如下修改:


  1. 我们解决了语义分割的问题-对于每个像素,我们确定条形码/非条形码的类别。
  2. 我们建立了一个以像素为顶点的图形,确定了条形码的类型。 作为边缘,而不是寻找链接,我们认为条形码类型的任何一对相邻像素之间都有一个链接。
  3. 我们在此图中找到了连接的组件。
  4. 在每个连接的组件周围,选择最小的封闭矩形,这将是最终的检测结果。

因此,我们决定了通用解决方案。 第2-4段可以说是微不足道的,但让我们讨论如何精确处理语义分割。


语义分割的网络架构


一些常用的历史


总的来说,自从U-Net出现以来,使用神经网络的语义分割自2013年前后开始。 在U-Net中,空间分辨率首先在Encoder中逐渐降低,然后在Decoder中逐渐提高,还存在从中间Encoder功能到中间Decoder功能的跳过连接。 稍后,出现了膨胀的卷积(请参见下图),产生了更好的质量,但是需要更多的内存和更多的计算才能进行处理。 嗯,最后,有了一种称为Deeplabv3 +的方法,将这两种方法结合起来,并在撰写本文时成为了人类设计架构中的最新技术(实际上,这要归功于Neural Architecture Search,更有效的解决方案, 例如 )。


让我们将更多的精力放在膨胀卷积上,因为 在最终决定中,我们将依靠其属性。


普通卷积像这样



虽然膨胀卷积如下所示(在图中,膨胀因子为2)



您可能会注意到,常规卷积实际上是扩张卷积的一种特殊情况(扩张系数为1)。


通常,关于语义分段解决方案的讨论是另一篇相当大的文章的主题,我只是想提醒一下,其中最重要的事情是处理膨胀的卷积设备。 如果您不熟悉语义分段,那么这里是作者所知最佳评论,但是,要了解接下来会发生什么,无需熟悉它。


如果一切都这么简单...


除质量外,对神经网络的主要要求是速度。 在我们的数据中,相对于图像尺寸而言,条形码是如此之小,以至于运行神经网络的最小分辨率至少应为512x512,最好是1024x1024。 同时,要求在CPU(以及一个内核!)上在CPU上工作的时间不得超过100毫秒。 就输入分辨率和总运行时间的要求而言,这项任务不是很简单。 由于存在如此严格的限制,因此无法使用强大的深度架构。 公平地说,我们尚未满足一个内核100 ms的要求,但是最终解决方案在4个内核(Intel Core i5,3.2 GHz)上可工作40 ms。


不幸的是,我们已知的所有用于语义分段的体系结构都不符合这些限制。 因此,我们有一个选择:要么不知道如何提出一个全新的东西,要么尝试尽可能简化一种流行的体系结构。 我们没有出色的想法,因此我们选择了后者。


受上下文聚合网络的启发


扩张的卷积具有以下有用的特性-如果您以指数增长的扩张因子顺序应用它们,则接受场将呈指数增长(而在普通卷积的情况下,它呈线性增长)。



图( )显示了当顺序应用膨胀卷积时神经网络的感受野的指数增长。 (a)通过对F1进行卷积,通过F0的卷积获得F1,对于F1中的每个元素,接受场= 3x3(b)通过对F1对进行卷积,通过F1的卷积获得F2,对于F2中的每个元素,接受场= 7x7(c)F3使用卷积= 4的卷积从F2获得,对于F3中的每个元素,接收场= 15x15


在基于该属性的文章“通过扩张卷积的多尺度上下文聚合”中 ,发明了一个特殊的块(由上下文模块的作者调用),该块用于从当前像素的上下文中收集信息。 在本文中,此模块用于已经知道如何解决分段问题的网络之上,以使用上下文信息来完善这些预测。


我们决定采用此上下文模块,但不是将用于改进现有良好模型的预测,而是将其用作卷积网络的主要部分 ,它将解决此问题。 通常,我们的体系结构安排如下(见表):


  1. 缩减模块-初始卷积以提取最简单的特征并降低分辨率。
  2. 上下文模块本质上是一组扩张的卷积,将迅速增加接收场,从而从较大的上下文中收集属性。
  3. 最后一层(1x1卷积),接收用于条形码/非条形码语义分割的概率图。 另外,如果我们想区分检测到的条形码的类型,则可以额外预测N个通道(请参见下文)。


也就是说,在最终的体系结构中,每层中使用恒定数量的C = 24通道,前3个卷积会降低分辨率,随后的卷积(上下文模块)会增加特征图每个元素的接收场。


架构超参数表除其他外,指示当前层上的卷积是否可分离。 从理论上讲,与传统的卷积相比,可分离的卷积的加速度为k ^ 2倍,其中,k为滤波器大小。 实际上,加速度可以小得多(这完​​全取决于图像分辨率,输入和输出滤波器的数量)。


最初,我们试图使所有卷积都是可分离的,但这使质量下降了很多。 然后,我们决定仅使前3个卷积可分离,它们以较高的图像分辨率工作,因此,与后续卷积相比,需要进行更多的计算。 同时,这种替换的质量已经略有下降。 总计由于可分离性,神经网络又加速了20%。


剩下最后一个无法解释的时刻-最后一层中的数字N是什么意思。 N负责我们要区分的不同类型的对象(在本例中为条形码)的数量。 如果我们正在考虑最简单的情况-当您只需要查找对象,而无需确定它们的类型(这是条形码,无论如何)-您可以考虑N = 0。 如果我们仍要区分条形码的类型(这是[某某某类]类型的条形码),则在最后一层中添加N个通道,在其中预测某种类型的概率。 现在,在接收到条形码所位于的矩形形式的检测之后,我们可以平均此找到的矩形内的类的概率,从中我们可以找到找到的条形码的类型。


结果


收到解决方案后,您应该始终环顾四周,并将解决方案的质量与早期研究进行比较。 通常,搜索条形码的任务不是很流行,在过去的10年中,每年仅出版1-2篇文章(众所周知,击败最新技术的最简单方法是找到不受欢迎的任务,我们最终成功了.. )。 下表与两个数据集上的其他方法进行了比较,其中一种获得了更好的结果。



当然,卓越并不是给人留下深刻印象,但仍然存在。 但是,找到的解决方案的主要功能不完全是速度,而是速度-与同一GPU(GTX 1080)上的同一YOLO相比,并且在更高的图像分辨率下,我们的方法的运行速度快约3.5倍。



除了速度优势外,最终模型的重量也有优势。 该探测器具有约3 万个标度,而绝大多数现代卷积网络(甚至针对移动设备都经过了改进)具有数百万个参数。 最终解决方案的重量甚至小于LeNet,后者的参数约为6万。


结论


实际上,这项工作基于两个简单的想法:


  1. 通过语义分割进行检测。
  2. 使用具有少量通道的扩张卷积序列,以使接收场尽可能快地增长。

结果是非常轻便且快速的体系结构,尽管如此,它仍然显示出相当不错的结果(甚至在查找条形码的不受欢迎的任务中击败了SOTA)。 另外,该方法的应用不限于条形码。 我们使用相同的体系结构来查找文本,搜索名片和护照,从而在这些任务中获得良好的结果。


但是,值得注意的是,这种形式的方法有局限性。 如果2个相同类型的对象距离很近,它们将粘在一起。 也许在下一个系列中,我们将告诉您如何处理此类问题。


基于条形码的实验结果,我们写了一篇文章将在悉尼的ICDAR2019上发表。


文学作品


  1. 一篇包含我们实验结果和大量细节的文章。 通过语义分割的通用条形码检测器
  2. 一篇关于语义分段体系结构开发的优秀评论文章。 连结
  3. PixelLink:通过实例分割检测场景文本
  4. 本文是关于使用膨胀卷积通过从上下文中收集信息来改善预测。 扩张卷积的多尺度上下文聚合

计算机视觉研究小组

Source: https://habr.com/ru/post/zh-CN455764/


All Articles