Windows 安裝 PaddleOCR 3.7.0 CPU 並將圖片轉成 TXT|PaddleOCR CPU Image to TXT

在 Windows 上安裝 PaddlePaddlePaddleOCR 3.7.0,使用 PaddleOCR_CPU_ImageToTXT.py 以 CPU 執行圖片 OCR,首次執行自動下載模型。

設定步驟

  1. 安裝 Python 3.12,安裝時勾選 Add Python.exe to PATH
  2. 開啟 CMD,確認 Python:
    python --version
  3. 安裝 CPU 版 PaddlePaddle
  4. 確認 PaddlePaddle
    python -c "import paddle; print(paddle.__version__)"
  5. 安裝 PaddleOCR 3.7.0
    python -m pip install paddleocr==3.7.0
  6. 確認 PaddleOCR
    python -c "import paddleocr; print(paddleocr.__version__)"
  7. 建立 PaddleOCR_CPU_ImageToTXT.py,加入以下 CPU 相容性設定:
    import os
    
    os.environ["CUDA_VISIBLE_DEVICES"] = ""
    os.environ["FLAGS_enable_pir_api"] = "0"
    os.environ["FLAGS_use_mkldnn"] = "0"
  8. 在同一個 PaddleOCR_CPU_ImageToTXT.py 中使用:
    from paddleocr import PaddleOCR
  9. 將 OCR 設定為:
    ocr = PaddleOCR(
        lang="ch",
        use_doc_orientation_classify=False,
        use_doc_unwarping=False,
        use_textline_orientation=True,
        enable_mkldnn=False,
    )
  10. 將完整程式存放於例如 D:\管理工具\PaddleOCR_CPU_ImageToTXT.py
  11. import os
    
    # ============================================================
    # PaddlePaddle CPU 相容性設定
    # 必須放在 import paddle / paddleocr 之前
    # ============================================================
    
    # 不使用 GPU
    os.environ["CUDA_VISIBLE_DEVICES"] = ""
    
    # 關閉 PaddlePaddle 新 PIR API
    # 可避免 ConvertPirAttribute2RuntimeAttribute 錯誤
    os.environ["FLAGS_enable_pir_api"] = "0"
    
    # 關閉 oneDNN / MKL-DNN
    os.environ["FLAGS_use_mkldnn"] = "0"
    
    
    from pathlib import Path
    from datetime import datetime
    import tkinter as tk
    from tkinter import filedialog, messagebox
    
    from paddleocr import PaddleOCR
    
    
    def choose_image():
        """選擇圖片"""
    
        root = tk.Tk()
        root.withdraw()
    
        file_path = filedialog.askopenfilename(
            title="請選擇要 OCR 的圖片",
            filetypes=[
                (
                    "圖片檔案",
                    "*.jpg *.jpeg *.png *.bmp *.tif *.tiff *.webp"
                ),
                ("所有檔案", "*.*")
            ]
        )
    
        root.destroy()
    
        return file_path
    
    
    def main():
    
        # ========================================================
        # 1. 選擇圖片
        # ========================================================
    
        image_file = choose_image()
    
        if not image_file:
            print("未選擇圖片,程式結束。")
            return
    
        image_path = Path(image_file)
    
        print("=" * 60)
        print("PaddleOCR 3.7.0 - CPU OCR")
        print("=" * 60)
        print(f"圖片:{image_path}")
        print()
    
        try:
    
            # ====================================================
            # 2. 建立 PaddleOCR
            # ====================================================
    
            print("正在載入 PaddleOCR...")
            print("CPU 模式")
            print("PIR:關閉")
            print("oneDNN:關閉")
            print()
    
            ocr = PaddleOCR(
                lang="ch",
    
                # 文件方向分類
                use_doc_orientation_classify=False,
    
                # 文件去扭曲
                use_doc_unwarping=False,
    
                # 文字行方向判斷
                use_textline_orientation=True,
    
                # 關閉 oneDNN
                enable_mkldnn=False,
            )
    
            # ====================================================
            # 3. OCR
            # ====================================================
    
            print("開始 OCR...")
            print()
    
            result = ocr.predict(
                str(image_path)
            )
    
            # ====================================================
            # 4. 取得辨識文字
            # ====================================================
    
            texts = []
    
            for res in result:
    
                data = res.json
    
                if callable(data):
                    data = data()
    
                if not isinstance(data, dict):
                    continue
    
                res_data = data.get("res", data)
    
                rec_texts = res_data.get(
                    "rec_texts",
                    []
                )
    
                for text in rec_texts:
    
                    text = str(text).strip()
    
                    if text:
                        texts.append(text)
    
            # ====================================================
            # 5. 建立 TXT
            # ====================================================
    
            desktop = Path.home() / "Desktop"
    
            timestamp = datetime.now().strftime(
                "%Y%m%d_%H%M%S"
            )
    
            output_name = (
                f"{image_path.stem}_{timestamp}.txt"
            )
    
            output_path = desktop / output_name
    
            with open(
                output_path,
                "w",
                encoding="utf-8-sig"
            ) as f:
    
                f.write("\n".join(texts))
    
            # ====================================================
            # 6. 完成
            # ====================================================
    
            print()
            print("=" * 60)
            print("OCR 完成")
            print("=" * 60)
            print(f"辨識文字:{len(texts)} 行")
            print(f"輸出檔案:{output_path}")
            print()
    
            root = tk.Tk()
            root.withdraw()
    
            messagebox.showinfo(
                "OCR 完成",
                f"OCR 已完成。\n\n"
                f"圖片:\n{image_path.name}\n\n"
                f"辨識文字:{len(texts)} 行\n\n"
                f"TXT:\n{output_name}"
            )
    
            root.destroy()
    
        except Exception as e:
    
            print()
            print("=" * 60)
            print("OCR 發生錯誤")
            print("=" * 60)
            print(e)
            print()
    
            root = tk.Tk()
            root.withdraw()
    
            messagebox.showerror(
                "OCR 錯誤",
                str(e)
            )
    
            root.destroy()
    
    
    if __name__ == "__main__":
        main()
    

  12. 執行程式:
python "D:\管理工具\PaddleOCR_CPU_ImageToTXT.py"
  1. File Dialog 選擇要辨識的圖片。
  2. 第一次執行時,等待 PaddleOCR 自動下載模型。
  3. 模型下載後會自動快取至:
`C:\Users\使用者名稱\.paddlex\official_models\`
  1. 再次執行程式時,直接使用已快取的模型。
  2. OCR 完成後,TXT 會輸出至 Desktop,檔名為原始圖片檔名加上時間戳。

原理

PaddleOCR 會透過 PaddleX 自動下載並管理 OCR 模型,不需要下載 PaddleOCR 原始碼;第一次下載後,後續直接使用快取。關閉 PIRoneDNN / MKL-DNN 可避免 Windows CPU 執行時的相容性錯誤。
研究關鍵字: PaddleOCR 3.7.0PaddlePaddle CPUPaddleX official_models

About the author

陳小泉
喜愛用文字說明自己眼中所見的一切

張貼留言