程序員調用MODI的正確姿勢


程序員調用MODI的正確姿勢

作者:馬健
郵箱:stronghorse_mj@hotmail.com
主頁:http://www.comicer.com/stronghorse
發布:2020.02.13

Q:MODI是什么?
A:MODI全稱Microsoft Office Document Imaging,是微軟Office 2003/2007所帶的光學字符識別(OCR)組件,支持對21種語言進行OCR。其中對於中日韓(CJK)的支持基於清華文通,對其他語言的支持基於ScanSoft。

Q:為什么要使用MODI?
A:因為這是目前世上唯一的一款能夠在本地免費調用的商業級OCR引擎。只有實際使用過后,你才會明白那些業余的OCR引擎是多么的不靠譜,而商業版的Abbyy之流都是要真金白銀的。單獨安裝MODI的方法有兩種:

  1. 采用微軟官方提供的方法:http://support.microsoft.com/kb/982760/
  2. 采用我山寨的獨立安裝包,只含引擎部分,不含其他,所以比微軟方案占用的空間小得多。安裝包可以從我網盤的OCR文件夾下載,解壓后按照其中的安裝說明操作即可。我的網盤地址在下面這個博客的置頂貼里提供:
    http://www.cnblogs.com/stronghorse/

Q:為什么說MODI是一個OCR引擎?
A:引擎的意思,就是說它只含有最核心的OCR功能,但不提供前處理和后處理,這些都要調用者自己解決:

  • 前處理:包括灰度/彩色圖像轉純黑白(二值化)、去斑點等,目標是把需要喂給MODI進行識別的圖像處理得干干凈凈,以提高識別成功率和准確率。ScanSoft還好說,清華的中文OCR部分比玻璃紙都脆弱,一言不合就崩潰給你看,尤其是在碰到圖表的時候。即使是同一張灰度圖,我都見過用Otsu二值化后用MODI識別沒事,用八叉樹二值化就造成MODI崩潰。當然結果完全反過來的我也不是沒有見過。
  • 后處理:MODI結果是一個個word(中文是字),如果想得到有意義的結果,需要調用者自己根據word的坐標把word組成line,line組成paragraph。僅僅是判斷word與word之間要不要加空格,估計就讓不少人撓頭皮了,何況中文還有橫排、豎排。

所以說即使大家都調用MODI,但軟件或者說軟件開發者的前、后處理能力不同,出來的結果也會有所不同。比如說MODI識別中文時會有一些習慣性錯誤,如果軟件內部的后處理部分能對這些錯誤進行修正,那么同一張圖片的識別結果,就可能比別的沒有進行修正的軟件結果更好。而前處理部分的圖像處理能力,甚至僅僅是采用不同的二值化算法,都會導致OCR結果和軟件的穩定性不同。

Q:調用MODI有那些限制?
A:我用手上近40萬頁簡體中文掃描圖像進行了近兩個月的反復測試(電費都花了好幾百),其中大部分是掃描版技術書籍,圖文混排的比例很高。測試后發現主要有以下限制:

  1. MODI是32位組件,嵌入32位EXE甚至32位DLL都沒有問題,但嵌入64位EXE就不要想了。
  2. 如前所述,MODI在OCR含圖表的中文圖像時極其脆弱,崩潰是家常便飯。很多錯誤根本捕獲不到就退出了,有一些則可以通過異常捕獲抓到,但有時候的遞歸錯誤直接把堆棧耗盡了,這個時候什么樣的錯誤捕獲機制都不好使。另外即使捕獲到了異常,但MODI是用C++開發的,沒有自動垃圾回收機制,異常會造成內存漏洞,累積到一定程度除了殺進程之外也沒有別的辦法。
  3. 一次識別出來的中文字數如果不超過8個字,會直接報告說識別結果為空。

Q:這些限制要如何解決?
A:8個字的限制比較好辦,把圖像重復拼接,造成需要識別的字數超過限制即可。其他兩個限制,尤其是錯誤處理方面,我在經過長期各種努力奮斗后,終於明白了前輩們總結的一個真理:線程是不安全的,但進程很安全。

具體來說,就是開發一個橋接器,在橋接器進程中嵌入、執行MODI調用。真正需要調用MODI進行OCR的軟件自己不要嵌入MODI,而是與橋接器之間通過IPC(interprocess communications,進程間通信)進行交互——向橋接器發送OCR命令,橋接器接受后調用MODI進行OCR,再把OCR結果返回給調用者。

這樣做的好處是:

  1. 如果OCR過程出錯造成崩潰,崩潰的也只是橋接器進程,主進程P事沒有,重啟一個橋接器就可以進行下一頁的OCR。
  2. IPC可以在32位進程與64位進程之間通信,所以橋接器沒有辦法只能是32位,但與橋接器通信的主進程可以是64位。IPC的具體說明見MSDN,有若干種技術可供選擇,我選擇的是最簡單同時也是最麻煩的WM_COPYDATA。說它簡單,是因為這項技術只是基於常規消息處理,不需要上多線程,而且數據一次就是完整的一批過去,不存在發送或接收不完整的問題。說它難,是因為如果對消息分發和處理機制理解不夠,想純靠消息就實現兩個進程的同步,會很不容易。

所以從v4.00開始,FreePic2Pdf_Lib不再直接調用MODI,而是通過新增的橋接器MODI_Engine.exe進行調用。使用FreePic2Pdf_Lib+MODI生成雙層PDF、雙層DJVu的軟件,包括DjVuToy、FreePic2Pdf、Pdg2Pic、UnicornViewer等也進行了相應的升級,並更新各自的使用說明文件,對此進行說明。

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM