原創|使用教程|編輯:龔雪|2015-07-07 09:36:30.000|閱讀 383 次
概述:在本白皮書中,我們將討論處理大量主表單的若干種策略,以及如何使用LEADTOOLS表單識別SDK快速準確地處理表單。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
無數公司使用紙質表單收集顧客、病人、學生的信息。表單的自動識別應用非常廣泛,從一個簡單的明信片到復雜的多頁稅單都能使用,同時它還節省了時間和財力。然而,大型企業如金融機構、政府機構和醫院每天都要處理大量的表單,這會導致一些特殊的問題,若想正確有效的解決這些問題,必須有好的計劃、合理的表單設計和正確的軟件。
首先,在任何表單處理應用程序中有兩種不同的表單:主表單和填寫的表單。主表單是空模板,定義了從哪里提取數據。客戶填寫并提交填寫好的表單,這些表單會與主表單比較(如,表單識別或分類),然后提取數據(如表單處理)。在任何組織中大量填寫的表單都非常常見,但是大企業面臨的特殊問題是存在大量的主表單。數以百計甚至數以千計的主表單需要指數級的處理時間。表單中可能存在相似的部分造成識別出錯,因此準確率也會降低。
本白皮書中,我們將討論處理大量主表單的若干種策略,以及如何使用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或字段。當設計表單時,識別和修正模板圖像間的不同,創建一個類別主表單,如下圖所示。
看看上面的示例,你會發現當我們對填充表單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; } }
上面的例子非常簡單,只有兩個類別且每個類別只包含兩個表單,速度的優勢很難體現出來。然而,當處理包含成百上千個主表單的庫時,優勢非常明顯。LEADTOOLS將精心設計的主表單與屢獲殊榮的文檔圖像技術相結合,你可以使用它創建任何大型企業要求的在減少時間和成本上都有突破的表單識別應用程序。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn