← 返回所有博客文章

在本白皮书中,我们将讨论处理大量主表单的若干种策略,以及如何使用LEADTOOLS表单识别SDK快速准确地处理表单。

简介

无数公司使用纸质表单收集顾客、病人、学生的信息。表单的自动识别应用非常广泛,从一个简单的明信片到复杂的多页税单都能使用,同时它还节省了时间和财力。然而,大型企业如金融机构、政府机构和医院每天都要处理大量的表单,这会导致一些特殊的问题,若想正确有效的解决这些问题,必须有好的计划、合理的表单设计和正确的软件。

首先,在任何表单处理应用程序中有两种不同的表单:主表单和填写的表单。主表单是空模板,定义了从哪里提取数据。客户填写并提交填写好的表单,这些表单会与主表单比较(如,表单识别或分类),然后提取数据(如表单处理)。在任何组织中大量填写的表单都非常常见,但是大企业面临的特殊问题是存在大量的主表单。数以百计甚至数以千计的主表单需要指数级的处理时间。表单中可能存在相似的部分造成识别出错,因此准确率也会降低。

本白皮书中,我们将讨论处理大量主表单的若干种策略,以及如何使用LEADTOOLS表单识别SDK快速准确地处理表单。LEADTOOLS结合了多线程、云计算、条码和两阶段分类识别,因此创建的表单识别和处理程序可以处理任何大规模场景。

使用多线程提高速度

当今,使用多线程提高速度是不言而喻的。然而,确保你的应用程序充分利用了硬件提供的一切也是必须的。大多数SDK厂商意识到了这点,并以库的“线程安全”招徕顾客。但是一些客户可能没有理解这个表述有多模糊,因为他们没有保证这到底是怎么回事。很有可能“线程安全”功能被划分的非常简单,因为它强行运行在一个单独的线程上。

LEADTOOLS与它们不同的地方在于:可以非常简单、集成化和容易的支持多线程控制。无需大量创建线程、无需传递信息时还要确保没有缓冲区溢出、没有内存泄露,一切都正常运行。初始化AutoFormsEngine时为核心系统上的每一个处理器传递一个IOcrEngine,LEADTOOLS会为你处理接下来的事情。

// 为机器上的每一个处理器创建一个OCR引擎。允许在识别和处理过程中优先使用线程。
ocrEngines = new List<IOcrEngine>();
for (int i = 0; i < Environment.ProcessorCount; i++)
{
   ocrEngines.Add(OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false));
   ocrEngines[i].Startup(formsCodec, null, String.Empty, String.Empty);
}
// 将资源库指向包含已有主表单的文件夹
formsRepository = new DiskMasterFormsRepository(formsCodec, masterFormsFolder);
autoEngine = new AutoFormsEngine(formsRepository, ocrEngines, null, 
AutoFormsRecognitionManager.Default | AutoFormsRecognitionManager.Ocr, 30, 80, true);

使用云的分布式处理

LEADTOOLS Cloud SDK基于与多线程一样的基本原理,但是使用电脑网络将大量工作进行下一级别的分发。通过设计和控制自己的云端基础架构,识别速度的提升几乎是没有限制的。

在云上执行处理器集中任务的好处远远超出了效率和速度。你还可以显著减少运营成本,因为你的网络上的任意电脑都可以作为一个工作机器使用。当数以百计的电脑可以集合资源时,为什么要购置昂贵的专用服务器呢?LEADTOOLS充足的自定义让你能够利用正在使用的工作站上的未使用的处理能力。专注于电子表格和文字处理的员工真的充分利用了八核处理器的价值吗?你可以选择最大的CPU百分比、CPU核数、线程的数量 - 甚至一天的时间 - 这样你的工作进程利用了员工的机器,同时还没有阻碍他们的日常工作。云在处理填充表格的大量流时让人非常惊讶,但是网络上的每个节点仍有可能被大量主表单阻碍。既然你已经最大化了硬件的潜力,就必须专注于设计主表单,继续提高企业级表单识别应用程序的速度。

使用条码分类表单

条码可能是将一个表单与其他大量表单区分开的最快速直接的方法。最明显的好处是,条码将大量信息存储在一个小空间里。尤其是二维码,如QR码能够存储4296个字母数字字符。尽管这个独特的标识符很小,但是它们提供了一个非常实用的手段,以最小的变化适应大量的在生产表单。

如果你可以使用简单的条码识别来识别表单,为什么要使用表单识别呢?使用表单识别可能乍一看有点夸张,但是LEADTOOLS高级的表单识别和处理技术有很有超出分类的好处。如果你打算使用OCR识别表单中用户提供的信息字段,必须采用额外的步骤准确提取信息。这包括但是不限于:图像清理、页面对齐、不同DPI的补偿偏移量以及识别提取的文本。实现这些步骤是一个艰巨的任务,需要成千上万行复杂的代码,但是使用LEADTOOLS用很少的代码就能自动完成。

// 创建AutoFormsEngine来使用条码识别
autoEngine = new AutoFormsEngine(formsRepository, ocrEngines,
null, AutoFormsRecognitionManager.Barcode, 30, 70, true);
// 在文档中运行表单识别和处理
AutoFormsRunResult runResult = autoEngine.Run(document, null);if (runResult != null)
{
   // 处理识别的表单,提取需要的信息
   foreach (FormPage formPage in runResult.FormFields)
   {
      foreach (FormField field in formPage)
      {
         // 使用提取出的字段数据...      }
   }
}

一个高级策略:主表单类别的两阶段识别

对于异常庞大的场景,运行表单识别算法两次通常更快一些:第一次确定类别,第二次在类别中识别表单。减少与填充表单比较的主表单数目可以节省时间。

例如,你的公司在多个国家或地区开展业务。每个区域使用相似的表格,但是有轻微的变化如联系信息、logo或字段。当设计表单时,识别和修正模板图像间的不同,创建一个类别主表单,如下图所示。

clip_image001

看看上面的示例,你会发现当我们对填充表单3进行两阶段识别时,它首先被确认为B类,在第二阶段与所有B类的其他表单进行比较,最后确认为表单3。使用LEADTOOLS,你可以缩小表单识别算法,只搜索库中指定的类别。尽管两阶段识别看起来是个很复杂的过程,但是代码却非常简单:

// 第一阶段我们识别类别
recognizeResult = autoEngine.RecognizeForm(filledForm, 
formsRepository.RootCategory.ChildCategories.Where(
   i => i.Name == "Categories").ToList());
if (recognizeResult != null)
{
   // 第二阶段在已确认的类别里识别表单
   foundMasterFormCategory = recognizeResult.MasterForm.Name; 
   recognizeResult = autoEngine.RecognizeForm(filledForm, 
      formsRepository.RootCategory.ChildCategories.Where(
         i => i.Name == foundMasterFormCategory).ToList());
   if (recognizeResult != null)
   {
      foundMasterForm = recognizeResult.MasterForm.Name;
   }
}

clip_image002

上面的例子非常简单,只有两个类别且每个类别只包含两个表单,速度的优势很难体现出来。然而,当处理包含成百上千个主表单的库时,优势非常明显。LEADTOOLS将精心设计的主表单与屡获殊荣的文档图像技术相结合,你可以使用它创建任何大型企业要求的在减少时间和成本上都有突破的表单识别应用程序。

获取支持

关于其他产品的更多信息,请访问我们的官方网站

欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。

同时欢迎您使用评估版期间的免费技术支持