人生苦短,快學Python!
在之前的文章里,我們多次嘗試用Python實作文本OCR識別!
今天我們要搞一個升級版:直接寫一個 影像文字識別OCR工具 !
引言
最近在技術交流群里聊到一個關于影像文字識別的需求,在作業、生活中常常會用到,比如 票據、漫畫、掃描件、照片的文本提取 ,
博主基于 PyQt + labelme + PaddleOCR 寫了一個桌面端的OCR工具,用于快速實作圖片中 文本區域自動檢測+文本自動識別 ,
識別效果如下圖所示:
干貨主要有:
① 200 多本 Python 電子書(和經典的書籍)應該有
② Python標準庫資料(最全中文版)
③ 專案原始碼(四五十個有趣且可靠的練手專案及原始碼)
④ Python基礎入門、爬蟲、網路開發、大資料分析方面的視頻(適合小白學習)
⑤ Python學習路線圖(告別不入流的學習)
Python學習Q群101677771
▲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://www.uj5u.com/houduan/428454.html
標籤:Python
上一篇:IO流學習筆記
