PaddleOCR 與 PaddleX 調試

PaddleOCR 與 PaddleX 調試

  • 1.安裝
    • 1.1 環境準備
    • 1.2用Conda創建虛擬環境
  • 2.測試
    • 2.1發票測試
    • 2.2 手寫漢字識別
  • 3.PaddleOCR 與 PaddleX 對比
    • 3.1 基于 PaddleX 部署 OCR 服務

1.安裝

PP OCR 文檔

1.1 環境準備

根據自己操作系統按網上指導安裝 ccache

ccache --version

是否已安裝 ccache 測試

在這里插入圖片描述

設置 Paddlex 環境變量 PADDLE_PDX_CACHE_HOME

以 Windows 為例

在這里插入圖片描述

1.2用Conda創建虛擬環境

## 創建
conda create -n env-ocr python=3.10
## 激活
conda activate env-ocr
## 精簡安裝
pip install paddlepaddle==3.1.0
pip install paddleocr==3.1.0

非精簡安裝

## 下載源碼
git clone https://github.com/PaddlePaddle/PaddleOCR.git
## 進入源碼目錄,并激活虛擬環境
conda activate env-ocr
## 安裝
pip install -e . --no-deps

在這里插入圖片描述

2.測試

使用 Git 提供的用例代碼

from paddleocr import PaddleOCR
# Initialize PaddleOCR instance
ocr = PaddleOCR(use_doc_orientation_classify=False,use_doc_unwarping=False,use_textline_orientation=False)# Run OCR inference on a sample image 
result = ocr.predict(input="invoice.jpg")# Visualize the results and save the JSON results
for res in result:res.print()res.save_to_img("output")res.save_to_json("output")

首次執行會自動下載模型依賴

在這里插入圖片描述

2.1發票測試

在這里插入圖片描述
結果

在這里插入圖片描述

2.2 手寫漢字識別

在這里插入圖片描述

結果(部分識別不準確

在這里插入圖片描述

3.PaddleOCR 與 PaddleX 對比

維度???PaddleOCR ??PaddleX
核心目標??專用OCR算法庫深度學習全流程工具鏈
??使用場景??需精細調優OCR模型時快速集成OCR到完整應用(含其他AI任務)
??部署靈活性支持 Python/C++ 等原生部署提供 HTTP 服務、Docker 等標準化部署方案
??開發復雜度??需直接處理OCR技術細節低代碼調用,簡化流程

3.1 基于 PaddleX 部署 OCR 服務

## 安裝服務插件
paddlex --install serving

在這里插入圖片描述

## 以 API 服務形式啟動(服務部署可以改成后臺進程形式啟動)
paddlex --serve --pipeline OCR --port 8800

在這里插入圖片描述

查看接口文檔:http://127.0.0.1:8800/docs

在這里插入圖片描述

測試用腳本

import base64
import requests
import json
import os
import argparse
from typing import List, Dict, Any, Tupleclass PaddleXOCRApiClient:"""PaddleX OCR 服務的客戶端類"""def __init__(self, host: str = "localhost", port: int = 8800) -> None:"""初始化 OCR 客戶端Args:host: 服務主機地址port: 服務端口"""self.base_url = f"http://{host}:{port}"self.ocr_url = f"{self.base_url}/ocr"def recognize_text(self, image_path: str) -> Dict[str, Any]:"""從單張圖像中識別文本Args:image_path: 圖像文件路徑Returns:包含識別結果的字典"""if not os.path.exists(image_path):raise FileNotFoundError(f"文件不存在: {image_path}")try:with open(image_path, "rb") as f:base64_data = base64.b64encode(f.read()).decode("utf-8")payload = {"file": base64_data,"fileType": 1# "useDocOrientationClassify": true,# "useDocUnwarping": true,# "useTextlineOrientation": true,# "textDetLimitSideLen": 0,# "textDetLimitType": "string",# "textDetThresh": 0,# "textDetBoxThresh": 0,# "textDetUnclipRatio": 0,# "textRecScoreThresh": 0,# "visualize": true}# print(payload)response = requests.post(self.ocr_url, json=payload,headers={"Accept": "application/json"})if response.status_code == 200:return response.json()else:raise Exception(f"請求失敗,狀態碼: {response.status_code}, 錯誤信息: {response.text}")except Exception as e:print(f"識別過程發生錯誤: {str(e)}")return {"error": str(e), "results": []}def recognize_text_from_dir(self, dir_path: str) -> Dict[str, Dict[str, Any]]:"""從目錄中的所有圖像文件識別文本Args:dir_path: 圖像目錄路徑Returns:包含所有圖像識別結果的字典"""if not os.path.isdir(dir_path):raise NotADirectoryError(f"不是有效目錄: {dir_path}")supported_extensions = {".jpg", ".jpeg", ".png", ".bmp", ".webp"}results = {}for filename in os.listdir(dir_path):ext = os.path.splitext(filename)[1].lower()if ext in supported_extensions:file_path = os.path.join(dir_path, filename)results[filename] = self.recognize_text(file_path)return resultsdef format_results(self, results: Dict[str, Any]) -> str:"""格式化識別結果為易讀的文本Args:results: 識別結果字典Returns:格式化后的文本"""formatted_text = ""if results["errorCode"] != 0:formatted_text += f"錯誤: {results['errorMsg']}\n"return formatted_textresult = results['result']['ocrResults'][0]for text in result['prunedResult']['rec_texts']:formatted_text += text + "\n"return formatted_text if formatted_text else "未檢測到文本"def main():parser = argparse.ArgumentParser(description="PaddleX OCR 服務客戶端")parser.add_argument("--host", default="localhost", help="OCR 服務主機")parser.add_argument("--port", type=int, default=8800, help="OCR 服務端口")parser.add_argument("--image", help="待識別的圖像文件路徑")parser.add_argument("--dir", help="待識別的圖像目錄路徑")parser.add_argument("--output", help="輸出結果的 JSON 文件路徑")parser.add_argument("--verbose", action="store_true", help="顯示詳細的識別結果")args = parser.parse_args()# 驗證輸入參數if not args.image and not args.dir:parser.error("請指定 --image 或 --dir 參數")if args.image and args.dir:parser.error("--image 和 --dir 參數不能同時使用")try:client = PaddleXOCRApiClient(args.host, args.port)if args.image:# 處理單張圖像results = client.recognize_text(args.image)if args.verbose:print(f"圖像: {args.image}")print(client.format_results(results))if args.output:with open(args.output, "w", encoding="utf-8") as f:json.dump(results, f, ensure_ascii=False, indent=2)print(f"結果已保存到: {args.output}")elif args.dir:# 處理目錄中的所有圖像all_results = client.recognize_text_from_dir(args.dir)if args.verbose:for filename, results in all_results.items():print(f"\n圖像: {filename}")print(client.format_results(results))if args.output:with open(args.output, "w", encoding="utf-8") as f:json.dump(all_results, f, ensure_ascii=False, indent=2)print(f"所有結果已保存到: {args.output}")except Exception as e:print(f"執行過程中發生錯誤: {str(e)}")if __name__ == "__main__":main()    

Test 圖片

在這里插入圖片描述

Test-Hand

在這里插入圖片描述

驗證

## 打印字體
python test.py --image test.jpg --verbose --output result.json
## 手寫字體
python test.py --image test-hand.jpg --verbose --output result.json

在這里插入圖片描述

??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91985.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

imx6ull-系統移植篇11——U-Boot 移植(下)

目錄 前言 移植過程 添加開發板默認配置文件 添加開發板對應的頭文件 添加開發板對應的板級文件夾 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 圖形界面配置文件 編譯 uboot LCD 驅動修改 修改源文件 修改頭文…

30天打牢數模基礎-模擬退火算法講解

二、完整Python代碼 import random import mathdef rastrigin(x, y):"""二維Rastrigin函數(目標函數,需最小化)參數:x: 自變量xy: 自變量y返回:函數值f(x,y)"""return 20 x**2 y**2 …

論文閱讀 - FastInst

文章目錄1 概述2 模型說明2.1 總體架構2.2 輕量pixel decoder2.3 實例激活引導的Query2.4 雙路徑更新策略2.5 GT掩碼引導學習2.6 損失函數3 效果1 概述 FastInst是一種基于query的實時實例分割方法,它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform(摁下鼠標左鍵的瞬間)二、移動點擊的物體(摁著鼠標左鍵不放)三、松開左鍵清理被移動對象屬性總結注:本文章只是學習總結的筆記,視頻鏈接 一、獲取到點擊物體的Tansfor…

UDP中的單播,多播,廣播(代碼實現)

文章目錄1. UDP 單播(Unicast)示例2. UDP 廣播(Broadcast)示例3. UDP 多播(Multicast)示例3.1 多播發送方示例3.2 多播接收方示例總結1. UDP 單播(Unicast)示例 發送方向指定單個目…

神經網絡:卷積層

神經網絡 卷積操作 例子: 輸入:二維圖像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷積核: [1,2,1] [0,1,0] [2,1,0] 然后需要將輸入圖像和卷積核轉化為4維張量 為什么轉為4維張量?因為卷積操作需要輸入圖像…

2.4 組件間通信Props(父傳子)

父組件 在父組件模板上的子組件上加上屬性值&#xff0c;屬性值就是想要傳遞給子組件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子組件 子組…

從零開始學習 Redux:React Native 項目中的狀態管理

Redux 是一個用于 JavaScript 應用程序的狀態管理庫&#xff0c;通常與 React 或 React Native 配合使用&#xff0c;幫助管理應用的狀態和數據流。其核心原理是通過集中式的“單一數據源”來管理應用狀態&#xff0c;避免組件之間的“層層傳遞”狀態和副作用。 Redux 的原理單…

[特殊字符] CentOS 7 離線安裝 MySQL 5.7 實驗

&#x1f427; CentOS 7 離線安裝 MySQL 5.7 實驗 針對企業無互聯網環境的系統&#xff0c;設計了如何在 CentOS 7 系統中&#xff0c;使用一臺可以聯網的主機&#xff08;NodeA&#xff09;為另一臺無法聯網的主機&#xff08;NodeB&#xff09;安裝 MySQL 5.7 數據庫及其依賴…

Redis 概率型數據結構實戰指南

1. 為什么要用「近似」&#xff1f; 隨著業務量爆發式增長&#xff0c;精確統計 的內存或 CPU 成本可能難以接受。例如&#xff1a; 統計一天內 唯一 IP 數 —— 用 SET 精確去重&#xff0c;百萬 IP→占用數百 MB。統計海量商品銷量、實時計算 P99 延遲、獲取 TOP-N 熱門頁面……

Android開發工程師:Linux一條find grep命令通關搜索內容與文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多關鍵詞搜索&#xff1a;使用正則表達式 pattern1|pattern2 同時搜索多個關鍵詞&#xff08;如 activity|class&#xff09;單…

深入理解瀏覽器解析機制和XSS向量編碼

URL 編碼 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------瀏覽器解析不了。 頁面識別在url解碼之前&#xff0c;在…

ThinkPHP8極簡上手指南:開啟高效開發之旅

目錄一、環境搭建1.1 安裝 PHP1.2 安裝 Composer二、安裝 ThinkPHP8三、目錄結構解析四、第一個簡單示例&#xff1a;Hello, ThinkPHP84.1 創建控制器4.2 編寫控制器方法4.3 配置路由4.4 訪問測試五、進階示例&#xff1a;數據庫查詢5.1 配置數據庫連接5.2 創建模型5.3 編寫查詢…

智能制造之物料詳解

在制造業業務系統中&#xff0c;物料流轉貫穿“需求→采購→入庫→生產→成品→交付”全流程&#xff0c;各系統通過數據協同實現物料狀態、位置、數量的精準追蹤。以下按流轉階段拆解&#xff1a;一、需求發起與計劃階段&#xff08;CRM/ERP/PLM主導&#xff09;1. 需求源頭…

Qt的安裝和環境配置

QT開發環境的搭建&#xff0c;需要安裝3個部分&#xff0c;C編譯器、Qt SDK(SDK是軟件開發工具包)、QT的集成開發環境(IDE)Qt的3種集成開發環境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要額外的配置&#xff0c;但是有一些bug…

解析MCUboot的實現原理和Image結構

目錄 概述 1 MCUboot的功能 1.1 代碼包結構 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交換 2.5 Image 尾部數據結構 3 交換區 3.1 單交換區 3.2 Multiple Image boot 3.3 Image交換 4 交換狀態&#xff08;swap statu…

YOLOv8目標檢測項目代碼詳解與習題

YOLOv8目標檢測項目代碼詳解與習題一、項目代碼詳解該代碼是基于 YOLOv8 和 OpenCV 實現的圖像目標檢測項目&#xff0c;核心功能是加載預訓練的 YOLOv8 模型&#xff0c;對指定圖像進行目標檢測&#xff0c;然后可視化檢測結果并保存或顯示。以下是逐行解析&#xff1a;# -*- …

gradle關于dependency-management的使用

1、相關文檔Spring官方文檔&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction倉庫版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 對接FreeSwitch

1.增加Maven依賴<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…