用 Python 寫了一個圖像文字識別 OCR 工具

人生苦短,快學 Python!

在之前的文章裏,我們多次嘗試用 Python 實現文本 OCR 識別!

點擊藍字查看歷史文章👉OCR 識別的花樣使用5 行 Python 實現驗證碼識別3 行 Python 代碼識別圖片文字

不過今天我們要搞一個升級版:直接寫一個圖像文字識別 OCR 工具

引言

最近在技術交流羣裏聊到一個關於圖像文字識別的需求,在工作、生活中常常會用到,比如票據、漫畫、掃描件、照片的文本提取

博主基於 PyQt + labelme + PaddleOCR 寫了一個桌面端的 OCR 工具,用於快速實現圖片中文本區域自動檢測 + 文本自動識別

識別效果如下圖所示:

▲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