State-of-the-art review and benchmarking of barcode localization methods
Abstract
尽管条形码有着悠久的历史,但它仍然是供应链管理中必不可少的技术。此外,条形码在工业工程中有着广泛的应用,特别是在仓库自动化、组件跟踪和机器人引导方面。为了检测图像中的条形码,文献中提出了多种算法,自深度学习兴起以来,人们对该主题的兴趣显著增加。然而,该领域的研究受到许多限制,包括公共数据集和代码实现的稀缺,这阻碍了已发表结果的可重复性和可靠性。为此,我们开发了BarBeR(Barcode Benchmark Repository),这是一个用于测试和比较条形码检测算法的基准。
该基准测试包括各种条形码检测算法的代码实现,沿着一套有用的度量标准。在支持的定位方法中,有多种深度学习检测模型,将用于评估人工智能对该领域的最新贡献。此外,我们提供了一个包含8 748个条形码图像的大型注释数据集,将多个公共条形码数据集与标准化注释格式相结合,用于检测和分割任务。最后,我们提供了关于条形码本地化的历史和文献的全面总结,并分享了在我们的数据集上运行基准测试所获得的结果,提供有价值的见解不同算法的性能时,应用于现实世界的问题。
该论文针对条形码定位研究中数据集稀缺、可复现性差、评估指标不一致的问题,提出了BarBeR 基准库与包含8748 张图像、9818 个标注条形码的标准化数据集,整合了 1D 和 2D 条形码数据并统一标注格式;系统综述了传统计算机视觉(如边缘检测、霍夫变换)与深度学习(如 YOLO、RT-DETR、Faster R-CNN)两类定位算法,通过单类 / 多类检测、时间性能测试验证,发现深度学习方法在精度上显著优于传统算法(如 RT-DETR 在 1D 单条形码检测中 F1-score 达 0.993),而传统算法(如 Gallo 方法)更具速度优势(单线程 1.632ms / 张),同时小型深度学习模型(如 YOLO Nano)能平衡精度与效率,为工业嵌入式场景提供参考。
Introduction
条形码是一种视觉化的数据表示方式,具有易于机器读取的属性,是一种自动识别技术,大大提高了数据采集和识别的准确性和速度。由于这个原因,加上它们的成本效益,条形码在各种现实世界的工程应用中得到了广泛的使用。首先,它们是供应链管理的基石,在管理从制造商到消费者的商品流方面发挥着至关重要的作用。它们有助于跟踪库存,管理物流和提高效率.其次,条形码广泛用于仓库,以自动化货物接收,存储和发送过程,有助于减少人工错误并提高操作速度。
条形码也是自动化中的一种宝贵工具,其应用范围从无人零售到机器人导航。其他值得注意的应用是制造业中的组件跟踪和产品识别的零售。尽管他们成立于七十多年前,在当今的数字时代,条形码继续保持其地位。AIDC 100预测在未来几年内条形码将持续使用,这一预测得到了学术文献的证实。这反映在条形码阅读器市场的预计增长中,该市场在2022年价值74亿美元,预计到2032年将达到133亿美元,从2023年到2032年,复合年增长率为6.3%。
条形码分为两类:一维(1D或线性)和二维(2D)。线性条形码用不同宽度和间距的线条编码数据,但数据存储容量有限。为了解决这个问题,2D条形码被引入。它们的结构允许在垂直和水平轴上存储数据,与1D条形码相比,提供更大的容量。阅读条形码的过程通常可以分为两个宏观步骤:定位和解码。一些论文关注这两个步骤。
然而,大多数出版物都只关注本地化部分。特别是最近,使用公共第三方库来处理解码步骤已经成为常态。最常用的两个库是ZXing1和Zbar。2每个软件工具都可以处理1D和2D条形码。因此,从现在开始,我们的主要重点将是本地化。
条形码识别通常用于工业应用中,其中精度和速度至关重要。直到最近,定位算法的实时速度只能通过从图像中计算手工制作的特征来实现。在这方面,线性条形码有两个主要特征:它们由高对比度的线构成,并且这些线是平行的。为了利用这两个特征,大多数条形码定位方法通常包括初始边缘检测阶段和聚集阶段。二维条码是由两组相互旋转90度的平行线组成的。一种常见的策略是使用霍夫变换来找到一组垂直线。
随着2012年AlexNet的重大突破,深度学习方法已经主导了计算机视觉领域。近年来,大型、高质量、公开可用的标记数据集的出现,以及GPU计算的巨大进步,推动了深度学习重要性的提高。最初,神经网络用于处理图像的提取特征,因为端到端模型需要更多的处理时间。Zamberletti等人提出的方法就是这种情况,该方法使用神经网络来处理图像的Hough变换。
然而,在接下来的几年里,端到端模型的使用变得更加突出。根据Wudhikarn等人的研究,在2015年至2021年期间,有25篇出版物介绍了一种利用深度学习技术进行条形码定位的方法(1D,2D或两者兼而有之)。在25篇综述的论文中,有9篇使用了自定义CNN模型。其余论文采用了公开可用的架构,其中YOLO是最受欢迎的,其次是Faster R-CNN和SSD。基于深度学习的条形码和QR码检测方法已经被提出了许多,许多论文都比较了两种或多种方法。然而,一些问题阻碍了对方法有效性的明确结论。
数据集可用性。大多数文献主要依赖于1D条形码的两个公共数据集:艺术实验室和WWU明斯特,分别包含430和1055个图像。对于二维条形码,最常用的公共数据集是Dubska QR。这些数据集相对较小,并且随着后续出版物继续提高他们在这些数据集上的得分,确定这些改进是否转化为现实世界的应用变得具有挑战性。此外,这些数据集肯定太小,无法训练神经网络进行对象检测。其他一些公共数据集也被使用过,但它们也相当小。
超过5000个图像的条形码数据集只有两种类型:私有或合成。然而,依赖合成数据集进行评估可能会导致误导性结果。例如,Katona和Nyúl提出的方法在合成数据集上实现了96.8%的准确率,但在明斯特数据集上测试时,平均准确率下降到19.8%.另一个问题是缺乏跨数据集的标准化。不同的数据集采用不同的格式,这使得在没有额外预处理的情况下使用多个数据集变得复杂。
重复性。该研究领域的大多数出版物都没有发布用于测试的代码。这使得重复实验更加耗时,因为它需要从头开始编写代码。即使在代码可用的罕见情况下,也很少发现使用相同算法,数据集,使用不同的编码语言和框架进一步使不同方法的比较复杂化。
一致性。第三个问题是不同的研究使用不同的指标,即使使用相同的算法和数据集也会导致矛盾的结果。例如,Sörös和Flörkemeier在明斯特数据集上将他提出的方法与Tekin和Coughlan以及Gallo和Manduchi方法进行了比较。Jaccard指数(J)被用作一个度量,良好的检测定义为J>0.5。Tekin的方法排名最高,其次是Gallo,然后是Sörös。使用Dice相似系数(DSC)比较了相同数据集上的相同算法,阈值为0.8。
这一次,苏罗斯的方法排在第一位,其次是加洛和泰金。改变评价指标可以完全改变这些方法的排名。因此,在比较不同的实验时使用一致的指标集并使用多个指标进行全面比较至关重要。本文的目标是解决条形码定位研究中的这些挑战。特别是,这项工作提供了几个关键贡献:
- 首先,我们将对现有的条形码定位方法进行详尽的回顾,综合文献中的各种方法,这将为理解该领域的当前前景提供一个坚实的基础;
- 公开发布了一个包含8748幅图像的注释数据集。该数据集合并了1D和2D条形码的多个公共数据集,标准化了注释格式。格式,它们可以很容易地转换为COCO或YOLO使用我们提供的转换脚本进行格式。条形码区域用多边形描述,允许检测和分割;
- BarBeR(Barcode Benchmark Repository)是一个用于条形码检测的公共基准测试。该基准测试包括一组用于比较的默认算法,但可以很容易地扩展到包括任何定位算法。此外,我们的基准测试还包括一系列可用于评估条形码检测算法性能的指标。该基准测试是开源的,以及在拟议数据集上训练深度学习模型的脚本,通过允许研究人员在我们的工作基础上建立,促进了我们发现的可重复性,并促进了该领域的进一步研究。
本文的结构如下。第2节描述了我们发现的公开可用的数据集,它们的特点,以及我们开发统一注释标准的过程。第3节提供了1D和2D条形码检测方法的历史。在第4节和第5节中,我们分别详细介绍了我们的基准测试中选择的公开可用的检测算法和深度学习架构。之后,第6节探讨了对象检测中使用的评估指标和我们的实现选择。然后在第7节中,我们可以找到对基准测试的存储库、结构以及可用测试和方法的描述。第8节,第9节,第10节介绍了收集的基准测试结果,包括单类检测(1D或2D)、多类检测和定时测量。最后,第11节将给出最终结论。
条形码应用:1D(线性,数据容量有限)与 2D(二维码等,双向存储数据)广泛用于供应链、仓储、自动化等场景,市场持续增长。条形码读取分为定位与解码两步,现有研究多聚焦定位,解码依赖 ZXing、Zbar 等第三方库
开源地址:GitHub(https://github.com/Henvezz95/BarBeR),5 种传统算法代码、6 种深度学习模型训练脚本、多评估指标工具,支持单类检测(1D/2D 单独测试)、多类检测(1D+2D)、时间性能测试。传统算法(5 种):依赖手工特征,无置信分数。深度学习模型(6 种):端到端训练,输出置信分数。
评估指标,无置信分数指标:IoU(Jaccard 指数)、Precision、Recall、F1-score;有置信分数指标:AP(平均精度)、mAP(均值平均精度)、AP@[0.5:0.05:0.95]、AP_S/AP_M/AP_L(按目标尺寸分类)
精度上,深度学习模型显著领先(1D 单条形码检测 F1-score≥0.987,2D≥0.975),传统算法最优者(Yun et al.)F1 仅 0.757;速度上,传统算法更具优势(PC 端 Gallo 算法 1.632ms / 张,嵌入式设备 53.45ms / 张),深度学习模型需 GPU 加速才能达到实时(PC 端 GPU 最快 1.447ms / 张,嵌入式设备超 2 秒 / 张)。适用场景:1)深度学习模型:对精度要求高、硬件资源充足的场景(如仓储自动化、高清图像检测);2)传统算法:资源受限的嵌入式场景(如手持扫码设备、低成本工业传感器)。
BarBeR 基准库的核心价值是解决条形码定位研究中可复现性差、评估标准不统一的行业痛点,提供标准化的测试平台。关键组件包括:1)8748 张标准化标注数据集;2)5 种传统算法 + 6 种深度学习模型的开源代码;3)多维度评估指标工具(IoU、Precision、AP、mAP 等)。支持可复现性与对比的方式:1)公开所有算法代码与数据集,统一依赖环境;2)提供固定的测试流程(单类 / 多类 / 时间测试)与参数配置;3)支持自定义算法接入,采用统一指标输出结果,便于跨研究对比。
Datasets
对于这个项目,我们需要足够大的数据集来可靠地比较不同的算法和训练对象检测神经网络。为此,我们回顾了有关条形码检测和解码的现有文献,以识别公开可用的数据集。
WWU明斯特。发布于2008年,是我们发现的最古老的数据集。它包含1055张使用诺基亚N95拍摄的一维条形码图像。所有图像的分辨率为2592 × 1944。
Artelab Medium Barcode 1D。于2010年发布,由430张线性条形码图像组成。所有图像均显示图像中心附近的单个条形码,旋转± 30 °。
Szentandrási QR.由Szentandrási等人发布,该数据集由115张QR码图像组成。这些图像中的大多数具有15 MegaPixels的分辨率,并且包含多个QR码。
Dubska QR。Szentandrasi QR数据集的同一组发布了另一个包含810张包含QR码的图像的数据集,其中一半是用相机拍摄的,另一半是用智能手机拍摄的。Szentandrasi QR和Dubska QR数据集共有25张图像;这些图像被从前者中删除以避免重复。
Bodnar-Huawei。于2018年发布,由98张用华为智能手机拍摄的QR码图像组成,所有图像都包含一个代码,分辨率为1 600×1 200。
Skku Inyong DB.于2017年发布,该数据集包含325张分辨率为1 440×2 560的图像,其中包含多个线性条形码实例。
ZVZ-Real。另一个有趣的数据集是由Zharkov和Zagaynov以ZVZ-Real的名义发布的。该数据集包含921张各种1D和2D条形码的图像。一些图像描绘了多个条形码。
DEAL KAIST。这是我们收集的最大的条形码数据集,通常被称为DEAL KAIST Barcode或QuickBrowser数据集。该数据集包含3308个不同分辨率(从141×200到3480 × 4640)的条形码图像(大部分是线性的)。
InventBar和ParcelBar。最后,Kamnardsiri et al致力于开发另外两个线性条形码数据集,用于神经网络训练和测试。这两个数据集分别有527和844张图像。特别是ParcelBar,是我们发现的最困难的条形码检测数据集之一,因为条形码与图像的大小相比非常小。
OpenFood Facts。除了文献中使用的这些公共数据集外,我们还从Open Food Facts github收集了其他185张线性条形码图像。
所收集的数据集共包含8 748张图像,其中9 818张带注释的条形码,8 062张线性条形码和1 756张二维条形码。数据集中包含的图像示例如图1所示,而表1提供了所使用的每个数据集的细分,以及有关它们的一些信息。包括的1D条形码的符号是Code 128,Code 39,EAN-2,EAN-8,EAN-13,GS 1 -128,IATA 2 of 5,Intelligent Mail Barcode,Interleaved 2 of 5,Japan Postal Barcode,KIX-code,PostNet,RoyalMail Code,and UPC.对于二维条码,包括的符号体系有阿兹特克,Datamatrix,PDF-417,and QR Code.
图 1. 数据集图像样本。一些图像包含单个线性条形码或单个二维条形码。相反,其他图像包含多个代码,有时属于多个类别。
表 1 为基准收集的公共数据集列表。 # Images 是数据集中的图像数量。最小和最大分辨率分别指数据集中最小和最大像素数的图像的分辨率。 # 1D 和 # 2D 分别表示数据集中线性和二维条形码实例的数量。
我们遇到的一个直接挑战是,并非所有数据集都有注释,并且可用的注释遵循各种不同的格式。一些注释用于对象检测,另一些用于分割。此外,在用于1D检测的数据集中存在未注释的2D条形码,反之亦然。因此,我们为数据集中的所有图像创建了新的注释。Datalogic得利捷的专有软件用于自动生成注释。该工具生成4-点多边形,并提供有关代码的附加信息,例如其类型,此外,我们还有关于条形码的像素密度的信息,通常以每个元素的像素(PPE)来测量,即条形码中最小元素的平均宽度(如图2所示)。这种测量可以称为每个模块的像素(PPM)。
图2。(a)显示线性条形码的元件(或模块),而(b)显示二维条形码的元件(或模块)。
虽然大多数代码都是这样注释的(8096),但有少数代码(1722)由于模糊、噪声或不正确的比例而无法解码(分辨率太高或太低)。这些附加代码已使用VGG注释器手动注释,他们缺少一些信息,如PPE。缺少的字段已填充符号值-1。如上所述,注释使用多边形而不是方框,因此适用于检测和分割。
Algorithms history
Early barcode localization efforts
- 约瑟夫伍德兰和伯纳德银发明了线性条形码在1949年和专利于1952年。除了条形码的提议,他们还描述了一种阅读它的方法。这个想法是将光直接聚焦在代码上,并使用光电管将反射光转换为模拟信号。最后,使用模拟电路来解码该信号。激光扫描仪成为70年代的主要解码方法,带来了众多光学创新。
- 然而,这些系统要求读取器直接对准条形码。20世纪90年代,2D图像条形码阅读出现。这种方法的一个显著优点是能够从更宽的视野读取条形码,但要做到这一点,Viard-Gaudin等人提出了一种使用一组Sobel滤波器和斑点检测的算法。Liao等人使用边缘检测器来找到条形码边缘及其方向,以将条形码与背景分离。第二年,Jain和Karu探索了使用多层感知器(MLP)进行纹理分类。在其中一个实验中,作者展示了如何将这种方法用于条形码定位和分割。Hough变换在Muniz等人(1999)的工作中获得了线性条形码定位的牵引力。同年,Ottaviani等人提出了第一个基于梯度直方图的QR码定位方法。
Evolution and recent approaches
- 多年来,许多出版物已经解决了条形码定位的局限性,并将其有效性扩展到更一般的应用。基于纹理方向分析定位2D条形码的方法由Hu等人测试。描述了一种定位线性条形码的方法,该方法速度足够快,可以在当时的移动的手机上使用。但是,它缺乏旋转不变的特性。发布了一个名为BLaDE的Android应用程序(条形码定位和解码引擎),这是方向不变,可以在智能手机上实时工作。同年,展示了Hough变换在QR码定位中的适用性。提出了一种基于矩阵结构的一维和二维条形码方法,而描述了一种基于Hough变换和机器学习的检测算法。
The deep learning era
- Chou et al通过利用小型卷积神经网络(CNN)进行QR码检测标志着一种转变。基于深度学习的方法从此主导了该领域,Yun和Kim是一个值得注意的例外,它依赖于方向直方图。同年,汉森et al在ArteLab和WWU明斯特数据集上训练和测试了YOLO-v2网络,取得了令人印象深刻的成果。第二年,Li et al报告了使用 Faster R-CNN在相同数据集上获得更高的准确性分数。Zharkov和Zagaynov提出使用Dilated-Convolution网络来分割各种线性和二维条形码。Do和Kim介绍了一种用于真实的的统一模型-通过将多位识别集成到一级检测模型中,对条形码和简单物体进行时间检测和解码。最近,Quenum等人通过结合修改的区域建议网络(RPN)和Y-Net分割网络,在速度和性能上都超过了YOLO-v4和Mask R-CNN。近年来,人们提出了许多其他关于基于深度学习的条形码检测的论文。
Available algorithms
- 线性和二维条码的算法已经提出了很多,但很多都缺乏公开的实现。总的来说,我们选择了五个用C++实现的功能算法,它们是比较次数最多的算法,并且有一个公开的实现。这些算法是:Gallo和Manduchi,Tekin和Coughlan,Sörös和Flörkemeier,Zamberletti等人以及Yun和Kim。由于Tekin的方法生成扫描线而不是检测框,因此将其排除在我们的比较之外,但是它包含在存储库中用于测试。因为我们的基准测试是用Python编写的,所以这些方法已经编译为使用Ctypes在Python中加载。本节的其余部分将详细介绍可用的检测算法是如何工作的。在表2中,还报告了这些选定方法的主要特征的总结。
表 2 测试的公共算法的特征。
Gallo and Manduchi
这种定位方法是由Gallo和Manduchi提出的。为了简洁起见,我们将使用Gallo等人或Gallo的方法来指代这种算法。这种算法是为了提高速度而设计的,使其能够在当代移动的设备上运行。该方法旨在准确识别线性条形码,即使是在模糊或噪声影响的图像中。然而,它是专门为1D条形码量身定制的,并产生单个感兴趣区域,使其不适合检测单个图像中的多个条形码。支撑该算法的关键假设是条形码的方向。它假设条形码水平放置,其平行线垂直对齐。只有小于±30度的旋转才能进行可靠的检测。第一步是计算一个热图,它是水平和垂直导数之间的差:I e ( n ) I_e(n)Ie(n)。
𝐼 𝑒 ( 𝑛 ) = ∣ 𝐼 𝑥 ( 𝑛 ) ∣ − ∣ 𝐼 𝑦 ( 𝑛 ) ∣ , ( 1 ) 𝐼_𝑒(𝑛)=|𝐼_𝑥(𝑛)|−|𝐼_𝑦(𝑛)|,(1)Ie(n)=∣Ix(n)∣−∣Iy(n)∣,(1)
I e ( n ) I_e(n)Ie(n)在条形码区域中的值应该合理地高于其他区域。对I e ( n ) I_e(n)Ie(n)应用框过滤器以获得平滑的热图I s ( n ) I_s(n)Is(n)。之后使用大津的方法使用单个阈值对I s ( n ) I_s(n)Is(n)进行二值化。二值化的热图可能包含多个斑点,但该方法假设图像中仅存在单个条形码。因此,仅选择一个斑点,并且它是包含像素0的斑点,该像素是使n 0 n_0n0最大化的像素I s ( n ) I_s(n)Is(n)。平行于图像边界的垂直线和水平线从0开始跟踪𝑛,形成一个矩形,其边平行于图像的轴,并包含这些线与斑点边缘的交点。通过这个矩形中心的水平线()被选作扫描线。通常,斑点也包括条形码的安静区,因为盒子过滤器的尺寸很大。为了去除它,扫描线从两侧减少,直到找到小于平均值的85%的强度。
Soros and Florkemeier
Sörös和Flörkemeier提出了一种针对1D和2D条形码设计的条形码检测方法,该方法具有方向不变性并且非常抗模糊。为了简洁起见,我们将使用Soros等人或Soros方法来引用该算法。然而,该方法只能为每种条形码类型输出单个ROI。其想法是计算两个热图,一个用于线性码,一个用于二维码。第一步是计算图像每个像素的结构矩阵𝑀𝑝:
M = [ c x x c x y c x y c y y ] M=\begin{bmatrix} c_{xx} & c_{xy} \\ c_{xy} & c_{yy} \end{bmatrix}M=[cxxcxycxycyy]
其中,使用窗口k,从图像k和k在像素k周围的图像块k上的水平和垂直导数计算k的k的k项:
c i j = ∑ ( x , y ) ∈ D w ( x , y ) I i ( x , y ) I j ( x , y ) c_{ij}=\sum_{(x,y)\in D}w(x,y)I_i(x,y)I_j{(x,y)}cij=(x,y)∈D∑w(x,y)Ii(x,y)Ij(x,y)
这些值𝑐𝑖𝑗用于计算Ando定义的单向方差检测器和全向方差检测器。这两个测量值分别用E11和E12表示,并定义为:
m 1 = ( c x x − c y y ) 2 + 4 c x y 2 ( c x x + c y y ) + ϵ m 2 = 4 ( c x x c y y − c x y 2 ) ( c x x + c y y ) + ϵ m_1=\frac{(c_{xx}-c_{yy})^2+4c_{xy}^2}{(c_{xx}+c_{yy})+\epsilon}\\ m_2=\frac{4(c_{xx}c_{yy}-c_{xy}^2)}{(c_{xx}+c_{yy})+\epsilon}m1=(cxx+cyy)+ϵ(cxx−cyy)2+4cxy2m2=(cxx+cyy)+ϵ4(cxxcyy−cxy2)
为每个像素计算值 𝑚1 和 𝑚2,生成两个热图。值 𝑚1(单向方差检测器)在存在边缘结构的地方较强,而 𝑚2(全向方差检测器)在拐角处较高。值 𝜖 是一个小常数,可以避免平坦区域中的 0∕0 情况。计算 𝑚1 和 𝑚2 后,将盒式过滤器应用于每个热图。将两个盒过滤图线性组合以获得两个条形码显着性图𝑠1和𝑠2,一个用于线性码,另一个用于二维码。最后,对所得图像进行阈值处理,并按照 Gallo 方法,通过从具有最大强度的像素跟踪二值图像来找到条形码框。
Zamberletti et al
该方法由 Zamberletti 等人 提出。该算法的第一步是将 Canny 边缘检测器应用于图像𝐼,获得边缘图𝐼𝑒。一旦确定了边缘图,就在二维霍夫变换空间 H 中计算𝐼𝑒的霍夫变换。𝐼中的一条线表示为𝐻中的一个点,该点的(𝑥,𝑦)坐标表示𝜌和𝜃,其中𝜌是该线距原点的距离,𝜃是其角度。用 𝐴𝐻 表示的图像的二维霍夫变换被分成大小为 𝑚 × 𝑛 的单元,由多层感知器 (MLP) 一次处理一个。 MLP 的输出与输入具有相同的维度,因此处理每个单元格时我们获得具有相同维度 𝐴𝐻 的矩阵。 𝐴𝐻 的每个值表示该单元格包含与条形码对应的行的概率。该算法假设所有条形码都以相同的角度定向,并且通过采用条形码行数最多的角度𝜃𝑏(即元素总和最高的𝐴𝐻列)来预测该角度。
角度预测后,算法通过将 Galamhos 等人 的相同技术应用于 𝐴𝐻 来找到 𝐼 中所有线段的集合 𝑆。我们将 𝑆𝑏 ⊂ 𝑆 与 𝜃𝑏 角度相差小于 ±5 ° 的所有线段的集合称为 𝑆𝑏 ⊂ 𝑆 。创建二值图像 𝐼𝑠𝑏,其中分配给 𝑆𝑏 的片段的像素的强度值为 1,其他片段的像素分配为 0。然后将 𝐼𝑠𝑏 旋转 90° -𝜃𝑏 度,使得大部分片段是垂直的。然后,定义两个直方图来描述二值图像的行和列的强度分布。这些直方图的每个箱都被计算为二值图像中行/列的元素的总和。平滑滤波器应用于每个直方图。
最后,条形码的边界框被确定为与直方图中剩余的非零箱相关联的行和列之间的交叉区域。该算法可以生成多个旋转框,但所有检测都具有相同的角度。这对于具有多个条形码的单个标签非常有用,其中每个代码都具有相同的旋转角度。在线提供的开源代码与OpenCV版本≤2兼容。我们对其进行了修改,使其与OpenCV 4兼容。
Yun and Kim
Yun 和 Kim 描述了这种检测方法。为了简洁起见,我们将该算法称为 Yun 等人或 Yun 的方法。该算法专为检测线性条形码而设计,支持每张图像进行多次检测。第一步是使用 Sobel 算子对图像的灰度版本计算图像导数 ∇𝐼𝑥 和 ∇𝐼𝑥,并使用它们来计算梯度的模和角度:
m a g ( p ) = ∇ I x + ∇ I y a n g ( p ) = a r c t a n ( ∇ I y ∇ I x ) mag(p)=∇ I_x+∇ I_y\\ ang(p)=arctan(\frac{∇ I_y}{∇ I_x})mag(p)=∇Ix+∇Iyang(p)=arctan(∇Ix∇Iy)
方向直方图h 𝐺 ℎ_𝐺hG是通过计算每个方向有多少个幅度大于阈值𝑇𝑚𝑎𝑔的像素来计算的。直方图共有 18 个 bin,每个 bin 覆盖 10°。映射𝑉 h 𝐺 𝑚 𝑎 𝑝 ( 𝑏 ) 𝑉^{𝑚𝑎𝑝}_{ℎ_𝐺} (𝑏)VhGmap(b)将主方向分量与 ℎ𝐺 中分析的弱方向分量分开:
v h G m a p = { O s i f h G > T h i s t O w o t h e r w i s e T h i s t = m a x b ( h G ( b ) ) ∗ a v^{map}_{h_G}=\left\{\begin{matrix} O_s & if~h_G>T_{hist}\\ O_w & otherwise \end{matrix}\right.\\ T_{hist}=max_b(h_G(b))*avhGmap={OsOwifhG>ThistotherwiseThist=maxb(hG(b))∗a
其中𝑂𝑠表示主方向分量,𝑂𝑤是弱方向分量,𝑇ℎ𝑖𝑠𝑡是用于分离主方向分量的阈值。常数 𝛼 是用于计算 𝑇ℎ𝑖𝑠𝑡 的比率常数,并且 0 < 𝛼 < 1。为了检测显着区域,使用熵方案。图像被划分为不重叠的单元。对于每个单元格,我们分配一个方向,这个方向是局部方向直方图中具有最高值的方向ℎ𝐿。我们用 𝑖𝑚𝑎𝑥 表示 ℎ𝐿 的最大分量的索引。每个补丁𝑓的熵计算如下:
- E ( f ) = { J i f V h G m a p ( i m a x ) = O s 0 o t h e r w i s e J = ∑ i h L ( i ) − h L ( i m a x ) E(f)=\left\{\begin{matrix} J & if ~V^{map}_{h_G}(i_{max})=O_s\\ 0 & otherwise \end{matrix}\right.\\ J=\sum_ih_L(i)-h_L(i_{max})E(f)={J0ifVhGmap(imax)=OsotherwiseJ=i∑hL(i)−hL(imax)
如果斑块的主成分比其他成分强得多,则 𝐸(𝑓) 很小,表明条形码区域的概率很高。对熵图𝐸(𝑓)进行阈值处理以获得显着性图𝑆(𝑓)。设置重要区域后,使用盒式滤波器对𝑆(𝑓)进行模糊,以消除噪声区域并连接分离的条形码区域。然后使用大津二值化对显着图进行二值化。最后,为了确定每个斑点的中心点和边界框,使用连接组件标记。
Deep-learning models
- 如前所述,近年来提出的大多数条形码检测算法都依赖于深度学习检测模型。一些作者发布了他们经过训练的架构。我们决定将其纳入我们的基准测试中,但由于我们的测试集和该网络的训练集之间存在重叠,我们从头开始重新训练它。此外,我们选择了一些在 MS-COCO 数据集上预训练的主流架构。然后使用迁移学习在我们的数据集上对这些网络进行微调。总共测试了六种不同的架构:Faster R-CNN、RetinaNet、YOLO Medium 和 Nano以及 RT-DETR。表 3 总结了这些架构的主要特征。
表 3 我们测试中使用的深度学习模型的特征。
Zharkov and Zagaynov
2019 年,Zharkov 和 Zagaynov 提出了一种用于检测一维和二维条形码的定制卷积神经网络架构。为了简洁起见,我们将参考 Zharkov 等人的架构。他们的架构由三个关键模块组成:
- 缩小规模的模块。该模块由三个卷积层和两个缩减层组成。它将输入图像分辨率降低了四倍,扩大了网络的感受野以实现更高效的处理;
- 上下文模块。受到 Yu 和 Koltun 工作的启发,该模块利用扩张卷积来进一步增加网络的感受野。它包含9个具有不同膨胀因子的卷积层;
- 分类层。它是一个 1 × 1 卷积层,具有 1 + 𝑛_𝑐𝑙𝑎𝑠𝑠𝑒𝑠 输出,其中 𝑛_𝑐𝑙𝑎𝑠𝑠𝑒𝑠 是不同条形码类型的数量(在我们的测试中为两种)。
该网络以输入分辨率的四分之一生成多通道输出图。第一个通道通过较高的值指示潜在的条形码位置。应用阈值后,提取单个斑点,并生成边界框。输出的其他通道用于对每个斑点进行分类,得分最高的通道确定条形码的类型。最后,将基于第一通道中预测像素平均值的置信度得分分配给每个检测到的框。为了训练网络,我们使用了其原始论文提出的损失函数。该损失函数旨在优先考虑高召回率而不是高精度。
Faster R-CNN
Faster R-CNN是第一个开发的近实时深度学习检测器。 Faster R-CNN 是一个两阶段目标检测网络,这意味着它在定义候选边界框之前生成感兴趣区域。其架构由两个主要部分组成:
- 区域提案网络(RPN)。提出区域的全卷积网络。卷积主干用于从图像中提取特征。然后,对于特征图的每个滑动窗口,它提出一组区域。这些提案相对于一组参考锚框进行参数化;
- Faster R-CNN 检测器。给定图像和一组可能的 ROI 的神经网络最多可检测每个 ROI 的 𝑘 对象。对于每个对象,都会生成一个边界框和一个分类标签。
Faster R-CNN 的主要贡献是 RPN 运行几乎无成本,因为它直接在提取的特征上运行。这样,特征提取主干网只需要运行一次,其输出就可以被 RPN 和 Fast R-CNN 使用。 Faster R-CNN 的后续改进是特征金字塔网络 ,它链接高层和底层特征数据,改进小尺寸目标检测。
我们选择该神经网络进行测试是因为它是第二大用于条形码检测的神经网络。此外,Faster R-CNN 是基于深度学习的目标检测领域被引用最多的论文之一。在我们的实验中,我们使用 ResNet-50和 FPN 作为 Faster R-CNN 的骨干网。
RetinaNet
RetinaNet 模型首先由 Lin 等人描述。RetinaNet 是一个单级网络,由一个主干网络和两个特定于任务的子网络组成:
- 骨干网络。它由自下而上的路径和具有横向连接的自上而下的路径组成。自下而上的路径用于特征提取,计算不同尺度的特征图。自上而下的路径在后续步骤中对空间上较粗糙的特征图进行上采样。然后将来自两条路径的相同尺度的特征合并在一起。
- 用于对象检测的子网络。它进行与类无关的边界框回归。检测是相对于不同尺度的平移不变锚框进行的。
- 用于对象分类的子网络。预测每个锚点和对象类在每个空间位置处存在对象的概率。它不与对象检测子网络共享权重。
RetinaNet 引入了一种称为 Focal Loss 的新型损失函数,旨在解决训练过程中类别不平衡的问题。尽管 RetinaNet 是一个非常著名的物体检测器,但还没有条形码定位论文使用过。在我们的实验中,我们使用 ResNet-50 FPN 作为主干,与我们为 Faster R-CNN 选择的主干相同。
YOLO
Redmon 等人 推出的 YOLO 以其速度彻底改变了目标检测,为实时应用铺平了道路。它是一个单阶段网络,可预测图像每个区域的边界框和概率。尽管最初的定位精度存在问题,特别是对于小物体。网络的以下迭代更加关注这个问题,显着提高了其性能:
- Yolo v2合并了批量归一化、锚框和维度集群;
- Yolo v3 增强了主干网,并通过在三种不同粒度尺度上进行预测来实现多尺度检测;
- Yolo v4 引入了特征聚合 和 SPP 块 来增加感受野和特征分离。
- 架构中的其他增量变化,例如无锚检测和损失函数的改进,已从 YOLO-v5 应用到 YOLO-v7 。
2023 年 1 月,发布 YOLOv5 的同一团队 Ultralytics 通过推出 YOLO-v8 确认了 YOLO 家族的最新成员。虽然 YOLO-v8 存储库的详细论文和其他功能仍在酝酿中,但初步比较表明它超越了其前身,为 YOLO 系列建立了新的基准。
我们决定将 YOLO 纳入我们的基准测试中,因为它是最著名的对象检测架构之一,也是条形码检测文献中最常用的架构 。此外,对性能和效率的关注使 YOLO 成为工业应用的理想候选者 。
在我们的测试中,我们使用了该网络的最新版本,即 YOLOv8。特别是,我们测试了两种架构:YOLO-v8 Medium 和 YOLO-v8 Nano。前者是YOLO-v8的标准架构。后者在保持类似结构的同时,是一个更紧凑的网络,具有更少的层和通道,从而使重量减少了八倍。
RT-DETR
Vaswani 等人 提出的 Transformer 彻底改变了自然语言处理 (NLP) 领域。它们基于注意力机制,该机制允许模型在生成输出时关注输入序列的不同部分。无论依赖关系在输入中的位置如何,Transformer 都能处理依赖关系,这使得 Transformer 对于 NLP 任务特别有效。 Transformers 在 NLP 领域取得的令人难以置信的成就促使研究人员探索其在计算机视觉任务中的应用。如今,基于变压器的检测器 (DETR); Co-DETR在 MS-COCO 数据集上获得了物体检测的最高 mAP 分数。然而,DETR 的高计算成本使得它们很难适合实时应用。为了解决这个问题,Lv 等人 在 2023 年提出了一种更快的 DETR,称为 RT-DETR,它可以实时工作。RT-DETR 架构由三个主要组件组成:
- 骨干网络。它是一个卷积神经网络,可以从图像中提取不同尺度的特征;
- 混合编码器。它将主干的多尺度特征转换为图像特征序列;
- Transformer 解码器。首先,采用 IoU 感知查询选择从编码器中选择固定数量的图像特征。这些选定的特征用作解码器的初始对象查询。最后,配备辅助预测头的解码器迭代地细化这些对象查询以生成边界框和置信度分数。
值得注意的是,这种架构与其他基于 Transformer 的网络一起,消除了非极大值抑制的需要,从而加速了后处理阶段。我们选择将 RT-DETR 纳入我们的评估中,以确保在我们的测试中包含基于 Transformer 的网络。正如之前指出的,这些网络目前在物体检测方面表现出色,但现有的论文还没有将 Transformer 应用到条形码检测中。
Evaluation metrics
我们研究的主要目标之一是引入一套评估测试结果所需的条形码检测和定位指标。特别是,到目前为止,我们已经描述了两种主要类型的算法:
- 非基于深度学习。这些方法利用传统的计算机视觉技术进行对象检测。图像特征通常是手工制作的。虽然它们可能会结合较小的机器学习模型来进行特征处理,但它们并没有经过端到端的训练;
- 基于深度学习。依靠深度学习模型进行特征提取和处理。
主要区别在于非深度学习算法输出框和类,但不输出置信度分数。然而,深度学习检测模型会为每个预测的边界框生成置信度分数。因此,我们将指标分为两类:不需要置信度得分的指标和需要置信度得分的指标。
Metrics that do not require confidence
Intersection over union
- 为了评估检测的质量,我们想要测量检测到的边界框与真实边界框的接近程度。到目前为止,最常用的度量是并交交集 (IoU),也称为 Jaccard 指数。此测量是针对每个对象类别独立完成的。IOU 等于预测边界框 𝐵𝑝 和真实边界框 𝐵𝑔𝑡 之间重叠(交集)的面积除以它们并集的面积:
理想匹配的 IoU 为 1,而没有交集则 IoU 为 0。越接近 1,检测效果越好。 IoU 值通常以百分比表示,其中 50% 和 75% 是最常用的阈值。
Precision and recall
精确度衡量模型仅识别相关对象的能力,而召回率则评估模型在找到所有现有对象方面的成功程度。要计算精度和召回值,每个检测到的边界框必须首先分类为:
- 真阳性(TP)。与 GT 对象匹配的正确检测;
- 误报 (FP)。空旷区域的错误检测或现有物体的错误检测;
- 假阴性(FN)。未被检测到的真实物体。
给定一个 𝐺 地面实况数据集和一个输出总共 𝑁 检测的模型,我们将正确预测的数量定义为 𝑆 (𝑆 ≤ 𝐺)。精确率和召回率可以计算如下:
P r e c i s i o n = T P T P + F P = S N R e c a l l = T P T P + F N = S G Precision=\frac{TP}{TP+FP}=\frac SN\\ Recall = \frac{TP}{TP+FN}=\frac SGPrecision=TP+FPTP=NSRecall=TP+FNTP=GS
匹配真实值和预测框可能很复杂,因为可能存在 IoU 超过单个真实值框阈值的多个预测,或者单个预测可能与多个真实值框重叠。出于本研究的目的,我们采用了 COCO API 中使用的相同方法,该方法是为了评估 MS-COCO 数据集上的检测而开发的。本质上,它采用贪婪算法来单独检查检测框。对于每个检测框,该算法会找到具有最高交并集 (IoU) 分数的不匹配的真实框。如果 IoU 超过阈值,则建立匹配,并从不匹配的池中删除相应的真实框。如果 IoU 低于阈值,则被视为误报。最后任何剩余的不匹配的真实框都被视为假阴性。
𝐹1 score
𝐹1 分数是精度和召回率的调和平均值,并以单个标量值综合预测性能:
- F 1 = 2 ∗ p r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F_1=2*\frac{precision*Recall}{Precision+Recall}F1=2∗Precision+Recallprecision∗Recall
Curves
- 到目前为止,我们已经考虑了 IoU 的固定阈值(𝑇𝐼𝑜𝑈)。这种方法会导致误报和误报的静态水平,限制了我们对不同严格级别的模型性能的理解。特别是,精度和召回率是 IoU 阈值 𝑇𝐼𝑜𝑈 的单调递减函数。为了更深入地了解模型的行为,可视化精确率、召回率或 F1 分数与变化的 IoU 阈值之间的关系可能非常有益。
Metrics that require confidence
Average precision
通过设置置信度阈值𝜏,置信度大于𝜏的检测被视为阳性,其余为阴性。这使我们能够将精度、召回率和 𝐹1 分数表示为 𝜏 的函数:
Font metrics not found for font: .
𝑇𝑃 (𝜏) 和 𝐹𝑃 (𝜏) 均随 𝜏 减少,而 𝐹 𝑁(𝜏) 增加。因此,召回率是 𝜏 的递减函数,而关于精度则无法先验地说明。事实上,在现实场景中,𝑃 𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛(𝜏) 与𝑅𝑒𝑐𝑎𝑙𝑙(𝜏) 的图表经常呈现锯齿形图案 。平均精度 (AP) 定义为精度-召回率曲线的曲线下面积 (AUC)。为了处理曲线的锯齿形图案,我们使用 COCO API 的 Npoint 插值方法(N=101)来计算 AP。在N点插值中,第一步是在区间[0, 1]内等距取𝑁点,即:
R e ( n ) = N − n N − 1 , n = 1 , 2 , . . . , N Re(n)=\frac{N-n}{N-1},n=1,2,...,NRe(n)=N−1N−n,n=1,2,...,N
其中 𝑅𝑒(𝑛) 是第 𝑛 召回值。现在,我们希望每个召回值都有一个精度值 𝑃 𝑟,以计算函数 𝑃 𝑟(𝑅𝑒(𝜏)) 的黎曼积分。问题是,在给定精确率值的情况下,我们并不总是有单一的召回率值。为了解决这个问题,我们定义函数𝑃𝑟𝑖𝑛𝑡𝑒𝑟𝑝(𝑅),𝑅𝑒的连续函数,如下:
Font metrics not found for font: .
最后,我们可以使用以下等式计算 AP:
A P = 1 N ∑ n = 1 N P r i n t e r p ( R r ( n ) ) AP=\frac1N\sum^N_{n=1}Pr_{interp}(R_r(n))AP=N1n=1∑NPrinterp(Rr(n))
Mean average precision
对于具有许多类别的数据集,平均精度 (mAP) 定义为所有类别的平均 AP。它用于为所有课程提供单一的 AP 分数:
m A P = 1 C ∑ i = 1 C A P i mAP=\frac1C\sum^C_{i=1}AP_imAP=C1i=1∑CAPi
其中 𝐴𝑃𝑖 是第 𝑖 类的 AP 值,𝐶 是正在评估的类总数。
AP@𝑇𝐼𝑜U
- 我们用 AP@𝑇𝐼𝑜𝑈 表示给定 IoU 阈值 𝑇𝐼𝑜𝑈 的平均精度。通常,阈值 𝑇 为 0.5。
AP@[0.5:0.05:0.95]
- AP@[0.5:0.05:0.95] 是所有值 𝐴𝑃@𝑇𝐼𝑜𝑈 的平均值,其中 𝑇𝐼𝑜𝑈 在 0.5 到 0.95 范围内,步长为 0.05。也可以缩写为 AP@[0.5:0.95] 或 AP@[.5:.95]。
AP across scales
跨尺度的 AP 是一组三个指标,用 𝐴𝑃𝑆 、𝐴𝑃𝑀 和 𝐴𝑃𝐿 表示。这些指标等于 AP@[.5,.05:.95],但考虑到 GT 对象的面积:
- 𝐴𝑃𝑆 仅评估小型真实对象(面积 < 32*32 像素);
- 𝐴𝑃𝑀 仅评估中等地面实况对象(32*32 < 面积 < 96*96 像素);
- 𝐴𝑃𝐿 仅评估大型真实对象(面积 > 96*96 像素)。
当评估给定大小的对象时,评估中不考虑其他大小的对象(真实值和预测值)。
Benchmark description
Repository content
作为该项目的一部分,我们开发了 BarBeR,这是条形码本地化算法的基准。它的代码是可公开访问的,并且可以从 GitHub 下载。我们用于运行测试的数据集可以从同一个 GitHub 存储库下载。该项目包含构建以下公开可用的检测方法所需的文件。此外,该项目还包括使用 Ultralytics 或 Detectron2 训练神经网络和其他深度学习模型的脚本,并支持早期停止。该存储库包含多个测试脚本,每个脚本都支持多种配置。以下是测试脚本及其主要配置参数的细分:
- 单类检测。运行所有选定的算法,仅考虑具有选定类型条形码的图像。该脚本可以配置为仅允许线性条形码或二维条形码。还可以仅包含具有单个感兴趣区域 (ROI) 的图像,或允许每个图像有多个 ROI。此外,还可以设置用于重新缩放测试集中图像的目标分辨率。最后,我们可以指定在测试中使用哪些算法以及使用哪些参数;
- 多类检测。在测试集的所有图像上运行所有选定的算法。对于单类检测,我们可以选择测试中包含的大小调整分辨率和算法;
- 计时性能。测量运行算法所需的时间。这些时间可以取自所有数据集或其一部分的平均时间。
测试脚本采用Python 格式。该存储库还包含用于运行测试管道的 bash 脚本。例如,这对于 k 倍交叉验证很有用。
Methodology
本文将介绍单类和多类模式下的检测精度测试结果。我们使用 k 倍交叉验证(k=5)进行全面的准确性评估,将数据集分为五个相等的部分。每个部分都用作测试集,其余部分用于训练。深度学习模型使用 75% 的训练集进行训练,其余的作为早期停止的验证集(耐心 10 轮)。使用批量大小 16 和 Adam 优化器 对网络进行训练,配置学习率为 0.001、𝛽1 = 0.9 和 𝛽2 = 0.999。为了增强训练数据,我们应用了水平和垂直翻转,以及对亮度、对比度和饱和度的随机调整。 Gallo、Soros 和 Yun 的方法使用整个训练集进行调整,选择盒式滤波器窗口的最佳大小 。
Zamberletti 的方法采用了适用于霍夫变换的预训练 MLP 模型。原始 MLP 网络是在 ArteLab Rotated 数据集上进行训练的,该数据集不属于我们的数据集,从而防止任何信息泄漏。最后,我们将测量每种检测方法的时间。对于每个图像,检测运行三次并采用最低的计时值。这样做是为了消除外部因素的影响,例如后台进程、CPU 负载、一次性初始化开销、缓存和垃圾收集周期。所有测试均在配备 AMD Ryzen Thread ripper Pro 5965WX CPU(24 核)、128 GB DDR4 RAM 和 RTX 4090 GPU 的 PC 上进行。为了提供嵌入式系统性能的示例,我们还在 Raspberry Pi 3B+ 上运行了时间性能测试。
Single-class benchmarks
- 首先,通过仅考虑单类图像、线性条形码或二维条形码来测试可用的检测算法。
Single 1D barcode
此评估重点关注具有单个线性条形码的图像,使我们能够测试所有可用的算法,包括输出单个感兴趣区域 (ROI) 的算法。本次测试包含的图像总数为 6811 张。所有图像均使用“按最长边调整大小”方法调整大小。对于此测试,我们决定将最长边的值设置为 640 像素。这与 Gallo 等人和 Zamberletti 等人在其原始论文中测试方法所用的尺寸相同。 Soros和Yun的方法使用了更高分辨率,分别为960×723和1024×768。这也是 YOLO-v8 和其他对象检测网络的默认分辨率。在此分辨率下,我们的数据集包含 42 个小对象(面积 < 32*32 )、2 665 个中对象(32*32 < 面积 < 96*96 )和 4 104 个大对象(面积 > 96*96)。图 3 提供了有关数据集中对象大小分布的附加信息。
图 3。该直方图描绘了将图像大小调整为 640 像素最长边后数据集中对象大小的分布(以像素面积的平方根计算)。 𝑥 轴显示面积的平方根,𝑦 轴表示对象数量。每个 bin 的范围为 32 像素。
大多数物体在选定的分辨率下属于中型和大型类别,这表明它们很可能很容易被神经网络检测到。然而,我们在公共存储库中找到的所有传统方法都实现了某种形式的纹理检测以进行定位。条形码的纹理,无论是线性的还是二维的,主要取决于每个元素的像素。具有大模块的条形码具有可识别的边缘和角,但如果模块较小,则纹理变得更加均匀。理想情况下,条形码检测器应始终找到可以解码的条形码。然而,定义每个模块的最小像素数以实现可靠解码具有挑战性,因为涉及许多其他因素,例如对比度和模糊。从数据集的注释中我们可以看到,自动贴标机能够解码每个元素 0.88 到 24.33 像素范围内的线性条形码和每个元素 1.21 到 71.1 像素范围内的二维条形码 (PPE)。
表4 模块尺寸在指定范围内(以像素为单位)的一维条码数量。
但是,通常无法保证以低于 1 PPE 的线性条形码和低于 2 PPE 的二维条形码进行解码。在模糊或低对比度的情况下,每个元素所需的像素数量显着增加。调整大小时,像素密度与应用的缩放因子成比例。表 4 中可以看到所选调整大小分辨率下各种 PPE 值的更详细细分。可以看出,大多数条形码的像素密度在每个模块 1 到 3 个像素之间,这通常足以满足线性条形码解码器的要求。还有一些条形码每个模块的像素超过 3 个,峰值为每个模块 5.13 像素。然而,超过 1000 个条形码的 PPE <1,表明以这种分辨率解码它们将非常具有挑战性,甚至是不可能的。此外,有 1044 个条形码没有 PPE 信息,这表明自动贴标机无法解码它们,即使在调整图像大小后,这种情况也可能仍然存在。我们可以得出结论,该数据集将对条形码读取器构成重大挑战。然而,拥有一些分辨率低于所需分辨率的条形码对于了解检测器的限制并确定其是否可以应用于缩小图像以实现实时目的非常有用。并非所有测试的方法都会生成置信度分数,因此,为了公平比较,我们决定使用精度、召回率和 F1score 作为指标。在表 5 中,我们可以看到考虑 IoU 阈值 0.5 时不同方法的结果。
表 5 IoU 阈值为 0.5 时的精度、召回率和 F1 分数。所有图像均包含单个一维条形码,并调整大小以使其最长边为 640 像素。向上的箭头意味着指标的值越高表示性能越好。
Gallo 和 Soros 的算法每次都会产生一个预测,因此它们的精度、召回率和 F1 分数始终相同。然而,考虑单个 IoU 阈值不足以进行公平比较。可以通过不同 𝑇𝐼𝑜𝑈 值下的精度、召回率和 F1 分数曲线来显示更完整的评估。图 4 展示了不同方法的精度、召回率和 F1 分数曲线。除了 Zharkov 的架构之外,所有其他端到端神经网络在所有三个图中始终优于其他方法。
图 4. 不同阈值下检测算法的精度、召回率和 F1 分数曲线。图像包含一个一维条形码,并调整大小以使其最长边等于 640 像素。
这是预料之中的,因为这些方法的计算量更大,并且精通复杂的检测问题。在经过测试的经典算法中,Yun 和 Kim是迄今为止在每个 IoU 阈值上都表现更好的算法,这意味着每当神经网络对于任务来说过于麻烦时,这可能是建议的方法。加洛和索罗斯的方法具有相似的性能,在低 𝑇𝐼𝑜𝑈 时有利于第二种方法的适度优势。 Zamberletti 的方法总体来说表现最差。Zharkov 的架构达到了非常高的召回率,远高于经典算法所达到的水平,但精度较低。所有其他基于深度学习的方法都达到了近乎完美的精度和召回率,𝑇𝐼𝑜𝑈 < 0.75。尽管是两个最大的模型,但与其他网络相比,Faster R-CNN 和 RetinaNet 的表现稍差,𝑇𝐼𝑜𝑈 > 0.75,这意味着生成的框的精确度稍差。总体而言,RT-DETR 在排行榜上名列前茅,但差距极小。有趣的是,YOLO Nano 的性能与 YOLO Medium 和 RT-DETR 非常相似,尽管参数少了近 10 倍。这表明该检测任务的简单性允许小型网络表现良好,而不会影响准确性。
最后,我们可以根据条形码的像素密度研究不同算法的性能。我们考虑每个模块 0 到 4 像素的范围,并将其划分为每个模块 0.5 像素的箱。作为单一性能指标,我们认为 F1 分数为 𝑇𝐼𝑜𝑈 = 0.5。对于每个 bin,我们都有不同数量的示例,如表 4 所示。图 5 显示,不基于深度学习的方法具有用于准确检测的最佳每模块像素范围。这是因为它们依赖边缘特征进行定位。我们可以看到,每个模块 1.5 到 3.5 像素的范围是 Gallo 和 Soros 检测算法的最佳范围。 Zamberletti 的方法需要每个元素多一点像素,而 Yun 提出的方法在每个模块 1.5 到 2.5 个像素时表现更好。该方法也是唯一能够检测一些 PPE < 0.5 的条形码的方法,并且在不使用深度学习的情况下在 0.5 < ppe < 1.0 时具有中等可靠性。另一方面,我们可以看到基于深度学习的方法在每元素像素数从 0.5 到 4.0 的范围内具有接近恒定的性能。每个模块的性能似乎下降了 0.5 像素以下,但仅用 14 个样本很难得出明确的结论。
图 5. 所测试的线性条形码检测方法在每个元素不同像素范围下的 F1 分数。左图显示了所有非基于深度学习的方法,右图仅显示了基于深度学习的方法。
Single 2D barcodes
在此测试中,我们仅包含具有单个二维条形码的示例。 Sörös 和 Flörkemeier的方法是唯一可用的非基于深度学习的方法,也可以检测 2D 条形码,并且已经与迄今为止提出的六个神经网络一起进行了测试。该数据集包含 1 164 张图像,大小调整为最大边缘长度 640 像素。在此分辨率下,我们的数据集包括 19 个小对象(面积 < 32*32 )、202 个中对象(32*32 < 面积 < 96*96 )和 943 个大对象(面积 > 96*96 )。
图 6 显示了区域分布的更详细细分。数据集呈现双峰区域分布,具有较大条形码的簇,其中一组较大条形码的面积在24 0 2 p x 2 和 38 0 2 p x 2 240^2px^2 和 380^2px^22402px2和3802px2之间,另一组较小的条形码的面积在2 0 2 p x 2 和 14 0 2 p x 2 20^2px^2 和 140^2px^2202px2和1402px2之间。最大的条形码主要来自 Dubska 数据集,而较小的代码主要包含在 ZVZ-Real 数据集 中。大多数代码被归类为“大”。除了对象的面积之外,模块密度对于确定数据集的难度仍然至关重要。二维条码的高像素密度有助于检测角落和边缘,即使图像有些模糊。相反,较低的每元素像素 (PPE) 值会掩盖这些特征,从而使检测变得更加困难。如前所述,为了可靠解码,每个模块至少需要 2 个像素的密度,但在模糊和噪声的情况下,需要更高的像素密度。然而,有时每个模块可以解码 1 到 2 个像素。
图 6。该直方图描绘了将图像大小调整为 640 像素最长边后数据集中对象大小的分布(以像素面积的平方根计算)。 𝑥 轴显示面积的平方根,𝑦 轴表示对象数量。每个 bin 的范围为 32 像素。
表 6 详细列出了数据集的 PPE 分布,范围从 0.68 到 9.58。大多数代码的密度 >2.0px/el,表明可能具有可读性,但仍有 144 个代码的 PPE 低于 2,这将带来解码挑战。此外,90 个条形码缺乏 PPE 信息,这意味着即使调整大小,也不太可能进行可靠的解码。我们可以得出结论,数据集的很大一部分可以通过二维条形码阅读器进行解码,但仍然存在大量的困难情况使测试更具挑战性。并非所有测试的方法都会生成置信度分数,因此,为了公平比较,我们决定使用精度、召回率和 F1 分数作为指标。在表 7 中,我们可以看到考虑 IoU 阈值 0.5 时不同方法的结果。很明显,F1 分数为 0.14 的方法并不是可靠的二维条形码检测器。为了更好地理解其他方法在不同 IoU 阈值下的表现,我们在图 7 中展示了它们的精度、召回率和 F1 曲线。Zharkov 等人取得了良好的成果,尤其是在召回方面,但与其他深度学习架构相比还存在差距。在较低的 𝑇𝐼𝑜𝑈 阈值下,就 F1 分数而言,RetinaNet 是最好的方法。
图 7. 不同 IoU 阈值下二维条码检测算法的精度、召回率和 F1 分数曲线。所有图像均包含一个 2D 条形码,并调整大小使其最长边为 640 像素。
表6 模块尺寸在指定范围内的二维条码数量(以像素为单位)
表 7 IoU 阈值为 0.5 时的精度、召回率和 F1 分数。所有图像均包含单个二维条形码,并调整大小以使其最长边等于 640 像素。向上的箭头意味着指标的值越高表示性能越好。
另一方面,对于 𝑇𝐼𝑜𝑈 > 0.75 YOLO Medium 和 RT-DETR 表现最好,这意味着它们生成了更精确的边界框。 YOLO Nano 与 YOLO Medium 具有相似的性能,但现在相对于 1D 情况差距更大一些。最后,我们可以根据二维条码的像素密度来分析不同算法的性能。我们考虑每个模块 1 到 7 个像素的范围,并将其划分为每个模块 1 个像素的箱。作为单一性能指标,我们认为 F1 分数为 𝑇𝐼𝑜𝑈 = 0.5。对于每个 bin,我们都有不同数量的示例,如表 6 所示。从图 8 中可以看出,索罗斯的方法在每个模块 3-5 个像素的范围内达到其峰值性能。然而,超出此范围,性能会快速下降,尤其是对于较低的像素密度。如果 PPE 高于 3,Zharkov 等人的表现会更好,而其他深度学习架构似乎受像素密度的影响不大。
图 8. 所测试的二维条形码检测方法在每个元素不同像素范围下的 F1 分数。
Multi-class benchmarks
我们将分析扩展到整个数据集,包括一维和二维条形码类别。现在的任务不仅是检测,还包括分类。多类别和多 ROI 检测的可用方法是基于深度学习的模型。正如之前所观察到的,深度学习模型在该领域的表现明显优于经典方法。然而,由于计算成本高昂,在工业应用中实施它们可能具有挑战性。
正如我们将在第 10 节中更好地研究的那样,在嵌入式设备上运行这些模型需要大量时间。一个潜在的解决方案是以较低分辨率检测条形码并以全分辨率执行解码阶段。因此,我们决定以三种不同的分辨率运行测试,以测试该策略的可行性。首先,所有图像都将调整大小,使其最长边等于 640 像素,与之前的测试采用的缩放策略相同。然后,我们将图像最长边的大小调整为 480 像素和 320 像素,以测量它们在缩小图像上的性能。对于每个尺度,我们使用相同尺度的训练集重新训练模型。
在表 9 中,我们看到实例数量除以类别和大小。正如预期的那样,在较低的分辨率下,小物体会增多,而大物体会减少。总共包含 8 748 张图像,其中 8 062 个一维条形码实例和 1 756 个二维条形码实例。为了评估模型性能,我们将计算每个类别的 IoU 阈值 0.5 (AP@0.5) 下的平均精度以及 IoU 阈值从 0.5 到 0.95 的平均精度,步长为 0.05 (AP@[.5:.95])。此外,我们将考虑每个模型相应的平均精度值(mAP@0.5 和 mAP@[.5:.95])。
表 8 以不同比例调整大小的数据集所有图像中测试模型的平均精度得分。向上的箭头意味着指标的值越高表示性能越好。
表 9 整个数据集中每个类别和尺寸类别的对象数量,其中图像以不同分辨率调整大小。
AP@0.5 和 AP@[.5:.95] 的结果如表 8 所示。所获得结果的总体比较如图 9 中的条形图所示。Zharkov 的方法仍然是测试模型中较弱的模型,但在 640 像素尺度上仍然取得了可观的 mAP@0.5 分数 0.823。然而,我们可以看到其他两个尺度的性能大幅下降。其他型号在所有测试分辨率下均表现良好。对于大多数型号来说,从 640 像素到 480 像素的性能下降很小,而缩小到 320 像素对性能的影响则更为明显。
图 9. 不同模型在三种不同尺度下的 mAP@[.5:.95] 值:最长边调整为 640 像素,最长边调整为 480 像素,最长边调整为 320 像素。测试是在考虑数据集中的所有图像的情况下进行的。
在 640 像素尺度上,Faster R-CNN 和 RetinaNet 的得分低于其他模型,而 YOLO Medium 和 RT-DETR 分别提供最高的 mAP@0.5 和 mAP@[.5:.95]。在其他两个尺度上,Faster R-CNN 和 RetinaNet 仍然处于排行榜底部,但 Faster R-CNN 似乎表现更好一些。 RT-DETR 是所有考虑指标中最好的模型,在最低分辨率下领先率有所增加。令人惊讶的是,YOLO Nano 在 320 像素调整大小时在有关 YOLO Medium 的所有类别中都有更好的指标,而在 480 像素调整大小时情况并非如此。最后,我们测量最低分辨率(最长边调整为 320 像素)的跨尺度平均精度。结果如表 10 所示。正如预期的那样,小物体类别是总体得分最低的类别。大型二维码似乎比大型一维条形码更容易检测。不同模型之间的排名在不同尺度上保持相同。唯一的例外是,RetinaNet 在小规模上比 Faster R-CNN 表现更差,但在中型和大型类别上得分更好。
表 10 跨尺度的平均精度。 𝐴𝑃𝑆 、 𝐴𝑃𝑀 、 𝐴𝑃𝐿 分别是具有小 (< 32*32 )、中 (> 32*32 ∧ < 96*96 ) 和大 (> 96*96 ) 地面实况区域的对象的 AP[.5:.95]。测试图像的大小已调整为最大边长为 320 像素。向上的箭头意味着指标的值越高表示性能越好。
Time measurements
在本节中,我们介绍评估中的条形码检测算法的推理时间。这种分析对于条形码检测应用至关重要,其中许多应用在计算资源有限的嵌入式设备上运行。为了评估不同用例的性能,我们对两种对比硬件设置进行了基准测试:深度学习优化的 PC(AMD Ryzen Threadripper Pro 5965WX,24 核、128 GB DDR4 RAM、RTX 4090 GPU)和 Raspberry Pi 3B+(1.2 GHz 四核 ARMv8 CPU、1 GB DDR2 RAM)。
我们测试的算法是用 C++ 实现的,并未专门针对多线程进行优化。然而,它们确实利用了某些能够在多个线程上运行的 OpenCV 函数。为了清楚地了解它们的性能,我们在单个 CPU 线程上运行这些方法。这种方法可确保时序不会因代码的少数部分的有限并行化而出现偏差。为了平衡比较,我们还记录了在单个 CPU 线程上运行的深度学习方法的推理时间。此外,出于信息目的,我们报告了深度学习方法在 GPU 或启用多线程的 CPU 上运行时的时间。
最后,所有 C++ 实现均使用 -O3 优化进行编译,其中包括自动矢量化,以确保最大性能。对于此基准测试,我们对数据集的所有图像运行所有检测方法。每次检测重复 3 次,并考虑最低时间。这样做是为了最大限度地减少后台进程对测量的影响。最终时间是每张图像记录时间的平均值。由于图像具有不同的长宽比,我们还将报告缩放后使用的图像的平均分辨率(以百万像素为单位)。
Time on PC
这些是在配备 AMD Ryzen Threadripper Pro 5965WX CPU 和 RTX 4090 GPU 的 PC 上运行时报告的时间。所有测试都是在按照最长边必须为 640 像素的规则缩放图像后进行的。我们总共有 8 748 张图像,调整大小后的平均分辨率为 0.284 兆像素,相当于 640 × 444 像素图像的分辨率。推理总是一次对单个图像进行。表 11 报告了在 CPU 上的单个线程上运行检测方法所需的时间。对于深度学习方法,我们还报告了 24 核和 GPU 上的多线程性能。我们将首先关注 CPU 上的单线程性能,因为这是面对所有方法的唯一方法。正如预期的那样,所涉及的方法之间存在巨大差异,最快的方法比最慢的方法快 780 倍。
表 11 PC 和 Raspberry PI 上检测所需的平均时间。所有图像均已调整大小,最长边为 640 像素。 ∞ 符号表示没有足够的 RAM 来运行算法。向下箭头表示指标值越低表示性能越好。
Gallo 等人是迄今为止最快的,在单个线程上每秒可以运行 600 多次。这是预料之中的,因为这是最古老的方法,并且其主要重点是在有限的硬件上运行。这种令人难以置信的速度是可能的,因为该方法不是旋转不变的。 Yun 等人是第二快的方法(7.598 ms),尽管其检测精度比 Soros 等人更好 Zamberletti et al Soros et al 则稍慢一些,性能为 11.25 ms。 Zamberletti 的方法相当慢,为 48.20 ms。
由于它在霍夫变换空间中使用 MLP,因此其性能介于经典 CV 方法和深度学习方法之间。 Zharkov 等人是唯一可以在单核上实时运行的深度学习模型,记录时间为 25.85 毫秒。YOLO Nano 也比其他模型快得多,平均时间为 64.99 毫秒。 YOLO Medium 比 Nano 版本慢 7 倍多,单线程为 478.9 毫秒。正如预期的那样,RT-DETR 较慢,时间为 985.4 毫秒,RetinaNet 和 Faster R-CNN 更慢,时间分别为 1 124 毫秒和 1 271 毫秒。使用多线程,所有神经网络的速度都提高了 5-10 倍,YOLO Nano 除外,它的速度仅提高了 4 倍,时间为 17.4 毫秒。在 GPU 上,排名保持不变,但较大的模型比较小的模型获得更大的提升。最快的方法仍然是 Zharkov 等人,用时 1.447 毫秒,而最慢的方法是 RetinaNet,用时 36.00 毫秒。所有条形码检测方法均可用于高端 PC 上的实时应用。然而,很难找到一个现实世界的条形码检测应用程序,其中使用高端 GPU 具有经济和逻辑意义。
之前,我们已经看到基于深度学习的检测器即使在较低分辨率下也能很好地工作。为此,我们还记录了将最长边调整为480像素和320像素时的单线程性能。所有这些测试都是使用 CPU 上的单线程进行的,如表 12 所示。
表 12 在不同的最长边分辨率下,使用 CPU 上的单线程在 PC 和 Raspberry PI 上进行检测所需的平均时间。 ∞ 符号表示没有足够的 RAM 来运行算法。向下箭头表示指标值越低表示性能越好。
我们可以看到,时间或多或少与图像的像素数量成线性比例。事实上,480 像素时的分辨率比 640 像素时的分辨率低约 1.8,而 320 像素时的分辨率则低 4 倍。在最低分辨率下,我们可以轻松地实时运行 Zharkov 等人或 YOLO Nano 等小型网络,而其他基于深度学习的模型仍然太慢。
Time on embedded device
正如我们所见,PC CPU 通常足以实时运行条形码检测算法。然而,许多条形码读取应用都依赖于嵌入式 CPU。一个例子是零售条形码阅读器,它应该足够小以适合手持设备。另一个例子是工业中的零件识别标记,其中每个组件都标有条形码,并且沿管道使用多个读取器。此方法用于对精度和安全性至关重要的行业,例如航空航天、汽车、医疗设备和电子产品。零件标识用于交叉引用零件规格,确保在装配中使用正确的组件。
这有助于避免错误,降低有缺陷产品的风险,并最大限度地减少代价高昂的召回。使用嵌入式设备代替 PC 进行处理可确保降低成本和空间需求。此外,将计算卸载到外部机器会增加延迟。为了测量嵌入式设备的性能,我们在 Raspberry PI 3B+ 系统上运行基准测试,该系统使用 1.2 GHz 的四核 ARM Cortex A53 CPU 和 1 GB DDR2 RAM。
由于测试的系统现在速度慢得多,我们必须对数据集的 500 个随机选择的图像的子集进行测试,以使测试在合理的时间内运行。平均面积仍为 0.284 兆像素。我们对所选图像的所有检测算法进行了单核 CPU 测试,将其大小调整为最大边缘长度 640 像素。深度学习方法也已使用所有 4 核 CPU 进行了测试。结果如表 11 所示。与 PC 结果相比,Raspberry PI 上的执行时间增加了 40-50 倍。
RAM (1 GB) 不足导致 Faster RCNN 和 RetinaNet 无法运行。因此,目前还没有任何方法能够实现实时性能,Gallo 的方法接近。各种方法之间的时间比较保持不变。 Gallo 的方法最快(53.45 ms),然后是 Yun 的算法(146.3 ms)和 Soros 的算法(397.5 ms),最后是 Zamberletti 提出的算法(1 360 ms)。所有深度学习方法都比这慢,需要数秒的时间。 Zharkov 等人仍然是最快的网络,速度为 2 120 ms,其次是 YOLO Nano,速度为 3 034 ms。YOLO Medium 和 RT-DETR 的速度非常慢,处理时间分别为 20 083 ms 和 39 882 ms。多核执行产生了大约 1.5 倍的适度加速,可能受到未优化的库或 RAM 等系统瓶颈的限制。
我们还记录了将最长边调整为 480 像素和 320 像素时的单线程性能。结果如表 12 所示。除 Zharkov 等人外,排名保持不变在 320 像素缩放方面超越了 Zamberletti 等人。在此分辨率下,较小的神经网络 所需的时间变得更加合理(分别为 340.9 ms 和 1 050 ms),但仍距实时应用目标还很远。
重要的是要承认这些方法的速度可以通过优化来显着提高。例如,我们测试的 C++ 方法目前尚未针对多核处理进行优化。然而,这可以通过 OpenMP 等库轻松实现(OpenMP 架构审查委员会,2008 年)。此外,通过使用 SIMD 内在函数可以使 C++ 代码变得更快,而 OpenVINO (OpenVINO, 2024) 和 TFLite 等软件工具包可以加快深度学习模型的执行速度,特别是在嵌入式 CPU 上。最后,可以采用量化和修剪等技术来提高神经网络的速度,同时对准确性的影响最小。然而,这超出了我们论文的范围。
Concluding remarks and future research directions
在本文中,我们对条形码定位领域进行了全面回顾,并发布了条形码本地化的公共基准,解决了该领域内再现性和数据集标准化方面现有的挑战。我们的核心贡献总结如下。
数据集整合和标准化。我们从公共来源收集了包含 8 748 张图像的数据集,并为其提供了标准化注释。我们决定公开该数据集,以便将来可以用于该领域的贡献。
可重复的基准测试。 BarBeR 是我们公开访问的基准测试,具有来自文献的一套算法(在第 4 节中详细描述)、用于深度学习模型训练的脚本以及各种性能指标(在第 6 节中介绍)。这确保了透明度,并使研究人员能够轻松复制和扩展我们的工作。
最后,我们使用我们的数据集和经过训练的模型对基准进行了多次测试,验证了其可靠性和可用性。特别是,我们可以从迄今为止进行的测试中得出一些有趣的结论。首先,我们的测试证实了深度学习方法相对于手工方法具有显着的准确性优势。然而,大多数深度学习模型的计算复杂性仍然是实时嵌入式应用程序的挑战。另一方面,我们的研究结果表明,小型神经网络(例如 YOLO Nano)的性能几乎与大型架构(例如 RTDETR 和 RetinaNet)一样好。最后,在测试的公开可用方法中,Yun 等人的提议提供了准确性和速度的最佳组合,在两个指标上都超越了索罗斯和赞贝莱蒂的方法。
相反,最快的方法是 Gallo 等人描述的方法,表明即使在非常受限的设备上也可以实现不错的精度。正如介绍中所述,条码解码技术在物流、供应链管理、零售、机器人等行业发挥着至关重要的作用,市场价值数十亿。本文旨在提供该领域的学术观点,重点关注条形码定位——任何解码过程中至关重要的第一步。通过推进该领域的开源研究,我们希望促进利用条形码技术的行业的增长,并支持依赖该技术的学术活动。对于未来,我们设想对我们的基准进行一系列可能的改进,可用于进一步推动条形码读取领域的发展。
实例分割。当前的软件可以轻松扩展以支持图像分割基准测试。数据集元数据已经用多边形定义了 ROI。
条形码解码。评估集成本地化解码系统的解码能力可以为实际用例提供更广泛的评估。事实上,条形码读取系统的最终指标是解码条形码的数量以及实现该结果所需的时间。
图像增强。研究图像增强技术的影响可能会提高挑战性条件下条形码读取的成功率。可以在定位阶段之前或之后将图像处理步骤添加到管道中。
视频支持。在许多应用中,条形码读取器输入是图像序列而不是单个帧。在基准测试中添加视频数据集可以开辟新的评估可能性,使研究人员能够探索速度和准确性之间的权衡。例如,更快且不太精确的解码器可能会处理更多的帧,而较慢但更准确的算法可能依赖更少的帧。基准测试可以揭示哪种方法在不同情况下更有效。此外,利用跨帧的时间信息可以提高定位算法的准确性或效率,为基于视频的条形码检测研究提供新的方向。
Gallo et al. 算法
Gallo et al. 算法是专为1D 条形码实时定位设计的传统计算机视觉算法,核心思想是利用 1D 条形码 “高对比度平行线条” 的结构特征,通过计算图像水平与垂直导数差异突出条码区域,以极简流程实现快速检测,适配早期移动设备等资源受限场景。优先保证速度,兼顾模糊 / 噪声图像中的 1D 条形码检测,适配当代移动设备(原文提及 “engineered for speed, enabling it to operate on contemporary mobile devices”)。条形码水平放置,平行线条垂直对齐,仅支持 ±30° 内的旋转(超出则检测可靠性下降)。1D 条形码区域的水平导数(线条边缘方向)绝对值远大于垂直导数,通过该差异构建 “条码热图”,快速定位目标区域。仅支持 1D 条形码,不支持多 ROI(单图单条码)、无旋转不变性、不适配 2D 条形码。
算法流程可分为 6 个关键步骤,每个步骤的具体操作和计算如下:
计算条码热图(核心差异化步骤),突出条形码区域(水平导数强、垂直导数弱),抑制背景。对输入图像的每个像素n,计算水平导数绝对值与垂直导数绝对值的差值,得到热图I e ( n ) I_e(n)Ie(n):I e ( n ) = ∣ I x ( n ) ∣ − ∣ I y ( n ) ∣ I_e(n) = |I_x(n)| - |I_y(n)|Ie(n)=∣Ix(n)∣−∣Iy(n)∣。其中,I x ( n ) I_x(n)Ix(n)为像素n的水平方向导数,I y ( n ) I_y(n)Iy(n)为垂直方向导数(反映图像在该方向的灰度变化强度)。条形码区域的I e ( n ) I_e(n)Ie(n)值显著高于背景(因线条边缘沿水平方向分布,水平导数更强)。
热图平滑处理,降低噪声干扰,使条码区域的热图值更集中。对热图I e ( n ) I_e(n)Ie(n)应用盒滤波器(box filter),得到平滑后的热图I s ( n ) I_s(n)Is(n)。盒滤波器通过邻域像素均值加权,减少孤立噪声点对后续二值化的影响。
热图二值化,将连续灰度的热图转化为黑白二值图像,分离条码候选区域与背景。采用Otsu 自适应阈值法对I s ( n ) I_s(n)Is(n)进行二值化(无需手动设定阈值,自动适配图像灰度分布)。二值图像中,高亮度区域(前景)为条码候选区域(blob),低亮度区域(背景)为非条码区域。
筛选目标 Blob,确定唯一的条码候选区域(算法假设单图仅含 1 个 1D 条形码)。遍历二值图像中的所有 Blob,选择包含 “热图最大强度像素n 0 n_0n0” 的 Blob(n 0 = arg max I s ( n ) n_0 = \arg\max I_s(n)n0=argmaxIs(n))。最大强度像素大概率位于条码核心区域,其所在 Blob 即为最可能的条码区域。
生成条码 bounding box,确定条码的矩形边界(与图像坐标轴平行)。从像素n 0 n_0n0出发,分别沿水平、垂直方向追踪 Blob 的边缘,形成与图像边框平行的矩形(因算法假设条码水平放置,矩形边无需旋转)。
优化扫描线与去除安静区,剔除条码周围的 “安静区”(quiet zone,条码边缘无信息的空白区域),精准定位有效条码区域。选取矩形中心的水平线作为扫描线l ( n ) l(n)l(n);沿扫描线从两端向中心收缩,直到检测到灰度强度低于均值 85% 的像素,收缩后的区域即为去除安静区的有效条码区域。
算法的计算过程围绕 “突出条码特征→降噪→分离目标→精准定位” 展开,每个步骤的数学逻辑和操作细节如下:
图像预处理,将输入彩色图像转换为单通道灰度图。简化计算,避免彩色通道干扰边缘检测(1D 条码的核心特征是灰度对比强烈的平行线条)。
导数计算与热图生成,通过水平 / 垂直导数的差异,突出条码区域(条码线条沿水平分布,水平导数更强)。对灰度图中每个像素n ( x , y ) n(x,y)n(x,y),计算水平导数I x ( n ) I_x(n)Ix(n)和垂直导数I y ( n ) I_y(n)Iy(n):使用Sobel 算子(传统边缘检测主流选择),核大小默认 3×3(轻量级场景常用)。Sobel 水平核:[ − 1 0 1 − 2 0 2 − 1 0 1 ] \begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}−1−2−1000121,垂直核:[ − 1 − 2 − 1 0 0 0 1 2 1 ] \begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}−101−202−101。计算热图I e ( n ) I_e(n)Ie(n):I e ( n ) = ∣ I x ( n ) ∣ − ∣ I y ( n ) ∣ I_e(n) = |I_x(n)| - |I_y(n)|Ie(n)=∣Ix(n)∣−∣Iy(n)∣。条码区域中,水平方向的边缘(线条边界)灰度变化剧烈,∣ I x ( n ) ∣ |I_x(n)|∣Ix(n)∣远大于∣ I y ( n ) ∣ |I_y(n)|∣Iy(n)∣,因此I e ( n ) I_e(n)Ie(n)为高值;背景区域两者差异小,I e ( n ) I_e(n)Ie(n)接近 0 或负值。
盒滤波器平滑(降噪步骤),消除孤立噪声点对后续二值化的干扰,使条码区域的热图值更连续。盒滤波器(均值滤波器)的窗口大小k × k k×kk×k(基准测试中优化为 15px,见文档 7.2 节 “optimal size for the box filter’s window: 15 pixels for Soros and Gallo”)。对热图I e ( n ) I_e(n)Ie(n)进行卷积:I s ( x , y ) = 1 k 2 ∑ i = − k / 2 k / 2 ∑ j = − k / 2 k / 2 I e ( x + i , y + j ) I_s(x,y) = \frac{1}{k^2} \sum_{i=-k/2}^{k/2} \sum_{j=-k/2}^{k/2} I_e(x+i,y+j)Is(x,y)=k21∑i=−k/2k/2∑j=−k/2k/2Ie(x+i,y+j)(窗口中心对齐像素( x , y ) (x,y)(x,y),边缘像素采用零填充)。输出平滑后的热图I s ( n ) I_s(n)Is(n)。
Otsu 自适应二值化,自动分割条码候选区域(前景)与背景,无需手动调参。统计平滑热图I s ( n ) I_s(n)Is(n)的灰度直方图h ( g ) h(g)h(g)(g为灰度级,0255)。遍历所有可能阈值t(0255),计算类间方差σ 2 ( t ) \sigma^2(t)σ2(t):σ 2 ( t ) = ω 0 ( t ) ω 1 ( t ) [ μ 0 ( t ) − μ 1 ( t ) ] 2 \sigma^2(t) = \omega_0(t)\omega_1(t)[\mu_0(t)-\mu_1(t)]^2σ2(t)=ω0(t)ω1(t)[μ0(t)−μ1(t)]2。其中,ω 0 \omega_0ω0、μ 0 \mu_0μ0为阈值 t 以下像素的占比和均值,ω 1 \omega_1ω1、μ 1 \mu_1μ1为阈值以上像素的占比和均值。选择使σ 2 ( t ) \sigma^2(t)σ2(t)最大的阈值t o p t t_{opt}topt,二值化规则:I b ( n ) = 1 I_b(n) = 1Ib(n)=1(若I s ( n ) ≥ t o p t I_s(n) ≥ t_{opt}Is(n)≥topt,前景 Blob),否则I b ( n ) = 0 I_b(n) = 0Ib(n)=0(背景)。
Blob 筛选(目标区域定位),从二值图中筛选出唯一的条码候选 Blob(算法假设单图单 1D 条码)。查找二值图中所有连通区域(Blob),使用 8 - 邻域连通准则(传统 Blob 检测常用,兼顾速度)。计算每个 Blob 的 “核心像素”:找到热图I s ( n ) I_s(n)Is(n)中最大值对应的像素n 0 = arg max I s ( n ) n_0 = \arg\max I_s(n)n0=argmaxIs(n)。筛选包含n 0 n_0n0的 Blob 作为目标候选区域(理由:最大值像素大概率位于条码核心,其所在 Blob 为真实条码区域)。
Bounding Box 生成与安静区去除,精准定位条码有效区域,剔除无信息的安静区。生成初始矩形框:从n 0 n_0n0出发,沿水平 / 垂直方向追踪 Blob 的边界,得到与图像坐标轴平行的矩形(因算法假设条码水平放置,无需旋转框)。确定扫描线:取矩形中心的水平线l ( n ) l(n)l(n)(扫描线覆盖条码的核心区域,确保灰度变化最明显)。安静区去除:
- 计算扫描线l ( n ) l(n)l(n)上所有像素的灰度均值μ l \mu_lμl。
- 从扫描线两端向中心收缩,直到像素灰度值小于0.85 μ l 0.85\mu_l0.85μl(文档明确阈值 85%),收缩后的区间即为有效条码区域。
- 最终输出有效区域的 Bounding Box。
参数类别 参数名称 取值 选择依据 预处理参数 输入图像格式 灰度图(单通道) 简化导数计算,突出条码灰度对比特征 导数计算参数 边缘检测算子 Sobel 3×3 传统算法主流选择,平衡速度与边缘检测效果 平滑参数 盒滤波器窗口大小 15×15 像素 BarBeR 基准中优化后的最优值(文档 7.2 节明确),兼顾降噪与速度 二值化参数 阈值计算方法 Otsu 自适应 无需手动调参,应对不同光照、对比度场景 Blob 筛选参数 连通准则 8 - 邻域 比 4 - 邻域更易捕获完整条码 Blob,且计算开销低 定位优化参数 旋转容忍度 ±30° 算法核心假设(水平放置),超出则线条方向与导数计算方向不匹配,检测失效 安静区参数 灰度阈值比例 85%(均值占比) 文档明确设定,剔除条码边缘无信息的空白区域,精准定位有效数据区 结构特征:由黑白相间的平行线条组成,线条方向一致(多为水平),存在 “安静区”(条码边缘无信息空白区)。高灰度对比度(黑白反差明显),模块尺寸固定(像素 / 元素 PPE≥1.0 时易检测),无复杂纹理。仅水平方向编码数据,垂直方向无信息,定位无需考虑垂直方向的细节。
传统轻量计算机视觉算法(速度优先,嵌入式首选),核心优势:无训练依赖、计算开销低、单帧耗时≤10ms;鲁棒性通过 “自适应特征 + 手工调优” 保障,文档中以Yun et al.(精度 - 速度平衡最优)和Gallo et al.(速度最快)为代表。
Yun et al. 利用 1D 条码 “边缘方向一致性” 和 “高对比度” 特征,通过方向直方图筛选 salient 区域,兼顾旋转不变性与抗模糊能力。核心组件与步骤:
- 预处理:灰度化→高斯模糊(3×3 核,降噪不破坏边缘);
- 特征提取:Sobel 算子计算梯度幅度 / 方向→18 bin 方向直方图(每 bin 10°,覆盖全旋转角度);
- 目标筛选:自适应阈值分离主方向特征→熵值筛选(突出平行线条区域,抑制背景);
- 定位:连通区域分析(8 - 邻域)→多 ROI 输出(支持多条码);
- 后处理:边界框优化(去除冗余区域)。
Gallo et al.(速度最快),聚焦 1D 条码 “水平放置 + 高对比度” 假设,简化旋转处理,优先保障速度,适配移动设备。核心组件与步骤
- 预处理:灰度化(无额外模糊,减少计算);
- 特征提取:Sobel 算子计算水平 / 垂直导数→热图生成(I e = ∣ I x ∣ − ∣ I y ∣ I_e=|I_x|-|I_y|Ie=∣Ix∣−∣Iy∣,突出水平线条);
- 目标筛选:15×15 盒滤波器平滑→Otsu 自适应二值化→Blob 筛选(含热图最大值像素);
- 定位:Bounding Box 生成→扫描线收缩(去除安静区,85% 均值阈值);
- 后处理:单 ROI 输出(假设单条码)。
RT-DETR,Transformer 轻量化改造,去除 NMS,利用 1D 条码 “特征简单” 的特性加速推理,鲁棒性拉满。核心组件与步骤:
- 预处理:同 YOLO Nano(亮度均衡 + 统一尺度);
- 特征提取:HGNetv2-L backbone(31M 参数)→混合编码器(多尺度特征序列化);
- 定位:IoU-aware 查询选择→迭代优化边界框(无需锚框,适配任意尺度);
- 后处理:直接输出结果(无 NMS,节省耗时)。抗旋转 / 模糊 / 遮挡能力最优,适合高精度场景(如机器人导航扫码)。
YOLO-v8 Nano,基于 1D 条码 “目标形态简单” 的特性,用极简 CNN 架构提取特征,减少参数冗余,兼顾速度与精度。支持 ±90° 旋转、模糊、小尺寸条码(PPE≥0.5),适配仓储自动化场景。核心组件与步骤:
- 预处理:灰度化→自适应亮度均衡(提升光照鲁棒性)→640px 长边 resize(统一输入尺度);
- 特征提取:轻量 CNN backbone(3.16M 参数)→多尺度特征融合(适配不同尺寸条码);
- 定位:锚框匹配(针对 1D 条码比例优化锚框)→边界框回归;
- 后处理:非极大值抑制(NMS)→置信度筛选(阈值 0.5)。
Yun et al. 算法是传统计算机视觉中1D 条形码定位的精度 - 速度最优解,核心思想是利用 1D 条码 “平行线条的方向一致性” 特征,通过梯度方向直方图捕捉主方向、熵值筛选突出条码区域,实现旋转不变性、多 ROI 检测(支持单图多条码),同时保持轻量计算(PC 端单帧耗时 7.6ms)。其设计兼顾鲁棒性(抗模糊、光照变化)与速度,参数以自适应为主、手动调优为辅,复现难度低,适配嵌入式与移动场景。算法围绕 1D 条码的核心特性 “黑白平行线条→梯度方向高度集中” 展开,核心逻辑可概括为:
- 方向一致性捕捉:1D 条码的平行线条会产生大量方向相同的梯度,通过统计梯度方向直方图,分离出占比最高的 “主方向”(即条码线条的垂直方向)。
- 熵值筛选 salient 区域:条码区域的梯度方向高度集中(主方向占比高),熵值小;背景区域梯度方向杂乱,熵值大,通过熵值阈值筛选出条码候选区。
- 多 ROI 与旋转适配:通过连通区域分析支持多条码检测,通过全角度覆盖的方向直方图(18 个 bin,每 bin10°)实现 ±90° 旋转不变性。
- 轻量计算设计:仅依赖 Sobel 梯度、直方图统计、熵值计算等基础操作,无复杂变换(如霍夫变换),平衡速度与鲁棒性。
算法参数分为 “自适应参数”(无需手动调优)和 “手动优化参数”(复现关键),具体如下:
参数类别 参数名称 取值 / 范围 选择依据与复现建议 预处理参数 高斯模糊核大小 3×3 平衡降噪效果与计算速度,不可过大(如 5×5 会模糊条码边缘) 梯度计算参数 Sobel 核大小 3×3 轻量计算首选 梯度幅度阈值(T_{mag}) 全图梯度幅度的均值 自适应(5~10) 无手动调优必要,复现可直接取均值,或按图像噪声程度微调 方向直方图参数 bin 数量 18(每 bin10°) 覆盖 0°~180° 全角度,保证旋转不变性 主方向分离参数 比例常数(α) 0.3 BarBeR 基准优化值,兼顾主方向纯度与覆盖度,复现优先使用,可在 0.2~0.4 之间微调 局部熵值参数 局部块大小 16×16 像素 经验值,过小(如 8×8)易受噪声影响,过大(如 32×32)会丢失小条码细节 平滑参数 盒滤波器窗口大小 30×30 像素 “Yun 算法最优窗口 30px”,连接断裂条码区域,不可小于 20px 后处理参数 最小连通区域面积 ≥100 像素 过滤微小噪声块,复现可根据条码最小尺寸调整(如小条码可设 50 像素) 连通准则 邻域类型 8 - 邻域 比 4 - 邻域更易捕获完整条码区域,复现默认选择
算法流程可分为 7 个关键步骤,每个步骤的计算细节与物理意义如下:
- 图像预处理,彩色图像→单通道灰度图→高斯模糊(3×3 核,σ=1.0)。灰度化:采用加权平均法,公式为I g r a y ( x , y ) = 0.299 R + 0.587 G + 0.114 B I_{gray}(x,y) = 0.299R + 0.587G + 0.114BIgray(x,y)=0.299R+0.587G+0.114B(平衡亮度与计算量)。高斯模糊:用 3×3 高斯核平滑图像,减少噪声对梯度计算的干扰,核矩阵为:1 16 [ 1 2 1 2 4 2 1 2 1 ] \frac{1}{16}\begin{bmatrix}1&2&1\\2&4&2\\1&2&1\end{bmatrix}161121242121。简化后续梯度计算,抑制高频噪声,保留条码线条的低频梯度特征。
- 梯度计算,计算每个像素的梯度幅度(强度)和方向,捕捉条码线条的边缘信息。采用Sobel 算子计算水平梯度∇ I x \nabla I_x∇Ix和垂直梯度∇ I y \nabla I_y∇Iy,核大小 3×3(轻量计算首选):水平核(检测垂直边缘,对应条码线条方向):[ − 1 0 1 − 2 0 2 − 1 0 1 ] \begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}−1−2−1000121垂直核(检测水平边缘):[ − 1 − 2 − 1 0 0 0 1 2 1 ] \begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}−101−202−101梯度幅度(反映边缘强度):m a g ( p ) = ∇ I x 2 + ∇ I y 2 mag(p) = \sqrt{\nabla I_x^2 + \nabla I_y^2}mag(p)=∇Ix2+∇Iy2。梯度方向(反映边缘朝向):a n g ( p ) = arctan 2 ( ∇ I y , ∇ I x ) ang(p) = \arctan2(\nabla I_y, \nabla I_x)ang(p)=arctan2(∇Iy,∇Ix)(文档公式 (7),范围[ − π , π ] [-π, π][−π,π],后续映射为[ 0 , 180 ° ] [0, 180°][0,180°])。物理意义:条码的黑白线条边界会产生高幅度梯度,且方向集中(如水平条码的梯度方向多为垂直,即 90°)。
- 全局方向直方图构建(主方向捕捉),统计全图梯度方向分布,找出条码的 “主方向”(梯度集中的方向)。方向量化:将[ 0 , 180 ° ] [0, 180°][0,180°]梯度方向划分为 18 个 bin,每个 bin 覆盖 10°(文档明确),即 bin0 对应 0°~10°,bin1 对应 10°~20°,…,bin17 对应 170°~180°。阈值筛选:设定梯度幅度阈值T m a g T_{mag}Tmag(自适应,默认取全图梯度幅度的均值,复现常用经验值 5~10),仅保留m a g ( p ) > T m a g mag(p) > T_{mag}mag(p)>Tmag的像素(过滤弱边缘噪声)。直方图统计:对筛选后的像素,按其梯度方向归入对应 bin,得到全局方向直方图h G ( b ) h_G(b)hG(b)(b = 0 , 1 , . . . , 17 b=0,1,...,17b=0,1,...,17,表示每个 bin 的像素个数)。关键输出:h G ( b ) h_G(b)hG(b)的峰值对应的 bin,即为条码的主方向(如峰值在 bin9,对应 90°~100°,说明条码线条为水平方向)。
- 主方向与弱方向分离(突出条码特征)目标:通过自适应阈值,将主方向(条码相关)与弱方向(背景相关)分离。计算逻辑:计算直方图阈值T h i s t T_{hist}Thist:T h i s t = m a x ( h G ( b ) ) × α T_{hist} = max(h_G(b)) × αThist=max(hG(b))×α,其中α αα为比例常数(0 < α < 1 0<α<10<α<1,基准测试优化值 0.3,平衡主方向纯度与覆盖度)。方向映射:定义映射函数V h G m a p ( b ) V_{h_G}^{map}(b)VhGmap(b):若h G ( b ) > T h i s t h_G(b) > T_{hist}hG(b)>Thist,则该 bin 为主方向组件O s O_sOs(条码梯度集中的方向);否则为弱方向组件O w O_wOw(背景梯度方向)。目的:聚焦主方向,过滤背景杂乱梯度,减少后续计算量。
- 局部熵值计算(条码区域筛选)目标:通过局部熵值判断区域是否为条码(条码区域熵值小,背景熵值大)。计算逻辑:图像分块:将预处理后的灰度图划分为非重叠的局部块(patch),块大小默认 16×16 像素(复现常用经验值,平衡局部特征捕捉与速度)。局部方向直方图:对每个块,计算其局部方向直方图h L ( i ) h_L(i)hL(i)(同样 18 个 bin,仅统计块内m a g ( p ) > T m a g mag(p) > T_{mag}mag(p)>Tmag的像素)。局部主方向判断:找到h L ( i ) h_L(i)hL(i)的最大值对应的索引i m a x i_{max}imax,若V h G m a p ( i m a x ) = O s V_{h_G}^{map}(i_{max}) = O_sVhGmap(imax)=Os(该块的主方向与全局主方向一致),则计算该块的熵值;否则熵值设为 0。熵值计算:E ( f ) = { J if V h G m a p ( i m a x ) = O s 0 otherwise , J = ∑ i = 0 17 [ h L ( i ) − h L ( i m a x ) ] E(f) = \begin{cases} J & \text{if } V_{h_G}^{map}(i_{max}) = O_s \\ 0 & \text{otherwise} \end{cases}, \quad J = \sum_{i=0}^{17} [h_L(i) - h_L(i_{max})]E(f)={J0ifVhGmap(imax)=Osotherwise,J=∑i=017[hL(i)−hL(imax)]物理意义:J越小(熵值越小),说明块内梯度方向越集中,越可能是条码区域;反之则为背景。
- 显著性图生成与二值化(目标区域分离)目标:将熵值筛选后的区域转化为二值图,分离条码候选区与背景。计算逻辑:熵值图阈值化:将每个块的熵值E ( f ) E(f)E(f)赋值给块内所有像素,得到熵值图;设定熵值阈值T E T_ETE(自适应,采用 Otsu 法,复现常用经验值 0.2×max (E (f))),得到初步显著性图S ( f ) S(f)S(f)(E ( f ) < T E E(f) < T_EE(f)<TE的像素设为 1,否则为 0)。盒滤波器平滑:用盒滤波器(优化窗口 30×30 像素)对S ( f ) S(f)S(f)进行卷积,目的是连接断裂的条码区域、消除孤立噪声点。最终二值化:再次用 Otsu 法对平滑后的显著性图二值化,得到最终二值图I b I_bIb(前景为条码候选区,背景为 0)。
- 连通区域分析与 Bounding Box 生成(多 ROI 输出)目标:从二值图中提取多个条码的边界框,完成定位。计算逻辑:连通区域检测:采用 8 - 邻域连通准则(文档隐含,传统多目标检测常用),找到I b I_bIb中所有连通区域(每个连通区域对应一个条码候选区)。过滤小区域:设定最小面积阈值(默认 100 像素,过滤微小噪声块),保留面积大于阈值的连通区域。生成边界框:对每个有效连通区域,计算其最小外接矩形(与图像坐标轴平行,无需旋转框,因条码旋转已通过方向直方图适配),输出每个条码的 Bounding Box(x,y,w,h)。
GitHub - MeiGen-AI/InfiniteTalk: Unlimited-length talking video generation that supports image-to-video and video-to-video generation
GitHub - Wan-Video/Wan2.2: Wan: Open and Advanced Large-Scale Video Generative Models
GitHub - 11cafe/jaaz: The world’s first open-source multimodal creative assistant This is a substitute for Canva and Manus that prioritizes privacy and is usable locally.
GitHub - Orange-3DV-Team/MoCha: MoCha: End-to-End Video Character Replacement without Structural Guidance
GitHub - TheAlgorithms/Python: All Algorithms implemented in Python
GitHub - import-ai/omnibox: Collect, organize, use, and share, all in OmniBox.
GitHub - datawhalechina/hello-agents: 📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程