用Python寫了一個(gè)圖像文字識(shí)別OCR工具
最近在技術(shù)交流群里聊到一個(gè)關(guān)于圖像文字識(shí)別的需求,在工作、生活中常常會(huì)用到,比如票據(jù)、漫畫、掃描件、照片的文本提取。
博主基于 PyQt + labelme + PaddleOCR 寫了一個(gè)桌面端的OCR工具,用于快速實(shí)現(xiàn)圖片中文本區(qū)域自動(dòng)檢測(cè)+文本自動(dòng)識(shí)別。
識(shí)別效果如下圖所示:

所有框選區(qū)域?yàn)镺CR算法自動(dòng)檢測(cè),右側(cè)列表有每個(gè)框?qū)?yīng)的文字內(nèi)容;點(diǎn)擊右側(cè)“識(shí)別結(jié)果”中的文本記錄,然后點(diǎn)擊“復(fù)制到剪貼板”即可復(fù)制該文本內(nèi)容。
功能列表
文本區(qū)域檢測(cè)+文字識(shí)別 文本區(qū)域可視化 文字內(nèi)容列表 圖像、文件夾加載 圖像滾輪縮放查看 繪制區(qū)域、編輯區(qū)域 復(fù)制所選文本識(shí)別結(jié)果
OCR部分
圖像文字檢測(cè)+文字識(shí)別算法,主要借助 paddleocr 實(shí)現(xiàn)。
創(chuàng)建或者選擇一個(gè)虛擬環(huán)境,安裝需要用到的第三方庫(kù)。
conda?create?-n?ocr
conda?activate?ocr
安裝框架
如果你沒(méi)有NVIDIA GPU,或GPU不支持CUDA,可以安裝CPU版本:
#?CPU版本
pip?install?paddlepaddle==2.1.0?-i?https://mirror.baidu.com/pypi/simple?
如果你的GPU安裝過(guò)CUDA9或CUDA10,cuDNN 7.6+,可以選擇下面這個(gè)GPU版本:
#?GPU版本
python3?-m?pip?install?paddlepaddle-gpu==2.1.0?-i?https://mirror.baidu.com/pypi/simple
安裝 PaddleOCR
安裝paddleocr:
pip?install?"paddleocr>=2.0.1"?#?推薦使用2.0.1+版本
版面分析,需要安裝 Layout-Parser:
pip3?install?-U?https://paddleocr.bj.bcebos.com/whl/layoutparser-0.0.0-py3-none-any.whl
測(cè)試安裝是否成功
安裝完成后,測(cè)試一張圖片--image_dir ./imgs/11.jpg,采用中英文檢測(cè)+方向分類器+識(shí)別全流程:
paddleocr?--image_dir?./imgs/11.jpg?--use_angle_cls?true?--use_gpu?false
輸出一個(gè)list:

在python中調(diào)用
from?paddleocr?import?PaddleOCR,?draw_ocr
#?Paddleocr目前支持的多語(yǔ)言語(yǔ)種可以通過(guò)修改lang參數(shù)進(jìn)行切換
#?例如`ch`,?`en`,?`fr`,?`german`,?`korean`,?`japan`
ocr?=?PaddleOCR(use_angle_cls=True,?lang="ch")??#?need?to?run?only?once?to?download?and?load?model?into?memory
img_path?=?'./imgs/11.jpg'
result?=?ocr.ocr(img_path,?cls=True)
for?line?in?result:
????print(line)
輸出結(jié)果是一個(gè)list,每個(gè)item包含了文本框,文字和識(shí)別置信度:
[[[24.0, 36.0], [304.0, 34.0], [304.0, 72.0], [24.0, 74.0]], ['純臻營(yíng)養(yǎng)護(hù)發(fā)素', 0.964739]] [[[24.0, 80.0], [172.0, 80.0], [172.0, 104.0], [24.0, 104.0]], ['產(chǎn)品信息/參數(shù)', 0.98069626]] [[[24.0, 109.0], [333.0, 109.0], [333.0, 136.0], [24.0, 136.0]], ['(45元/每公斤,100公斤起訂)', 0.9676722]] ......
界面部分
界面部分基于pyqt5實(shí)現(xiàn),其中pyqt GUI程序開(kāi)發(fā)入門和環(huán)境配置,詳見(jiàn)一篇博客(具體見(jiàn)文末)。
主要步驟:
界面布局設(shè)計(jì)
在QtDesigner中拖拽控件,完成程序界面布局,并保存*.ui文件。

利用 pyuic 自動(dòng)生成界面代碼
在 pycharm 的項(xiàng)目文件結(jié)構(gòu)中找到*.ui文件,右鍵——External Tools——pyuic,會(huì)在ui文件同級(jí)目錄下自動(dòng)生成界面 ui 的 Python 代碼。

編寫界面業(yè)務(wù)類
業(yè)務(wù)類 MainWindow 實(shí)現(xiàn)程序邏輯和算法功能,與前面第2步生成的ui實(shí)現(xiàn)解耦,避免每次修改ui文件會(huì)影響業(yè)務(wù)代碼。ui界面上的控件可以通過(guò)self._ui.xxxObjectName 訪問(wèn)。
class?MainWindow(QMainWindow):
?FIT_WINDOW,?FIT_WIDTH,?MANUAL_ZOOM?=?0,?1,?2
?def?__init__(self):
??super().__init__()??#?調(diào)用父類構(gòu)造函數(shù),創(chuàng)建QWidget窗體
??self._ui?=?Ui_MainWindow()??#?創(chuàng)建ui對(duì)象
??self._ui.setupUi(self)??#?構(gòu)造ui
??self.setWindowTitle(__appname__)
??#?加載默認(rèn)配置
??config?=?get_config()
??self._config?=?config????
??
??#?單選按鈕組
????????self.checkBtnGroup?=?QButtonGroup(self)
????????self.checkBtnGroup.addButton(self._ui.checkBox_ocr)
????????self.checkBtnGroup.addButton(self._ui.checkBox_det)
????????self.checkBtnGroup.addButton(self._ui.checkBox_recog)
????????self.checkBtnGroup.addButton(self._ui.checkBox_layoutparser)
????????self.checkBtnGroup.setExclusive(True)?????
實(shí)現(xiàn)界面業(yè)務(wù)邏輯
對(duì)主界面上的按鈕、列表、繪圖控件進(jìn)行信號(hào)槽連接。自定義的槽函數(shù)不用專門聲明,如果是自定義的信號(hào),需要在類__init__()前加上 yourSignal= pyqtSignal(args)。
這里以按鈕響應(yīng)函數(shù)、列表響應(yīng)函數(shù)為例。按鈕點(diǎn)擊的信號(hào)是 clicked,listWidget列表切換選擇的信號(hào)是 itemSelectionChanged 。
#?按鈕響應(yīng)函數(shù)
self._ui.btnOpenImg.clicked.connect(self.openFile)
self._ui.btnOpenDir.clicked.connect(self.openDirDialog)
self._ui.btnNext.clicked.connect(self.openNextImg)
self._ui.btnPrev.clicked.connect(self.openPrevImg)
self._ui.btnStartProcess.clicked.connect(self.startProcess)
self._ui.btnCopyAll.clicked.connect(self.copyToClipboard)
self._ui.btnSaveAll.clicked.connect(self.saveToFile)
self._ui.listWidgetResults.itemSelectionChanged.connect(self.onItemResultClicked)
5. 運(yùn)行看看效果
運(yùn)行 python main.py 即可啟動(dòng)GUI程序。
打開(kāi)圖片→選擇語(yǔ)言模型ch(中文)→選擇文本檢測(cè)+識(shí)別→點(diǎn)擊開(kāi)始,檢測(cè)完的文本區(qū)域會(huì)自動(dòng)畫框,并在右側(cè)識(shí)別結(jié)果——文本Tab頁(yè)的列表中顯示。

所有檢測(cè)出文本的區(qū)域列表,在識(shí)別結(jié)果——區(qū)域Tab頁(yè):

軟件代碼
由于時(shí)間有限,軟件細(xì)節(jié)功能還需進(jìn)一步完善。代碼已開(kāi)源到 gitee 上,歡迎感興趣的朋友提pull request,共同修改完善。
代碼開(kāi)源地址:https://gitee.com/signal926/ocr-gui-demo
參考鏈接
畫框、區(qū)域列表:https://github.com/wkentaro/labelme
icons:https://github.com/google/material-design-icons
https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.3/doc/doc_ch/quickstart.md
https://blog.csdn.net/Bit_Coders/article/details/119304488
如果本文對(duì)你有幫助的話,歡迎點(diǎn)贊、收藏~
- EOF -
回復(fù)關(guān)鍵字“簡(jiǎn)明python ”,立即獲取入門必備書籍《簡(jiǎn)明python教程》電子版
回復(fù)關(guān)鍵字“爬蟲”,立即獲取爬蟲學(xué)習(xí)資料

推薦
