现在数字无处不在,无论是闹钟、健身追踪器、条形码还是包装好了的送货包裹。利用MNIST数据集,机器学习可用来读取单个手写数字。现在,我们可以将其扩展为读取多个数字,如下所示。底层的神经网络同时进行数字定位和数字检测。这在很多实际环境中是非常有用的,例如读取商店中的标签,车牌,广告等。

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器

读取多个数字

但是,为什么不直接使用OCR呢?OCR虽然可以自动检测数字,但是效果并不总是很好,有时我们需要为特定任务训练特定的神经网络。

 

0.1数字检测

数字检测问题可分为2部分

  1. 数字查找

  2. 数字识别

数字查找:

数字可能出现在图像的任何位置,要检测到这些数字,我们首先需要查找包含这些数字的区域。这些数字可以有不同的大小和背景。

有多种检测数字位置的方法。比如可以利用简单的图像形态学操作(例如二值化,腐蚀,膨胀)来提取图像中的数字区域。但是,由于存在诸如阈值,内核大小等调整参数,因此这些处理方式不具有普遍性。此外我们还可以使用无监督特征检测器,深度模型等。

数字识别:

确定好区域的数字即可进入数字识别的过程。MNIST数据集是用于手写数字识别的规范数据集。大多数数据科学家已经对该数据集进行了实验。它包含约60,000个用于培训的手写数字和10,000个用于测试的手写数字。一些示例如下所示:

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器_02

MNIST图片

但是,现实生活中的数字通常大不相同。它们具有不同的颜色,通常按照以下情况打印。

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器_03

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器_04

日常数字图像

另一个公共数据集SVHN-街景房数数据集。数据集包含从Google的街景中收集并带有注释的门牌号图像。以下是SVHN的示例图片:

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器_05

SVHN图片

该数据集在许多背景下都有各种数字组合,对于通用模型更合适。

 

02. Keras建模

我们选择此基于SVHN位数检测器来实现多位数检测器。它写得很好并且易于遵循。数字定位使用最大稳定的外部区域(MSER)方法完成,该方法用作稳定的特征检测器。MSER主要用于图像内的斑点检测。斑点是像素的连续集合,其外边界像素强度高于内边界像素强度(给定阈值)。如果这些区域在强度变化量上变化不大,则可以说是最大稳定的。MSER的运行时复杂度较低,为O(nlog(log(n))),其中n是图像上像素的总数。该算法对于模糊和缩放也很鲁棒。这使其非常适合提取文本/数字。

使用具有卷积,maxpool和FC层的CNN来完成数字识别,这些层将每个检测到的区域分类为10个不同的数字。分类器在测试集上的准确性达到95%。

我们通过各种示例对存储库进行了测试,发现它运行良好。请参阅上面共享的示例。

在某些间隙中,要么本地化器无法正常工作(未检测到数字1的位置),要么检测器发生故障($被检测为5)。

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器_06

结论

我们希望该博客被证明是了解多位数检测管道如何工作的良好起点。我们共享了一个github链接,该链接可用于在SVHN数据集上构建模型。如果此模型无法正常运行。大家可以收集自己的数据并微调已训练的模型。

SVHN链接:https://github.com/penny4860/SVHN-deep-digit-detector

基于OpenCV的多位数检测器_基于OpenCV的多位数检测器_07