PaddleOCR文字檢測、標(biāo)注與識別詳細記錄

      網(wǎng)友投稿 1968 2025-03-31

      PP-OCR文字檢測與識別

      一、配置Paddle環(huán)境

      創(chuàng)建虛擬環(huán)境

      conda create --name pp python=3.7

      創(chuàng)建完成后激活環(huán)境

      conda activate pp

      登錄飛槳的官網(wǎng)下載最新的paddle,官網(wǎng)地址:飛槳PaddlePaddle-源于產(chǎn)業(yè)實踐的開源深度學(xué)習(xí)平臺

      選擇合適的CUDA版本,然后會在下面生成對應(yīng)的命令。

      然后,復(fù)制命令即可

      conda install paddlepaddle-gpu==2.2.2 cudatoolkit=11.2 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge

      二、配置PaddleOCR

      -:(https://gitee.com/paddlepaddle/PaddleOCR

      將其下載到本地,然后解壓配置環(huán)境。

      1、安裝python包

      1、yaml

      pip install pyyaml

      2、imgaug

      pip install imgaug

      3、pyclipper

      pip install pyclipper

      4、lmdb

      pip install lmdb

      5、Levenshtein

      pip install Levenshtein

      6、tqdm

      pip install tqdm

      2、測試環(huán)境

      模型列表

      選擇上面的一組模型放入到inference文件夾中,注意:是一組,包括:監(jiān)測模型、方向分類器、識別模型。如下:

      PaddleOCR-release-2.4 └─inference ├─ch_PP-OCRv2_det_infer #檢測模型 │ ├─inference.pdiparams │ ├─inference.pdiparams.info │ └─inference.pdmodel ├─ch_PP-OCRv2_rec_infer #識別模型 │ ├─inference.pdiparams │ ├─inference.pdiparams.info │ └─inference.pdmodel └─cls #方向分類器 ├─inference.pdiparams ├─inference.pdiparams.info └─inference.pdmodel

      將待檢測的圖片放在./doc/imgs/文件夾下面,然后執(zhí)行命令:

      python tools/infer/predict_system.py --image_dir="./doc/imgs/0.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=true

      然后在inference_results文件夾中查看結(jié)果,例如:

      如果能看到結(jié)果就說明環(huán)境是ok的。

      更多的命令,如下:

      # 使用方向分類器 python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=true # 不使用方向分類器 python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=false # 使用多進程 python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/ch_PP-OCRv2_det_infer/" --rec_model_dir="./inference/ch_PP-OCRv2_rec_infer/" --use_angle_cls=false --use_mp=True --total_process_num=6

      三、標(biāo)注工具PPOCRLabel

      PPOCRLabel是一款適用于OCR領(lǐng)域的半自動化圖形標(biāo)注工具,內(nèi)置PP-OCR模型對數(shù)據(jù)自動標(biāo)注和重新識別。使用Python3和PyQT5編寫,支持矩形框標(biāo)注和四點標(biāo)注模式,導(dǎo)出格式可直接用于PaddleOCR檢測和識別模型的訓(xùn)練。

      由于PaddleOCR已經(jīng)包含PPOCRLabel,可以直接運行,命令如下:

      cd ./PPOCRLabel # 切換到PPOCRLabel目錄 python PPOCRLabel.py --lang ch

      點擊自動標(biāo)注后就能看到自動標(biāo)注的結(jié)果,用戶根據(jù)自己的需求微調(diào)和修改,非常簡單。

      更多的方式和注意事項,詳見下面

      1. 安裝與運行

      1.1 安裝PaddlePaddle

      pip3 install --upgrade pip # 如果您的機器安裝的是CUDA9或CUDA10,請運行以下命令安裝 python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple # 如果您的機器是CPU,請運行以下命令安裝 python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

      更多的版本需求,請參照安裝文檔中的說明進行操作。

      1.2 安裝與運行PPOCRLabel

      PPOCRLabel可通過whl包與Python腳本兩種方式啟動,whl包形式啟動更加方便,python腳本啟動便于二次開發(fā)

      pip install PPOCRLabel # 安裝 PPOCRLabel --lang ch # 運行

      注意:通過whl包安裝PPOCRLabel會自動下載 paddleocr whl包,其中shapely依賴可能會出現(xiàn) [winRrror 126] 找不到指定模塊的問題。 的錯誤,建議從這里下載并安裝

      pip3 install PPOCRLabel pip3 install trash-cli PPOCRLabel --lang ch

      pip3 install PPOCRLabel pip3 install opencv-contrib-python-headless==4.2.0.32 # 如果下載過慢請?zhí)砑?-i https://mirror.baidu.com/pypi/simple" PPOCRLabel --lang ch # 啟動

      如果上述安裝出現(xiàn)問題,可以參考3.6節(jié) 錯誤提示

      cd PaddleOCR/PPOCRLabel python3 setup.py bdist_wheel pip3 install dist/PPOCRLabel-1.0.2-py2.py3-none-any.whl -i https://mirror.baidu.com/pypi/simple

      如果您對PPOCRLabel文件有所更改,通過Python腳本運行會更加方面的看到更改的結(jié)果

      cd ./PPOCRLabel # 切換到PPOCRLabel目錄 python PPOCRLabel.py --lang ch

      2. 使用

      2.1 操作步驟

      安裝與運行:使用上述命令安裝與運行程序。

      打開文件夾:在菜單欄點擊 “文件” - “打開目錄” 選擇待標(biāo)記圖片的文件夾[1].

      自動標(biāo)注:點擊 ”自動標(biāo)注“,使用PPOCR超輕量模型對圖片文件名前圖片狀態(tài)[2]為 “X” 的圖片進行自動標(biāo)注。

      手動標(biāo)注:點擊 “矩形標(biāo)注”(推薦直接在英文模式下點擊鍵盤中的 “W”),用戶可對當(dāng)前圖片中模型未檢出的部分進行手動繪制標(biāo)記框。點擊鍵盤Q,則使用四點標(biāo)注模式(或點擊“編輯” - “四點標(biāo)注”),用戶依次點擊4個點后,雙擊左鍵表示標(biāo)注完成。

      標(biāo)記框繪制完成后,用戶點擊 “確認”,檢測框會先被預(yù)分配一個 “待識別” 標(biāo)簽。

      重新識別:將圖片中的所有檢測畫繪制/調(diào)整完成后,點擊 “重新識別”,PPOCR模型會對當(dāng)前圖片中的所有檢測框重新識別[3]。

      內(nèi)容更改:雙擊識別結(jié)果,對不準(zhǔn)確的識別結(jié)果進行手動更改。

      確認標(biāo)記:點擊 “確認”,圖片狀態(tài)切換為 “√”,跳轉(zhuǎn)至下一張。

      刪除:點擊 “刪除圖像”,圖片將會被刪除至回收站。

      導(dǎo)出結(jié)果:用戶可以通過菜單中“文件-導(dǎo)出標(biāo)記結(jié)果”手動導(dǎo)出,同時也可以點擊“文件 - 自動導(dǎo)出標(biāo)記結(jié)果”開啟自動導(dǎo)出。手動確認過的標(biāo)記將會被存放在所打開圖片文件夾下的Label.txt中。在菜單欄點擊 “文件” - "導(dǎo)出識別結(jié)果"后,會將此類圖片的識別訓(xùn)練數(shù)據(jù)保存在crop_img文件夾下,識別標(biāo)簽保存在rec_gt.txt中[4]。

      2.2 注意

      [1] PPOCRLabel以文件夾為基本標(biāo)記單位,打開待標(biāo)記的圖片文件夾后,不會在窗口欄中顯示圖片,而是在點擊 “選擇文件夾” 之后直接將文件夾下的圖片導(dǎo)入到程序中。

      [2] 圖片狀態(tài)表示本張圖片用戶是否手動保存過,未手動保存過即為 “X”,手動保存過為 “√”。點擊 “自動標(biāo)注”按鈕后,PPOCRLabel不會對狀態(tài)為 “√” 的圖片重新標(biāo)注。

      [3] 點擊“重新識別”后,模型會對圖片中的識別結(jié)果進行覆蓋。因此如果在此之前手動更改過識別結(jié)果,有可能在重新識別后產(chǎn)生變動。

      [4] PPOCRLabel產(chǎn)生的文件放置于標(biāo)記圖片文件夾下,包括一下幾種,請勿手動更改其中內(nèi)容,否則會引起程序出現(xiàn)異常。

      3. 說明

      3.1 快捷鍵

      3.2 內(nèi)置模型

      默認模型:PPOCRLabel默認使用PaddleOCR中的中英文超輕量OCR模型,支持中英文與數(shù)字識別,多種語言檢測。

      模型語言切換:用戶可通過菜單欄中 “PaddleOCR” - “選擇模型” 切換內(nèi)置模型語言,目前支持的語言包括法文、德文、韓文、日文。具體模型下載鏈接可參考PaddleOCR模型列表.

      自定義模型:如果用戶想將內(nèi)置模型更換為自己的推理模型,可根據(jù)自定義模型代碼使用,通過修改PPOCRLabel.py中針對PaddleOCR類的實例化,通過修改PPOCRLabel.py中針對PaddleOCR類的實例化) 實現(xiàn),例如指定檢測模型:self.ocr = PaddleOCR(det=True, cls=True, use_gpu=gpu, lang=lang),在 det_model_dir 中傳入 自己的模型即可。

      3.3 導(dǎo)出標(biāo)記結(jié)果

      PPOCRLabel支持三種導(dǎo)出方式:

      自動導(dǎo)出:點擊“文件 - 自動導(dǎo)出標(biāo)記結(jié)果”后,用戶每確認過一張圖片,程序自動將標(biāo)記結(jié)果寫入Label.txt中。若未開啟此選項,則檢測到用戶手動確認過5張圖片后進行自動導(dǎo)出。

      默認情況下自動導(dǎo)出功能為關(guān)閉狀態(tài)

      手動導(dǎo)出:點擊“文件 - 導(dǎo)出標(biāo)記結(jié)果”手動導(dǎo)出標(biāo)記。

      關(guān)閉應(yīng)用程序?qū)С?/p>

      PaddleOCR文字檢測、標(biāo)注與識別詳細記錄

      3.4 導(dǎo)出部分識別結(jié)果

      針對部分難以識別的數(shù)據(jù),通過在識別結(jié)果的復(fù)選框中取消勾選相應(yīng)的標(biāo)記,其識別結(jié)果不會被導(dǎo)出。被取消勾選的識別結(jié)果在標(biāo)記文件 label.txt 中的 difficult 變量保存為 True 。

      注意:識別結(jié)果中的復(fù)選框狀態(tài)仍需用戶手動點擊確認后才能保留

      3.5 數(shù)據(jù)集劃分

      在終端中輸入以下命令執(zhí)行數(shù)據(jù)集劃分腳本:

      cd ./PPOCRLabel # 將目錄切換到PPOCRLabel文件夾下 python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ../train_data

      參數(shù)說明:

      trainValTestRatio 是訓(xùn)練集、驗證集、測試集的圖像數(shù)量劃分比例,根據(jù)實際情況設(shè)定,默認是6:2:2

      datasetRootPath 是PPOCRLabel標(biāo)注的完整數(shù)據(jù)集存放路徑。默認路徑是 PaddleOCR/train_data 分割數(shù)據(jù)集前應(yīng)有如下結(jié)構(gòu):

      |-train_data |-crop_img |- word_001_crop_0.png |- word_002_crop_0.jpg |- word_003_crop_0.jpg | ... | Label.txt | rec_gt.txt |- word_001.png |- word_002.jpg |- word_003.jpg | ...

      3.6 錯誤提示

      如果同時使用whl包安裝了paddleocr,其優(yōu)先級大于通過paddleocr.py調(diào)用PaddleOCR類,whl包未更新時會導(dǎo)致程序異常。

      PPOCRLabel不支持對中文文件名的圖片進行自動標(biāo)注。

      針對Linux用戶:如果您在打開軟件過程中出現(xiàn)**objc[XXXXX]**開頭的錯誤,證明您的opencv版本太高,建議安裝4.2版本:

      pip install opencv-python==4.2.0.32

      如果出現(xiàn) Missing string id 開頭的錯誤,需要重新編譯資源:

      pyrcc5 -o libs/resources.py resources.qrc

      如果出現(xiàn)module 'cv2' has no attribute 'INTER_NEAREST'錯誤,需要首先刪除所有opencv相關(guān)包,然后重新安裝4.2.0.32版本的headless opencv

      pip install opencv-contrib-python-headless==4.2.0.32

      四、訓(xùn)練檢測器

      完成數(shù)據(jù)的標(biāo)注就可以看是訓(xùn)練檢測器了。找到Lable.txt,將其中一部分放到train_label.txt ,將一部分放到test_label.txt,將圖片放到ppocr(這個文件夾的名字和標(biāo)注時的圖片文件夾的名字一致),如下:

      /PaddleOCR/train_data/icdar2015/text_localization/ └─ ppocr/ 圖片存放的位置 └─ train_label.txt icdar數(shù)據(jù)集的訓(xùn)練標(biāo)注 └─ test_label.txt icdar數(shù)據(jù)集的測試標(biāo)注

      如果路徑不存在,請手動創(chuàng)建。

      然后下載預(yù)訓(xùn)練模型,將其放到pretrain_models文件夾中,命令如下:

      # 根據(jù)backbone的不同選擇下載對應(yīng)的預(yù)訓(xùn)練模型 # 下載MobileNetV3的預(yù)訓(xùn)練模型 wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/MobileNetV3_large_x0_5_pretrained.pdparams # 或,下載ResNet18_vd的預(yù)訓(xùn)練模型 wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/ResNet18_vd_pretrained.pdparams # 或,下載ResNet50_vd的預(yù)訓(xùn)練模型 wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/pretrained/ResNet50_vd_ssld_pretrained.pdparams

      然后修改該config文件,路徑: configs/det/det_mv3_db.yml,打開文件對里面的參數(shù)進行修改該。

      按照自己定義的路徑,修改訓(xùn)練集的路徑。

      按照自己定義的路徑,修改驗證集的路徑。

      對BatchSize的修改。

      完成上面的工作就可以啟動訓(xùn)練了,在pycharm的Terminal中輸入命令:

      注意:在PaddleOCR的根目錄執(zhí)行命令。

      # 單機單卡訓(xùn)練 mv3_db 模型 python tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained

      更多的訓(xùn)練方式如下:

      # 單機單卡訓(xùn)練 mv3_db 模型 python3 tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained # 單機多卡訓(xùn)練,通過 --gpus 參數(shù)設(shè)置使用的GPU ID python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained # 多機多卡訓(xùn)練,通過 --ips 參數(shù)設(shè)置使用的機器IP地址,通過 --gpus 參數(shù)設(shè)置使用的GPU ID python3 -m paddle.distributed.launch --ips="xx.xx.xx.xx,xx.xx.xx.xx" --gpus '0,1,2,3' tools/train.py -c configs/det/det_mv3_db.yml \ -o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained

      五、訓(xùn)練識別器

      圖片裁剪與數(shù)據(jù)集生成

      在訓(xùn)練識別器之間,我們還有一步要做,就是將標(biāo)注的數(shù)據(jù)裁剪出來。裁剪代碼如下:

      import json import os import numpy as np import cv2 def get_rotate_crop_image(img, points): ''' img_height, img_width = img.shape[0:2] left = int(np.min(points[:, 0])) right = int(np.max(points[:, 0])) top = int(np.min(points[:, 1])) bottom = int(np.max(points[:, 1])) img_crop = img[top:bottom, left:right, :].copy() points[:, 0] = points[:, 0] - left points[:, 1] = points[:, 1] - top ''' assert len(points) == 4, "shape of points must be 4*2" # 求范數(shù),得到寬度 img_crop_width = int( max( np.linalg.norm(points[0] - points[1]), np.linalg.norm(points[2] - points[3]))) # # 求范數(shù),得到高度 img_crop_height = int( max( np.linalg.norm(points[0] - points[3]), np.linalg.norm(points[1] - points[2]))) pts_std = np.float32([[0, 0], [img_crop_width, 0], [img_crop_width, img_crop_height], [0, img_crop_height]]) #計算得到轉(zhuǎn)換矩陣 M = cv2.getPerspectiveTransform(points, pts_std) #實現(xiàn)透視變換 dst_img = cv2.warpPerspective( img, M, (img_crop_width, img_crop_height), borderMode=cv2.BORDER_REPLICATE, flags=cv2.INTER_CUBIC) dst_img_height, dst_img_width = dst_img.shape[0:2] if dst_img_height * 1.0 / dst_img_width >= 1.5: dst_img = np.rot90(dst_img) return dst_img def write_txt_img(src_path,label_txt): with open(src_path, 'r', encoding='utf-8') as f: for line in f.readlines(): print(line) content = line.split('\t') print(content[0]) imag_name = content[0].split('/')[1] image_path = './train_data/icdar2015/text_localization/' + content[0] img = cv2.imread(image_path) list_dict = json.loads(content[1]) nsize = len(list_dict) print(nsize) num = 0 for i in range(nsize): print(list_dict[i]) lin = list_dict[i] info = lin['transcription'] info=info.replace(" ","") points = lin['points'] points = [list(x) for x in points] points = np.float32([list(map(float, item)) for item in points]) imag_name=str(num)+"_"+imag_name save_path = './train_data/rec/train/' + imag_name dst_img = get_rotate_crop_image(img, points) cv2.imwrite(save_path, dst_img) label_txt.write('train/'+imag_name+'\t'+info+'\n') num=num+1 if not os.path.exists('train_data/rec/train/'): os.makedirs('train_data/rec/train/') src_path = r"./train_data/icdar2015/text_localization/train_icdar2015_label.txt" label_txt=r"./train_data/rec/rec_gt_train.txt" src_test_path = r"./train_data/icdar2015/text_localization/test_icdar2015_label.txt" label_test_txt=r"./train_data/rec/rec_gt_test.txt" with open(label_txt, 'w') as w_label: write_txt_img(src_path,w_label) with open(label_test_txt, 'w') as w_label: write_txt_img(src_test_path, w_label)

      獲取標(biāo)注區(qū)域的圖像主要用到了getPerspectiveTransform計算轉(zhuǎn)換的矩陣和warpPerspective函數(shù)透視轉(zhuǎn)換的組合。

      獲取到圖像和標(biāo)注的內(nèi)容,生成文字識別通用數(shù)據(jù)集(SimpleDataSet)。

      數(shù)據(jù)集的格式:

      注意: txt文件中默認請將圖片路徑和圖片標(biāo)簽用 \t 分割,如用其他方式分割將造成訓(xùn)練報錯。

      " 圖像文件名 圖像標(biāo)注信息 " train/word_001.jpg 簡單可依賴 train/word_002.jpg 用科技讓復(fù)雜的世界更簡單

      生成數(shù)據(jù)集的路徑如下:

      修改配置文件,在configs/rec/中,用rec_icdar15_train.yml 舉例:

      設(shè)置訓(xùn)練集的路徑。

      設(shè)置驗證集的路徑。

      調(diào)整訓(xùn)練集和驗證集的圖片尺寸

      設(shè)置訓(xùn)練和驗證的batchsize。

      完成上面的參數(shù)的設(shè)置,然后開始訓(xùn)練,命令如下:

      python tools/train.py -c configs/rec/rec_icdar15_train.yml

      機器學(xué)習(xí)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Python大規(guī)模機器學(xué)習(xí)》—1 邁向可擴展性的第一步
      下一篇:兩臺電腦同時使用一個wps表格 雙方同時操作和改動同一個表格頁面的時候 一方改動完成保存后(wps兩個表格在一個界面)
      相關(guān)文章
      亚洲精品NV久久久久久久久久| 国产精品亚洲lv粉色| 国产成人精品曰本亚洲79ren| 亚洲一本一道一区二区三区| 亚洲xxxx18| 国产成人精品亚洲日本在线| 亚洲大尺码专区影院| 亚洲国产高清美女在线观看| 亚洲精品福利网站| 亚洲理论片中文字幕电影| 亚洲欧洲自拍拍偷午夜色| 亚洲欧洲久久精品| 亚洲人成电影在线观看青青| 亚洲午夜电影在线观看| 亚洲av永久综合在线观看尤物| 亚洲另类自拍丝袜第1页| 亚洲午夜在线播放| 亚洲色大成网站WWW国产| 亚洲av无码专区首页| 国产成人精品亚洲一区| 亚洲va中文字幕无码| 亚洲高清最新av网站| 国产成人毛片亚洲精品| 亚洲欧洲∨国产一区二区三区| 久久91亚洲人成电影网站| 久久99国产亚洲精品观看| 亚洲自偷自拍另类12p| 亚洲日本在线观看网址| 亚洲影视自拍揄拍愉拍| 亚洲欧美国产精品专区久久| 久久亚洲AV成人无码国产最大| 亚洲免费在线观看| 亚洲精品无码专区在线在线播放 | 亚洲伊人久久大香线蕉AV| 亚洲色无码专区一区| 国产亚洲人成在线播放| AV在线亚洲男人的天堂| 亚洲av无码一区二区乱子伦as| 亚洲精品456在线播放| 中文字幕在线观看亚洲日韩| 国产精品亚洲综合一区在线观看|