別調(diào)優(yōu)實(shí)戰(zhàn))
1. 為什么Windows環(huán)境下我最終還是選了Tesseract 5.5.01.1 這個(gè)版本解決了什么問(wèn)題先說(shuō)個(gè)場(chǎng)景。上周同事拿著一批掃描合同問(wèn)我能不能批量把里面的編號(hào)和日期提取出來(lái)。他電腦是Windows 11 64位系統(tǒng)網(wǎng)上搜了一圈答案高度一致用Tesseract。但我問(wèn)他準(zhǔn)備裝哪個(gè)版本時(shí)他愣住了畢竟從現(xiàn)狀來(lái)看Tesseract官網(wǎng)的發(fā)行版確實(shí)有好幾個(gè)選擇。我之所以推薦Tesseract-OCR 5.5.0這個(gè)版本核心原因很簡(jiǎn)單它是我在Windows 64-bit環(huán)境下實(shí)際跑過(guò)一輪之后覺(jué)得性能和穩(wěn)定性相對(duì)均衡的一個(gè)版本。Tesseract本身是個(gè)開源OCR引擎最初是惠普實(shí)驗(yàn)室的項(xiàng)目后來(lái)由Google接手維護(hù)底層識(shí)別引擎在5.x系列里換成了基于LSTM的神經(jīng)網(wǎng)絡(luò)模型跟早期版本的模板匹配完全不是一個(gè)時(shí)代的東西。5.5.0作為5.x分支的較新迭代不僅吸收了此前若干版本的訓(xùn)練數(shù)據(jù)和識(shí)別優(yōu)化還修復(fù)了不少在Windows下語(yǔ)言包加載、Unicode路徑處理上的老毛病。更重要的是5.5.0在Windows 64位上的編譯產(chǎn)物比較干凈依賴項(xiàng)清晰裝完之后不需要額外補(bǔ)一堆運(yùn)行庫(kù)就能跑起來(lái)。這一點(diǎn)看起來(lái)不起眼實(shí)際用起來(lái)才知道省了多少事。我之前裝過(guò)更早的4.x版本DLL版本沖突、VCRUNTIME缺失這類問(wèn)題從沒(méi)斷過(guò)識(shí)別還沒(méi)開始環(huán)境先折騰了半個(gè)小時(shí)。5.5.0在這方面的體驗(yàn)明顯更好。1.2 64位安裝包與32位、歷史版本的實(shí)際差異很多人在選擇Tesseract時(shí)沒(méi)太注意64-bit這前綴的意義覺(jué)得反正都是同一個(gè)OCR工具裝上能用就行。真實(shí)情況是32位版本在Windows 64位系統(tǒng)上雖然也能運(yùn)行但有其實(shí)際限制比如在大尺寸圖片處理時(shí)內(nèi)存池明顯吃緊批處理場(chǎng)景里更容易觸發(fā)內(nèi)存不足。而64位原生版在內(nèi)存尋址、多線程調(diào)度上的表現(xiàn)更充分處理兩三千像素寬度的掃描圖時(shí)差距不會(huì)特別明顯但一進(jìn)入上百?gòu)垐D片批量任務(wù)差距就體現(xiàn)出來(lái)了。另外Tesseract 5.5.0里識(shí)別中文和英文混排文本的效果相比4.x有了明顯進(jìn)步。這跟LSTM引擎的訓(xùn)練數(shù)據(jù)擴(kuò)充有關(guān)。我自己用同一批帶中文標(biāo)題、英文編號(hào)、數(shù)字日期的合同截圖做過(guò)對(duì)比5.5.0的準(zhǔn)確率在實(shí)際項(xiàng)目里大概能到95%以上當(dāng)然前提是圖片質(zhì)量別太離譜。4.x版本面對(duì)同樣圖片時(shí)中文和數(shù)字混排容易把1認(rèn)成l把0認(rèn)成o這些是純字符特征層面的問(wèn)題5.5.0明顯好很多。版本選擇方面我的建議是如果你是嘗鮮或者希望長(zhǎng)期穩(wěn)定使用并且愿意跟進(jìn)社區(qū)更新那直接用5.5.0沒(méi)問(wèn)題。如果你對(duì)OCR精度要求極高且愿意花時(shí)間調(diào)優(yōu)可以關(guān)注后續(xù)更新的版本。除非有特別強(qiáng)的兼容性需求不然我不建議往回裝4.x或更老的版本畢竟識(shí)別引擎的差距是硬性的。2. 安裝前需要想清楚的幾件事版本、安裝包形態(tài)與路徑2.1 安裝版和免安裝ZIP怎么選Tesseract在Windows 64位下的官方分發(fā)渠道主要有兩類一類是安裝器Installer另一類是免安裝的ZIP壓縮包這兩類都包含64位程序。官方GitHub Releases頁(yè)面提供的核心安裝包是Installer形態(tài)而社區(qū)常見的UB Mannheim鏡像站提供更多歷史版本選擇。我個(gè)人的建議是如果你只是日常使用或者第一次接觸Tesseract直接用Installer安裝器會(huì)更省心。安裝器自帶語(yǔ)言包勾選界面安裝過(guò)程中會(huì)把必要的運(yùn)行庫(kù)一并處理好裝完就能直接敲命令。ZIP包適合兩類人一類是需要在多臺(tái)機(jī)器上做批量部署解壓即用另一類是希望完全控制文件位置不想在系統(tǒng)區(qū)留下安裝痕跡。我實(shí)際部署項(xiàng)目時(shí)更偏向ZIP包原因很簡(jiǎn)單路徑可控方便后續(xù)打包分發(fā)給團(tuán)隊(duì)其他成員而且不會(huì)受到系統(tǒng)權(quán)限問(wèn)題的干擾。需要特別注意的是不管選擇哪種方式安裝完之后最好把安裝目錄完整保留不要為了省空間刪掉里面的doc、tessdata等目錄。這些不是垃圾文件tessdata目錄是語(yǔ)言包的核心位置刪了之后中文識(shí)別直接報(bào)錯(cuò)。2.2 目錄與PATH為后續(xù)少踩坑做的準(zhǔn)備安裝路徑這件事我強(qiáng)烈建議提前規(guī)劃好。我見過(guò)太多人默認(rèn)裝在C:\Program Files\Tesseract-OCR結(jié)果后續(xù)在腳本里調(diào)用時(shí)因?yàn)槁窂綆Э崭窀鞣N奇奇怪怪的轉(zhuǎn)義問(wèn)題。不是說(shuō)這個(gè)路徑不能用而是你必須每個(gè)涉及路徑的地方都記得加引號(hào)。命令行手敲倒是還好一旦寫進(jìn)批處理或者Python腳本里帶空格的路徑就是個(gè)潛在坑點(diǎn)。所以我的習(xí)慣是裝到C:\Tesseract-OCR這樣的無(wú)空格目錄下。路徑簡(jiǎn)單有很多連帶好處比如后續(xù)通過(guò)代碼調(diào)用時(shí)不需要反復(fù)處理路徑轉(zhuǎn)義也不容易因?yàn)闄?quán)限問(wèn)題導(dǎo)致報(bào)Access Denied。PATH環(huán)境變量的問(wèn)題也很關(guān)鍵。Tesseract安裝器默認(rèn)會(huì)幫你把路徑寫進(jìn)系統(tǒng)PATH如果是ZIP包則必須手動(dòng)添加。不管哪種方式配置完P(guān)ATH后有一個(gè)細(xì)節(jié)特別容易被忽略新打開的命令提示符窗口才能讀到最新的PATH已經(jīng)打開的窗口是刷新不到的。我在項(xiàng)目里不止一次看到同事設(shè)置完P(guān)ATH后在同一個(gè)終端反復(fù)執(zhí)行tesseract命令得到的始終是不是內(nèi)部或外部命令的報(bào)錯(cuò)然后開始懷疑安裝包壞了。遇到這種情況關(guān)掉終端重開基本就能解決。3. Windows 64位上的完整安裝與驗(yàn)證流程3.1 下載和安裝器選項(xiàng)說(shuō)明先從下載說(shuō)起。Tesseract 5.5.0的Windows 64位安裝包推薦從官方GitHub Releases頁(yè)面獲取。進(jìn)入頁(yè)面后找名為tesseract-ocr-w64-setup-5.5.0.exe的安裝程序這個(gè)就是對(duì)應(yīng)版本的標(biāo)準(zhǔn)安裝器。有些鏡像站會(huì)把它標(biāo)成Windows 64-bit字樣認(rèn)準(zhǔn)這個(gè)就行。下載完成后雙擊運(yùn)行會(huì)進(jìn)入安裝向?qū)?。安裝過(guò)程中有一個(gè)步驟是語(yǔ)言包選擇也就是勾選你需要的語(yǔ)言數(shù)據(jù)。這里很多人在這一步容易出問(wèn)題。界面上有一個(gè)大列表框列出了幾百個(gè)語(yǔ)言代碼旁邊還有類似Additional language data的選項(xiàng)。如果你只要識(shí)別英文勾選English就好要識(shí)別簡(jiǎn)體中文需要找到Chinese (Simplified)對(duì)應(yīng)的語(yǔ)言代碼是chi_sim。注意不能只勾中文不勾英文實(shí)際場(chǎng)景里中文文檔經(jīng)常夾著英文、數(shù)字我只勾了中文識(shí)別帶數(shù)字的表格時(shí)數(shù)字經(jīng)常丟失后來(lái)把英文加上再跑一次效果立刻正常。組件選擇界面里可能還有關(guān)于Developf files、Traning tools之類的選項(xiàng)如果不做二次開發(fā)或模型訓(xùn)練可以不用勾避免引入不必要的依賴。安裝路徑按前面說(shuō)的建議改成C:\Tesseract-OCR這類無(wú)空格的目錄安裝完成后繼續(xù)。3.2 環(huán)境變量與語(yǔ)言包配置安裝器如果順利執(zhí)行絕大多數(shù)情況下會(huì)自動(dòng)把C:\Tesseract-OCR加入PATH。但我依舊建議手動(dòng)確認(rèn)一遍流程是右鍵此電腦 - 屬性 - 高級(jí)系統(tǒng)設(shè)置 - 環(huán)境變量在系統(tǒng)變量中找到Path確認(rèn)里面含Tesseract的安裝目錄。如果沒(méi)有手動(dòng)點(diǎn)擊新建把路徑貼進(jìn)去。這里有個(gè)注意事項(xiàng)別把用戶變量和系統(tǒng)變量搞混。我遇到過(guò)一個(gè)Case用戶變量里加了Tesseract的路徑系統(tǒng)變量里沒(méi)加結(jié)果以管理員身份運(yùn)行的終端能用普通終端卻不行。原因是管理員終端和普通終端加載環(huán)境變量的范圍不同。穩(wěn)妥起見建議直接在系統(tǒng)變量的Path中配置一勞永逸。語(yǔ)言包的位置一般是[安裝目錄](méi)\tessdata比如C:\Tesseract-OCR\tessdata。安裝器勾選的語(yǔ)言包會(huì)自動(dòng)落到這個(gè)目錄。如果你后來(lái)額外下載了語(yǔ)言包文件比如從GitHub的tessdata倉(cāng)庫(kù)下載chi_sim.traineddata下載后直接放進(jìn)這個(gè)目錄即可。如果安裝器里沒(méi)找到對(duì)應(yīng)的語(yǔ)言選項(xiàng)這是手動(dòng)補(bǔ)語(yǔ)言包的主要方式。3.3 用命令行驗(yàn)證安裝結(jié)果安裝完成后打開一個(gè)新的命令提示符窗口依次執(zhí)行下面三行命令來(lái)確認(rèn)安裝狀態(tài)tesseract --version tesseract --list-langs第一行命令會(huì)輸出版本號(hào)正常情況下你會(huì)看到tesseract 5.5.0開頭的信息還會(huì)附帶libpng、libjpeg、leptonica等依賴庫(kù)的版本說(shuō)明。如果這里報(bào)錯(cuò)不是內(nèi)部或外部命令說(shuō)明PATH沒(méi)配好回頭檢查環(huán)境變量。第二行命令會(huì)列出當(dāng)前所有可用語(yǔ)言如果你正確安裝并放置了簡(jiǎn)體中文語(yǔ)言包輸出中應(yīng)該能看到chi_sim。驗(yàn)證沒(méi)問(wèn)題之后可以拿一張帶文字的圖片做第一次識(shí)別測(cè)試。我在自己的機(jī)器上放了一張含中文和數(shù)字的截圖執(zhí)行tesseract C:\test\sample.png C:\test\result -l chi_simeng這里額外說(shuō)明一下-l參數(shù)的含義chi_simeng表示同時(shí)啟用簡(jiǎn)體中文和英文識(shí)別用加號(hào)拼接。如果只寫-l chi_sim遇到英文部分會(huì)丟失。如果整個(gè)命令執(zhí)行順利C:\test\result.txt里就是識(shí)別出來(lái)的文字內(nèi)容。4. 命令行與代碼調(diào)用核心參數(shù)的理解比命令本身更重要4.1 調(diào)用格式和三個(gè)高頻參數(shù)Tesseract的命令行調(diào)用格式看起來(lái)很簡(jiǎn)單實(shí)際寫對(duì)卻有不少細(xì)節(jié)?;靖袷轿铱偨Y(jié)成這樣tesseract 輸入圖片路徑 輸出文件路徑 [選項(xiàng)]有幾個(gè)關(guān)鍵點(diǎn)需要留意。第一輸出文件路徑不要帶擴(kuò)展名。比如你寫result.txtTesseract生成的文件會(huì)叫result.txt.txt相當(dāng)煩人。正確寫法是直接寫result程序會(huì)自動(dòng)追加.txt。第二輸入圖片路徑如果包含空格或中文建議用英文引號(hào)把路徑包起來(lái)比如C:\My Images\pic.png。我在Windows上處理過(guò)一批中文名圖片路徑處理不好時(shí)就報(bào)Error opening data file之類的問(wèn)題其實(shí)不是圖片打不開而是路徑解析出錯(cuò)了。三個(gè)高頻參數(shù)分別是-l、--psm和--oem。先說(shuō)-l指定語(yǔ)言這個(gè)前面已經(jīng)提過(guò)。再說(shuō)--psm全稱Page Segmentation Mode控制頁(yè)面切分方式直接影響識(shí)別結(jié)果。這個(gè)參數(shù)非常值得花時(shí)間理解因?yàn)椴煌膱D片布局要用不同的模式。最后是--oem控制OCR引擎模式默認(rèn)是使用LSTM引擎少數(shù)老模型場(chǎng)景才需要改成兼容模式。4.2 psm和oem參數(shù)對(duì)結(jié)果的影響我舉個(gè)真實(shí)例子。有一張票據(jù)掃描圖上面既有大標(biāo)題、幾行字段底部還有一段密集的小字說(shuō)明。默認(rèn)的--psm 3是全自動(dòng)頁(yè)面切分識(shí)別出來(lái)的文本順序經(jīng)常錯(cuò)亂可能是先讀了底部說(shuō)明再讀上面的字段這對(duì)后續(xù)數(shù)據(jù)處理很惱火。后來(lái)我改成--psm 6它假定輸入是統(tǒng)一的文本塊結(jié)果穩(wěn)定了很多。常見的psm模式里對(duì)新手比較有用的一個(gè)是--psm 6適合大部分排版相對(duì)規(guī)整的文檔截圖另一個(gè)是--psm 7適合單行文本的識(shí)別像驗(yàn)證碼、車牌這類場(chǎng)景效率很高。還有一種情況是純數(shù)字識(shí)別比如身份證號(hào)、銀行卡號(hào)我一般用--psm 8配合-c tessedit_char_whitelist0123456789這樣的字符白名單效果遠(yuǎn)比默認(rèn)模式好。早期我識(shí)別一長(zhǎng)串?dāng)?shù)字時(shí)誤識(shí)別率總在兩三個(gè)字符上下浮動(dòng)設(shè)置白名單后基本沒(méi)有出過(guò)錯(cuò)。關(guān)于--oem默認(rèn)值3表示讓引擎自動(dòng)選擇LSTM這個(gè)通常就夠了。如果出于某種原因需要用舊的引擎做對(duì)比實(shí)驗(yàn)可以顯式指定別的值但普通項(xiàng)目里調(diào)整它的收益不大。真正影響OCR結(jié)果的通常還是psm和圖片預(yù)處理這一點(diǎn)后面細(xì)說(shuō)。4.3 Python調(diào)用方式與路徑配置很多項(xiàng)目不會(huì)停留在命令行階段更常見的做法是寫Python腳本批量處理。Python調(diào)用Tesseract有兩條路線一條是直接用subprocess調(diào)用命令行程序另一條是用pytesseract這個(gè)封裝庫(kù)。我建議的路線是先掌握subprocess比如下面這段代碼import subprocess subprocess.run([ rC:\Tesseract-OCR\tesseract.exe, rC:\test\sample.png, rC:\test\result, -l, chi_simeng, --psm, 6 ], checkTrue)這里面最關(guān)鍵的是第一行路徑rC:\Tesseract-OCR\tesseract.exe。很多人裝了pytesseract之后運(yùn)行時(shí)報(bào)錯(cuò)找不到tesseract程序就是因?yàn)閹?kù)里默認(rèn)調(diào)用的是系統(tǒng)PATH里的可執(zhí)行文件而當(dāng)前環(huán)境沒(méi)有配置好。解決辦法是在代碼開頭顯式指定import pytesseract pytesseract.pytesseract.tesseract_cmd rC:\Tesseract-OCR\tesseract.exe這樣的話即使系統(tǒng)PATH有問(wèn)題也不影響調(diào)用。我在公司內(nèi)部分享過(guò)這段話后來(lái)好幾個(gè)同事說(shuō)這就是他們當(dāng)初卡住的地方。5. 我在真實(shí)項(xiàng)目里踩過(guò)的坑環(huán)境變量失效與識(shí)別率翻車5.1 PATH配置后終端不生效的處理前面提過(guò)PATH配置后需要重開終端但還有一個(gè)容易混淆的點(diǎn)如果你有多個(gè)終端同時(shí)開著比如PowerShell窗口、CMD窗口、VS Code內(nèi)置終端只有新開的窗口會(huì)刷新環(huán)境變量。VS Code的內(nèi)置終端比較特殊它有可能繼承編輯器啟動(dòng)時(shí)的環(huán)境變量所以有時(shí)候重啟終端也不管用需要重啟整個(gè)VS Code。有一次我在VS Code里折騰了半天都沒(méi)搞定Tesseract調(diào)用最后重啟VS Code就好了其實(shí)不是配置問(wèn)題就是環(huán)境變量沒(méi)刷新。另外在Windows上配置系統(tǒng)PATH的時(shí)候不要手動(dòng)把目錄路徑寫成帶引號(hào)的字符串比如C:\Tesseract-OCR。很多教程里這么寫但在Windows環(huán)境變量編輯器里是不需要的并且?guī)Я艘?hào)之后某些程序反而無(wú)法解析。直接寫C:\Tesseract-OCR即可。還有個(gè)可以快速驗(yàn)證的小技巧。配置完成后在命令行里執(zhí)行where tesseract如果輸出了一條指向C:\Tesseract-OCR\tesseract.exe的路徑說(shuō)明PATH生效了。如果輸出兩條或更多路徑注意實(shí)際調(diào)用的是哪一個(gè)位置有時(shí)候系統(tǒng)里殘留了舊版本的tesseract會(huì)導(dǎo)致調(diào)用錯(cuò)版本。5.2 語(yǔ)言包放對(duì)位置了卻報(bào)錯(cuò)的排查思路還有一種坑是語(yǔ)言包確實(shí)放在了tessdata目錄但運(yùn)行時(shí)仍然提示找不到語(yǔ)言。我之前在Windows上排查過(guò)一個(gè)案例報(bào)錯(cuò)信息大致是Failed loading language chi_sim。當(dāng)時(shí)我檢查了文件存在性確實(shí)在C:\Tesseract-OCR\tessdata\chi_sim.traineddata可程序就是讀不到。問(wèn)題出在TESSDATA_PREFIX環(huán)境變量上。Tesseract在啟動(dòng)時(shí)會(huì)依次嘗試幾個(gè)位置來(lái)找語(yǔ)言包除了安裝目錄下的tessdata它還會(huì)看TESSDATA_PREFIX指定的路徑。如果這個(gè)環(huán)境變量指向了一個(gè)不存在的或錯(cuò)誤的目錄程序就找不到語(yǔ)言包。解決辦法有兩種一是重新設(shè)置TESSDATA_PREFIX為C:\Tesseract-OCR\tessdata二是在命令行里顯式指定tesseract input output -l chi_sim --tessdata-dir C:\Tesseract-OCR\tessdata--tessdata-dir參數(shù)在排查問(wèn)題的時(shí)候特別好用因?yàn)樗@過(guò)了所有環(huán)境變量邏輯直接指向你指定的目錄能很快判斷問(wèn)題是出在環(huán)境變量還是語(yǔ)言包文件本身。另一個(gè)不能忽略的細(xì)節(jié)是語(yǔ)言包版本要與主程序匹配。traineddata文件每個(gè)大版本之間可能存在兼容性問(wèn)題5.5.0使用了更新的訓(xùn)練數(shù)據(jù)格式如果拿4.x時(shí)代的語(yǔ)言包硬配很可能在加載時(shí)閃退或輸出亂碼。在GitHub下載語(yǔ)言包的時(shí)候注意看對(duì)應(yīng)版本分支別下錯(cuò)。5.3 識(shí)別率低的根因診斷與預(yù)處理對(duì)策識(shí)別率低是最讓人頭疼的問(wèn)題因?yàn)樗皇菃我坏墓收隙嵌鄠€(gè)因素疊加的結(jié)果。我最初在實(shí)際項(xiàng)目中遇到的情況是電腦屏幕上一段清楚的文本截圖之后用Tesseract識(shí)別出來(lái)的字符亂得沒(méi)法看。我當(dāng)時(shí)還以為是版本問(wèn)題后來(lái)逐步排查下來(lái)發(fā)現(xiàn)是我忽略了圖像預(yù)處理。一個(gè)可直接復(fù)現(xiàn)的例子一張白底黑字的文檔照片由于手機(jī)拍攝角度和燈光的緣故字體邊緣有輕微模糊加上整體偏灰對(duì)比度不足。直接丟給Tesseract識(shí)別數(shù)字和字母混在一起時(shí)錯(cuò)誤率很高。后來(lái)我對(duì)圖像做了兩步處理轉(zhuǎn)成灰度圖再進(jìn)行二值化或自適應(yīng)閾值處理把文字和背景的邊界拉清晰識(shí)別效果立刻改善。常見的預(yù)處理手段按優(yōu)先級(jí)排序如下轉(zhuǎn)灰度圖減少顏色信息干擾識(shí)別引擎更專注在灰度紋理上放大圖像如果文字高度不足30像素直接放大兩到三倍Tesseract對(duì)字符尺寸比較敏感二值化用大津法Otsu或自適應(yīng)閾值處理讓文字變成純黑、背景變純白去噪去除孤立的噪點(diǎn)避免把噪點(diǎn)識(shí)別成字符在Python里用Pillow和OpenCV可以快速完成這些操作比如import cv2 img cv2.imread(sample.png, cv2.IMREAD_GRAYSCALE) img cv2.resize(img, None, fx2, fy2, interpolationcv2.INTER_CUBIC) _, img cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) cv2.imwrite(processed.png, img)做完預(yù)處理之后再調(diào)用Tesseract識(shí)別率提升非常明顯。我在部署到生產(chǎn)環(huán)境之前會(huì)先做一個(gè)簡(jiǎn)單的測(cè)試同一張圖片預(yù)處理前后各識(shí)別一次對(duì)比結(jié)果差異。這樣能直觀地確認(rèn)預(yù)處理步驟是有效還是無(wú)效避免在流程里加入多余的算力消耗。6. 進(jìn)階批量腳本與項(xiàng)目落地的幾點(diǎn)實(shí)用經(jīng)驗(yàn)6.1 批量處理腳本怎么寫實(shí)際項(xiàng)目里很少只處理一張圖片批量是常態(tài)。Windows環(huán)境下如果想快速處理一個(gè)文件夾里的所有圖片可以直接寫個(gè)批處理腳本。下面這段我實(shí)測(cè)可用echo off setlocal enabledelayedexpansion set TESSERACTC:\Tesseract-OCR\tesseract.exe for %%f in (C:\test\images\*.png) do ( echo Processing %%f %TESSERACT% %%~f %%~df%%~pf%%~nf -l chi_simeng --psm 6 )這段腳本的邏輯很簡(jiǎn)單遍歷指定目錄下的所有PNG圖片對(duì)每一張執(zhí)行Tesseract識(shí)別輸出文件名和源圖片保持一致只是多了個(gè).txt后綴。如果圖片格式是JPG或BMP改一下通配符后綴即可。有一點(diǎn)注意如果圖片文件名帶空格批處理里沒(méi)做引號(hào)處理就可能出錯(cuò)不過(guò)這是Windows批處理的通病不是Tesseract本身的問(wèn)題。如果是在Python里做批量處理用subprocess.run()循環(huán)是更靈活的方式。處理結(jié)果可以用Pandas匯聚到一起方便后續(xù)統(tǒng)一輸出到Excel或CSV。我實(shí)際維護(hù)的一個(gè)小工具就是遍歷文件夾把Tesseract生成的文本文件和對(duì)應(yīng)的圖片名都寫進(jìn)一個(gè)CSV里后續(xù)做數(shù)據(jù)清洗時(shí)很快就能匯總。6.2 預(yù)處理與參數(shù)調(diào)優(yōu)的組合策略預(yù)處理和參數(shù)調(diào)優(yōu)不是孤立步驟它們組合起來(lái)效果才能達(dá)到最好。我在處理不同來(lái)源的圖片時(shí)慢慢總結(jié)出了一套策略先判斷圖片的整體清晰度用肉眼看一下字體的邊緣如果偏虛就做放大和銳化再判斷版式如果是表格或票據(jù)考慮用--psm 6和--psm 4分別出結(jié)果對(duì)比哪個(gè)更穩(wěn)定對(duì)于數(shù)字為主的字段在命令行里加-c tessedit_char_whitelist0123456789最后做一次小批量驗(yàn)證比如選取10張有代表性的圖片調(diào)整參數(shù)觀察識(shí)別準(zhǔn)確率的變化拿白名單參數(shù)舉個(gè)例子。識(shí)別身份證號(hào)這類純數(shù)字加字母的場(chǎng)景白名單的作用是強(qiáng)制引擎只輸出特定字符集大幅降低無(wú)關(guān)字符的錯(cuò)誤率。但要注意如果有大寫字母混在數(shù)字里白名單里必須包含字母否則字母會(huì)被吞掉。這個(gè)參數(shù)在命令行中多次使用-c選項(xiàng)疊加即可。6.3 如果想進(jìn)一步提高精度在很多工程化項(xiàng)目中單純靠調(diào)Tesseract參數(shù)到達(dá)某個(gè)準(zhǔn)確率之后瓶頸主要體現(xiàn)在模型本身。比如字體比較個(gè)性、帶背景紋理、或者有手寫元素默認(rèn)的LSTM模型很難處理好。這時(shí)候有兩類提升思路。一類是針對(duì)性訓(xùn)練。Tesseract自帶的工具可以基于現(xiàn)有模型做微調(diào)用你自己領(lǐng)域的樣本圖片和對(duì)應(yīng)標(biāo)注文本訓(xùn)練讓模型更適配業(yè)務(wù)數(shù)據(jù)。但這需要一個(gè)標(biāo)注數(shù)據(jù)集多半在百?gòu)埳踔燎埣?jí)別才有效果。另一類是在識(shí)別之前加一道目標(biāo)檢測(cè)把圖片里的關(guān)鍵區(qū)域先摳出來(lái)再逐個(gè)區(qū)域識(shí)別。這樣能有效減少版面混亂帶來(lái)的干擾準(zhǔn)確率和穩(wěn)定性都會(huì)好很多。我自己的經(jīng)驗(yàn)是如果預(yù)算允許先嘗試用分類的方式把問(wèn)題分拆哪些圖片是打印體哪些是手寫哪些是模糊截屏針對(duì)不同類別設(shè)計(jì)不同的預(yù)處理和psm組合。Tesseract的定位是通用OCR引擎它能覆蓋80%的常見場(chǎng)景剩下的20%需要你自己去適配。把調(diào)整的過(guò)程記錄下來(lái)會(huì)在后續(xù)迭代中省下不少時(shí)間。最后再分享一點(diǎn)個(gè)人的操作習(xí)慣在Windows上使用Tesseract做OCR時(shí)建議把引擎版本、參數(shù)組合和預(yù)處理步驟寫在一個(gè)配置文檔里因?yàn)檫@類工具一段時(shí)間不碰很多細(xì)節(jié)很容易忘。再好的工具也抵不過(guò)一套可復(fù)盤的流程這兩者結(jié)合起來(lái)才是項(xiàng)目中真正的高效所在。