Python自動化辦公-編寫一個OCR識別程序
OCR 的全稱是 Optical Character Recognition,即光學字符識別,通俗點講就是文字識別。在辦公領域,最常用的就是識別圖片上的文字,比如識別圖片中的發(fā)票信息、合同信息、Excel 或者 Word 截圖,比如說你對著喜歡的幾頁書拍了照,想把里面的文字摳出來怎么辦?
現(xiàn)在的手機可能都有這個功能,但還不夠智能,無法進行訓練,再說要是有一堆圖片需要處理呢?還是自己動手,豐衣足食,今天來分享一下如何 Python 寫一個 OCR 識別程序。授人以漁,本文的思路適用于編寫任意一個日常小工具。
第一步,看看已有的輪子
軟件開發(fā)忌重復造輪子,對普通程序員來講,也很難造一個好用的輪子,拿來主義真香,萬千牛逼的庫,雖不是我所有,卻為我所用。
瀏覽器打開?https://github.com,搜索OCR,選擇編程語言 Python,可以看到如下結果:

通常情況下,我會選擇 star 數(shù)量最多的,因為我相信程序員都是在真誠的點贊。
看完輪子的基本介紹,你選擇適合自己的就好。
第二步,簡單學習下要用的輪子
一般情況下,倉庫的 README 上都有安裝方法和使用教程,不過大部分都是英文,所以平時多記些英文單詞,對于學習技術是很有幫助的。
比如說這個https://github.com/PaddlePaddle/PaddleOCR,很幸運,它是有中文的:


按照這個教程,自己實踐一下:
安裝
pip?install?"paddleocr>=2.0.1"
等待 pip 安裝完成。
我在 Python 3.8.5 版本上使用 pip 安裝順利通過,而使用 pyenv 的 Python 就一直報編譯失敗的錯誤,因此不推薦 pyenv 來管理你的 Python 版本。我的做法是在本機上安裝多個 Python 版本,要用哪個版本時啟用對應的版本使用如下的命令創(chuàng)建一個虛擬環(huán)境:
python3.8?-m?venv?py38env
python3.9?-m?venv?py39env
假如要用 Python3.9 那就?source ~/py39env/bin/activate
如果安裝過程報錯了:

遇到報錯,不要慌,只要思想不滑坡,辦法總比困難多。
報錯信息提示 pip 遇到了編譯錯誤,這也是 Python 為人詬病的地方,第三方庫源代碼安裝時經(jīng)常遇到編譯錯誤,你看人家 Java,一個 jar 包處處都能用。
畢竟沒有完美的語言,理解一下,理解一下。
觀察報錯前的打印信息,pip 正在安裝的是 scikit-image 0.17.2,只要我們找到 scikit-image 的二進制包(別人已經(jīng)按照對應的平臺編譯好了),也就是 whl 文件,直接安裝一下完事,這個 whl 文件,要去 pypi 上找。瀏覽器打開 pypi.org,搜索 scikit-image,找到 0.17.2 版本,點開看看,結果如下:

發(fā)現(xiàn) 0.17.2 版本最高支持 Python3.8,如果你的 Python 版本是 3.9,勸你降低版本后安裝。
選擇對應 Python 版本、操作系統(tǒng)進行下載(要是下載慢,請用迅雷下載),然后,pip install 即可。
使用
找個圖片試用一下:
1.jpg

paddleocr?--image_dir?1.jpg?--use_angle_cls?true?--use_gpu?false
結果報了錯,提示"ModuleNotFoundError: No module named 'paddle'",在 Issues 里面搜索一下找到了解決方案:
pip?install?paddlepaddle
然后再次執(zhí)行識別出結果:

第三步,設計自己的程序。
工具雖然可以直接命令行使用,但結果不是很直觀,我們可以寫一個腳本,調用下它的接口,將圖片路徑作為參數(shù)輸入,將識別出的文本內(nèi)容作為輸出,保存在相同路徑下的文本文件中,文件名就是圖片名+.txt。
參考官方的示例,可以很輕松寫出如下代碼:
import?sys
from?paddleocr?import?PaddleOCR,draw_ocr
def?get_text_to_txt(img_path:?str)?->None:
????ocr?=?PaddleOCR(use_angle_cls=True,?use_gpu?=?False,?show_log?=?False,?lang='ch')?#?need?to?run?only?once?to?download?and?load?model?into?memory
????result?=?ocr.ocr(img_path,?cls=True)
????with?open(img_path+".txt",?"w")?as?writer:
????????for?line?in?result:
????????????print(line)
????????????writer.write(line[-1][0])
????????????writer.write("\n")
if?__name__?==?'__main__':
????get_text_to_txt(sys.argv[1])
保存為 ocr_demo.py 然后就可以在命令行調用:
??python?ocr_demo.py?/Users/aaron/Downloads/ppocr_img/imgs/1.jpg?>>?/dev/null
??cat?/Users/aaron/Downloads/ppocr_img/imgs/1.jpg.txt
土地整治與土壤修復研究中心
華南農(nóng)業(yè)大學|東圖
至此腳本搞定。
最后
本文通過使用開源工具 paddleocr,分享了 Python OCR 程序的制作過程,paddleocr 支持 80 多種語言,支持用戶自定義訓練,還提供豐富的預測推理部署方案,更多技術細節(jié)還請參考官方倉庫:https://github.com/PaddlePaddle/PaddleOCR
程序報錯不可怕,可怕的是你看到錯誤就放棄了。
如果有幫助,請點贊、在看、關注支持,感謝路上有你。
