2013-07-11 18 views
8

我正在工作的公司正在考慮將其當前OCR引擎(Nuance的OmniPage)切換爲開源替代品,如Tesseract。C++ - 令人失望的性能與Tesseract

爲了獲得一些性能基準(執行速度和準確性)來比較兩者,我得到了一個非常簡單的程序,只是爲了瞭解Tesseract 3.2 C API的性能如何。

我的初步意見(他們中的一些可能會關閉,隨時糾正我在評論解釋):

  • 精度良好。它與我們目前的發動機相比非常好。
  • 輸出格式只提供識別文本,而不是預覽文本在原始圖像中的位置。有採取hOCR格式並將其轉換爲其他更吸引人的視覺上的可能性,但我沒有找到適用於商業用途的Windows上的開源轉換器(我找不到源代碼或可執行文件ExactCODE's hocr2pdf)。我可以寫一個簡單的腳本,將轉換檢測BBOX的每一個段落,只是增加一個style元素設置HTML標籤的leftrightwidthheightposition屬性,所以這個限制是次要的。
  • Leptonica(Tesseract使用的圖像庫)appears not to support reading complex PDF files。雖然這確實爲遷移增加了一點小的開發費用(因爲它不是開箱即用的),但這並不是一個問題,因爲我們的產品中已經有模塊從PDF文件中提取圖像。
  • 執行速度非常慢(與Nuance的OmniPage至少相比)。在我的機器上,Tesseract花費了2分多鐘來轉換文件。 Nuance的OmniPage花了不到3分30秒來轉換10個大文件(包括提供的圖像)。 (我不記得確切的時間長度,但是顯然只有提供的圖像少於15秒)

如果只是關於其他因素,遷移可能沒有太多問題。但是,這種性能限制是一個殺手。

然後,我心想:Tesseract與其商業等價物相比表現如此糟糕嗎?谷歌肯定會爭取表現。

所以,我幾乎可以肯定,問題來自我。我要麼沒有以正確的方式使用API​​,我沒有改變我應該設置的設置,或者我現在正在丟失的其他設置。

這是我與正方體測試程序的部分:

#include "baseapi.h" 
#include "allheaders.h" 

// ... 
// Tesseract initialization 
tesseract::TessBaseAPI api; 
api.Init("", "eng+deu+fra"); 
api.SetPageSegMode(tesseract::PageSegMode::PSM_AUTO_OSD); 
api.SetVariable("tessedit_create_hocr", "1"); // for the hOCR output 

// ... 
// OCR 
PIX* pixs = pixRead(image_path.c_str()); 
STRING result; 
api.ProcessPages(image_path.c_str(), NULL, 0, &result); 

// ... write the result to a file 

我試着用不同的版面分割模式,沒有建立激活HOCR格式的,只能是跟以前一樣失望。我還嘗試將一些預處理腳本應用於圖像,以查看它是否對檢測有所幫助,但沒有成功。我只用一個字典進行測試,但沒有對性能造成太大影響。我對多頁TIF文件和單頁TIF圖像也有同樣的性能問題,並沒有嘗試其他格式。

使用VerySleepy對應用程序進行快速分析表明,大部分執行時間花費在與邊界框相關的new s和delete上。

我真的想我們遷移到一個開放源碼庫,而不是一個商業產品,所以我會很感激,如果有人可以幫助我實現與API更好的性能。除非我可以通過戲劇性的改進來獲得類似於當前引擎的性能結果,否則遷移不會發生。

非常感謝您寶貴的時間。

這裏是我的測試集圖像:

Sample OCR image

回答

9

我不認爲你可以做一些事情。沒錯,與OmniPage或ABBYY等商用引擎相比,Tesseact速度非常慢。每個比較測試都表明這些公司正在爲OCR謀生,並對速度,準確性和其他因素非常認真。

+0

我想這確實是合乎邏輯的。我曾假設Google會出色表現,但也許他們不需要高速度,他們也不需要針對他們的需求進行優化。謝謝你的回答。 :) –

+3

需要注意的一點是,谷歌似乎沒有在自己的應用中使用tesseract(至少與我們看到的代碼不一樣),因爲他們在這些應用中獲得的性能和準確性與tesseract不同。對於少數開發者來說,這似乎更像是一個側面或20%的項目。 – ngb