????????最近做項目需要對印章進行識別,并提取其中的印章文字,又不希望這個模型太大,還要方便部署,于是乎這個模型是個不錯的選擇。
一、模型簡介
????????“Seal-Recognition”模型是PaddleX旗下的一款模型(PaddleX 是基于飛槳框架構建的低代碼開發工具,它集成了眾多開箱即用的預訓練模型,可以實現模型從訓練到推理的全流程開發,支持國內外多款主流硬件,助力AI 開發者進行產業實踐。模型豐富一鍵調用:將覆蓋文本圖像智能分析、OCR、目標檢測、時序預測等多個關鍵領域的 200+ 飛槳模型整合為 19 條模型產線,通過極簡的 Python API 一鍵調用,快速體驗模型效果。同時支持 20+ 單功能模塊,方便開發者進行模型組合使用)。印章文本識別是一種自動從文檔或圖像中提取和識別印章內容的技術。印章文本識別產線中包含版面區域分析模塊、印章印章文本檢測模塊和文本識別模塊。
二、模型安裝(本地)
? ? ? ? 1、推薦使用conda創建虛擬環境,python版本為3.8~3.10(因為paddleX的支持版本是這樣的),我的是3.10。
? ? ? ? 2、安裝paddlepaddle
????????這里給出地址:https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/docs/installation/paddlepaddle_install.md推薦使用GPU進行推理,不然可能會出現很多錯誤,下面給出pip安裝的指令。也可前往官網進行下載。
# cpu
python -m pip install paddlepaddle==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/# gpu,該命令僅適用于 CUDA 版本為 11.8 的機器環境
python -m pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/# gpu,該命令僅適用于 CUDA 版本為 12.3 的機器環境
python -m pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu123/
? ? ? ? 3、安裝paddleX
? ? ? ? 它提供了wheel包和插件安裝模式,由于需要模型推理與集成?,這里使用wheel包安裝。指令如下:(!!!請務必保證 PaddlePaddle 安裝成功,安裝成功后,方可安裝paddleX)
pip install https://paddle-model-ecology.bj.bcebos.com/paddlex/whl/paddlex-3.0.0b1-py3-none-any.whl
?三、模型使用
? ? ? ? 到這里,其實印章模型并沒有下載,需要我們創建pipeline后,會自動下載。只需要幾行即可完成推理。代碼如下:
from paddlex import create_pipelinepipeline = create_pipeline(pipeline="seal_recognition")output = pipeline.predict("seal_text_det.png")
for res in output:res.print() ## 打印預測的結構化輸出res.save_to_img("./output/") ## 保存可視化結果
?????????運行這段代碼,會自動下載該模型所需要的文件,會自動保存在C:\Users\XXXX\.paddlex目錄下,如果你不想下載到C盤,官方也給出了方式。例如,若您的配置文件保存在?./my_path/seal_recognition.yaml
?,則只需執行:
from paddlex import create_pipeline
pipeline = create_pipeline(pipeline="./my_path/seal_recognition.yaml")
output = pipeline.predict("seal_text_det.png")
for res in output:res.print() ## 打印預測的結構化輸出res.save_to_img("./output/") ## 保存可視化結果
? ? ? ? 他會自動下載所印章文本識別產線中包含版面區域分析模塊、印章印章文本檢測模塊和文本識別模塊。當然你可以根據自己的需求進行下載。給出官網:https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/docs/pipeline_usage/tutorials/ocr_pipelines/seal_recognition.md他的結果都是每個樣本的預測結果均為dict
類型,打印出來也是dict類型,針對于我的項目,我需要提取其中的文字信息,所以做了以下的代碼更改:
# 處理每個預測結果(代碼片段)for res in output:if 'ocr_result' in res:ocr_result = res['ocr_result']rec_text = ocr_result.get('rec_text', None) # 安全提取 `rec_text`if rec_text:total_num += 1# 判斷 `rec_text` 的類型if isinstance(rec_text, list):# 如果是列表,將列表中的元素拼接為一個字符串combined_text = ''.join(rec_text)seal_texts.append(combined_text)else:# 如果是單一字符串,直接添加seal_texts.append(rec_text)print(f"{filename}中的印章信息: {seal_texts[-1]}")
這樣會安全提取出文字,不過由于印章被文字遮擋的比較多,因此文字并不是這么的精確。
????????當然他的這個res.print()里面的ocr_result字段其實還包含了一個score,是用來給識別出來的印章進行一個評分,滿分為1 ,如果識別的文字不是很準確或者文字根本就沒有識別出來,可以查看這個得分來進行一個評判。比如我的page6就沒有被識別出文字,但是有socre。
? ? ? ? 如果對于預測的結果不太滿意,官方也給出了方案,可以自己進行微調。如果印章文本識別產線提供的默認模型權重在您的場景中,精度或速度不滿意,您可以嘗試利用您自己擁有的特定領域或應用場景的數據對現有模型進行進一步的微調,以提升印章文本識別產線的在您的場景中的識別效果。這里我沒有進行微調,如有需要,可以參照官網:PaddleX/docs/pipeline_usage/tutorials/ocr_pipelines/seal_recognition.md at release/3.0-beta1 · PaddlePaddle/PaddleX · GitHub
? ? ? ??