用 Python 寫了一個圖像文字識別 OCR 工具
人生苦短,快學 Python!
在之前的文章裏,我們多次嘗試用 Python 實現文本 OCR 識別!
點擊藍字查看歷史文章👉OCR 識別的花樣使用、5 行 Python 實現驗證碼識別、3 行 Python 代碼識別圖片文字。
不過今天我們要搞一個升級版:直接寫一個圖像文字識別 OCR 工具!
引言
最近在技術交流羣裏聊到一個關於圖像文字識別的需求,在工作、生活中常常會用到,比如票據、漫畫、掃描件、照片的文本提取。
博主基於 PyQt + labelme + PaddleOCR 寫了一個桌面端的 OCR 工具,用於快速實現圖片中文本區域自動檢測 + 文本自動識別。
識別效果如下圖所示:
所有框選區域爲 OCR 算法自動檢測,右側列表有每個框對應的文字內容;點擊右側 “識別結果” 中的文本記錄,然後點擊 “複製到剪貼板” 即可複製該文本內容。
功能列表
-
文本區域檢測 + 文字識別
-
文本區域可視化
-
文字內容列表
-
圖像、文件夾加載
-
圖像滾輪縮放查看
-
繪製區域、編輯區域
-
複製所選文本識別結果
OCR 部分
圖像文字檢測 + 文字識別算法,主要藉助 paddleocr
實現。
創建或者選擇一個虛擬環境,安裝需要用到的第三方庫。
conda create -n ocr
conda activate ocr
安裝框架
如果你沒有 NVIDIA GPU,或 GPU 不支持 CUDA,可以安裝 CPU 版本:
# CPU版本
pip install paddlepaddle==2.1.0 -i https://mirror.baidu.com/pypi/simple
如果你的 GPU 安裝過 CUDA9 或 CUDA10,cuDNN 7.6+,可以選擇下面這個 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
測試安裝是否成功
安裝完成後,測試一張圖片--image_dir ./imgs/11.jpg
,採用中英文檢測 + 方向分類器 + 識別全流程:
paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false
輸出一個 list:
在 python 中調用
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持的多語言語種可以通過修改lang參數進行切換
# 例如`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)
輸出結果是一個 list,每個 item 包含了文本框,文字和識別置信度:
[[[24.0, 36.0], [304.0, 34.0], [304.0, 72.0], [24.0, 74.0]], ['純臻營養護髮素', 0.964739]] [[[24.0, 80.0], [172.0, 80.0], [172.0, 104.0], [24.0, 104.0]], ['產品信息 / 參數', 0.98069626]] [[[24.0, 109.0], [333.0, 109.0], [333.0, 136.0], [24.0, 136.0]], ['(45 元 / 每公斤,100 公斤起訂)', 0.9676722]] ......
界面部分
界面部分基於 pyqt5 實現,其中 pyqt GUI 程序開發入門和環境配置,詳見一篇博客 (具體見文末)。
主要步驟:
界面佈局設計
在 QtDesigner 中拖拽控件,完成程序界面佈局,並保存*.ui
文件。
利用 pyuic 自動生成界面代碼
在 pycharm 的項目文件結構中找到*.ui
文件,右鍵——External Tools——pyuic,會在 ui 文件同級目錄下自動生成界面 ui 的 Python 代碼。
編寫界面業務類
業務類 MainWindow 實現程序邏輯和算法功能,與前面第 2 步生成的 ui 實現解耦,避免每次修改 ui 文件會影響業務代碼。ui 界面上的控件可以通過self._ui.xxxObjectName
訪問。
class MainWindow(QMainWindow):
FIT_WINDOW, FIT_WIDTH, MANUAL_ZOOM = 0, 1, 2
def __init__(self):
super().__init__() # 調用父類構造函數,創建QWidget窗體
self._ui = Ui_MainWindow() # 創建ui對象
self._ui.setupUi(self) # 構造ui
self.setWindowTitle(__appname__)
# 加載默認配置
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)
實現界面業務邏輯
對主界面上的按鈕、列表、繪圖控件進行信號槽連接。自定義的槽函數不用專門聲明,如果是自定義的信號,需要在類__init__() 前加上 yourSignal= pyqtSignal(args)
。
這裏以按鈕響應函數、列表響應函數爲例。按鈕點擊的信號是 clicked
,listWidget 列表切換選擇的信號是 itemSelectionChanged
。
# 按鈕響應函數
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. 運行看看效果
運行 python main.py
即可啓動 GUI 程序。
打開圖片→選擇語言模型 ch(中文)→選擇文本檢測 + 識別→點擊開始,檢測完的文本區域會自動畫框,並在右側識別結果——文本 Tab 頁的列表中顯示。
所有檢測出文本的區域列表,在識別結果——區域 Tab 頁:
軟件代碼
由於時間有限,軟件細節功能還需進一步完善。代碼已開源到 gitee 上,歡迎感興趣的朋友提 pull request,共同修改完善。
代碼開源地址:https://gitee.com/signal926/ocr-gui-demo
參考鏈接
畫框、區域列表: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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jyVz_Nc3a-_7HwPlZaYjEw