<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python寫了一個(gè)圖像文字識(shí)別OCR工具

          共 4967字,需瀏覽 10分鐘

           ·

          2021-12-29 21:23

          人生苦短,快學(xué)Python!

          在之前的文章里,我們多次嘗試用Python實(shí)現(xiàn)文本OCR識(shí)別!

          今天我們要搞一個(gè)升級(jí)版:直接寫一個(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í)別效果如下圖所示:

          854032c8e511cc96b29abe6ff6b5baa8.webp▲OCR工具識(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)境,安裝需要用到的第三方庫。

          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+,可以選擇下面這個(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:

          016a89bcfef6b36d07d26d251efeb219.webp

          在python中調(diào)用

          from paddleocr import PaddleOCR, draw_ocr

          # Paddleocr目前支持的多語言語種可以通過修改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程序開發(fā)入門和環(huán)境配置,詳見一篇博客(具體見文末)。

          主要步驟:

          界面布局設(shè)計(jì)

          在QtDesigner中拖拽控件,完成程序界面布局,并保存*.ui文件。

          1eabefe96108599797d7dfc7b4a082c7.webp

          利用 pyuic 自動(dòng)生成界面代碼

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

          a5fdbc62fad923045de82a71f84673bc.webp

          編寫界面業(yè)務(wù)類

          業(yè)務(wù)類 MainWindow 實(shí)現(xiàn)程序邏輯和算法功能,與前面第2步生成的ui實(shí)現(xiàn)解耦,避免每次修改ui文件會(huì)影響業(yè)務(wù)代碼。ui界面上的控件可以通過self._ui.xxxObjectName 訪問。

          class MainWindow(QMainWindow):
           FIT_WINDOW, FIT_WIDTH, MANUAL_ZOOM = 012

           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程序。

          打開圖片→選擇語言模型ch(中文)→選擇文本檢測(cè)+識(shí)別→點(diǎn)擊開始,檢測(cè)完的文本區(qū)域會(huì)自動(dòng)畫框,并在右側(cè)識(shí)別結(jié)果——文本Tab頁的列表中顯示。

          67b1c34aba2599e294f257448bf4f5f1.webp

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

          3eae8217aaeb6d8a9c99c5b73632ea6a.webp

          軟件代碼

          由于時(shí)間有限,軟件細(xì)節(jié)功能還需進(jìn)一步完善。代碼已開源到 gitee 上,歡迎感興趣的朋友提pull request,共同修改完善。

          代碼開源地址:

          公眾號(hào)回復(fù):識(shí)別源碼 即可獲得!

          參考鏈接

          畫框、區(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

          PS公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!


          老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!

          d5ebe1c91db0103efa195c374c70844d.webp

          神秘禮包獲取方式

          識(shí)別文末二維碼,回復(fù):1024

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天澡日日久综合 | 中文字幕乱伦大杂烩 | 无遮掩中文字幕 | 精品欧美乱码久久久久久 | 黄色片人人人人大香蕉 |