基于PaddleOCR实现车牌识别
基于PaddleOCR的車牌識別
- 1.方案設計
- 2.數據處理
- 2.1 車牌數據集介紹
- 2.2 數據預處理
- 3.PaddleOCR模型介紹
- 3.1 Paddle OCR算法列表
- 3.2 安裝PaddleOCR
- 3.3 下載預訓練模型
- 4.模型訓練
- 4.1 訓練檢測模型
- 4.2 CPU?GPU?
- 4.3 訓練識別模型
- GPU訓練 支持單卡,多卡訓練
- 4.4 問題及解決方案
- 5.模型的評估
- 6.模型導出
- 7.模型推理
- 結果圖
1.方案設計
車牌識別車牌識別就是使用OCR(Optical Character Recognition,光學字符識別)技術識別各類機動車車牌信息。目前,車牌識別已廣泛應用在停車場、收費站、道路等交通設施中,提供高效便捷的車輛管理服務。OCR通常包含文本檢測和文本識別兩個子任務:
1.文字檢測: 檢測圖片中的文字位置
2. 文字識別: 對文字區(qū)域中的文字進行識別。
使用OCR來識別車牌流程如 圖1 所示,首先檢測出車牌的位置(下圖紅色框區(qū)域)、然后對檢測出來的車牌進行識別,即可得到右邊的可編輯文本:
圖1 車牌識別
我們使用飛槳PaddleOCR實現車牌識別,接下來就一起來看看實現原理及具體實現步驟吧~
2.數據處理
2.1 車牌數據集介紹
CCPD車牌數據集來源于Git里面。鏈接:https://github.com/detectRecog/CCPD
是采集人員在合肥停車場采集、手工標注得來,采集時間在早7:30到晚10:00之間。且拍攝車牌照片的環(huán)境復雜多變,包括雨天、雪天、傾斜、模糊等。CCPD數據集包含將近30萬張圖片、圖片尺寸為720x1160x3,共包含8種類型圖片,每種類型、數量及類型說明如下表:
| ccpd_base | 正常車牌 |
| ccpd_db | 光線較暗或較亮 |
| ccpd_challenge | 比較有挑戰(zhàn)性的車牌 |
| ccpd_fn | 距離攝像頭較遠或較近 |
| ccpd_np | 沒上牌的新車 |
| ccpd_rotate | 水平傾斜20%-50%, 垂直傾斜-10%-10% |
| ccpd_tilt | 水平傾斜15%-45%,垂直傾斜15%-45% |
| ccpd_weather | 雨天、雪天或者霧天的車牌 |
CCPD數據集中每張圖像的名稱包含了標注信息,例如圖片名稱為"025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg",每個名稱可以通過分隔符’-'分為幾部分,每部分解釋:
- 1.025:車牌區(qū)域占整個畫面的比例;
- 2.95_113: 車牌水平和垂直角度, 水平95°, 豎直113°
- 3.154&383_386&473:標注框左上、右下坐標,左上(154, 383), 右下(386, 473)
- 4.386&473_177&454_154&383_363&402:標注框四個角點坐標,順序為右下、左下、左上、右上
- 5.0_0_22_27_27_33_16:車牌號碼映射關系如下: 第一個0為省份 對應省份字典provinces中的’皖’,;第二個0是該車所在地的地市一級代碼,對應地市一級代碼字典alphabets的’A’;后5位為字母和文字, 查看車牌號ads字典,如22為Y,27為3,33為9,16為S,最終車牌號碼為皖AY339S
本實驗我們只使用正常車牌即ccpd_base的數據進行訓練。
2.2 數據預處理
1.先在項目下創(chuàng)建dataset文件夾
. …命令:mkdir dataset
2.解壓ccpd數據集壓縮包 并放到dataset文件夾下
…命令:unzip -q data/CCPD2019.zip -d dataset/CCPD
3.項目結構樹如同:
- dataset:解壓后放在dataset文件數據里
- log:訓練記錄
- output訓練后的輸出模型
- Paddle OCR:文字識別模型
- CCPD_test1.py :數據預處理的代碼
3.將CCPD的數據格式轉換PaddleOCR檢測所需格式,創(chuàng)建CCPD_test1.py代碼如下:
import os import os.path as osp import cv2 #創(chuàng)建字典列表 ads = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X','Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']provinces = ["皖", "滬", "津", "渝", "冀", "晉", "蒙", "遼", "吉", "黑", "蘇", "浙", "京", "閩", "贛", "魯", "豫", "鄂", "湘", "粵", "桂", "瓊", "川", "貴", "云", "藏", "陜", "甘", "青", "寧", "新"]該代碼主要是創(chuàng)建字典列表
#轉換檢測數據 #獲取原圖片的路徑+圖片標注信息 train_det = open('dataset/train_det.txt', 'w', encoding='UTF-8') dev_det = open('dataset/dev_det.txt', 'w', encoding='UTF-8')#轉換識別數據 #獲取截取車牌圖片的路徑文件+提取車牌文字的信息 train_rec = open('dataset/train_rec.txt', 'w', encoding='UTF-8') dev_rec = open('dataset/dev_rec.txt', 'w', encoding='UTF-8')if not osp.exists('dataset/img'):os.mkdir("dataset/img")該代碼主要是創(chuàng)建檢測數據的train和val的txt文件與識別數據的train和val的文件。
- train_det和dev_det劃分8:2 是獲取原圖片的路徑+圖片被標注信息。比如:dataset/CCPD/ccpd_db/0462-1_13-212&516_542&633-542&633_236&627_212&516_518&522-0_0_26_32_19_24_29-198-116.jpg [{“transcription”:“皖A28V05”, “points”:[[212, 516], [518, 522], [542, 633], [236, 627]]}]
- train_rec和dev_rec劃分8:2 ,是獲取已經截取出車牌圖片的路徑+提取車牌文字的信息;比如:dataset/img/000536.jpg 皖A28V05
- dataset/img:是用來保存截取車牌的圖片。
運行命令:python CCPD_test1.py后,項目結構里多了五個文件。如圖下:
我來給大家詳細介紹一下:
- img文件夾:是保存截取車牌得圖片。如同下:
- train_det,dev_det文件:保存原始圖片得路徑和標注格式信息。如圖下:
- train_rec,dev_rec文件:是保存img文件夾下得截取車牌圖片得路徑和車牌文字信息。如圖下:
- dic.txt文件:是保存字典列表信息:如圖下:
-
3.PaddleOCR模型介紹
3.1 Paddle OCR算法列表
PaddleOCR中提供了如下文本檢測算法和文本識別算法列表,以及每個算法在英文公開數據集上的模型和指標,主要用于算法簡介和算法性能對比。
文本檢測算法:
文本識別算法:
考慮車牌識別中字符數量較少,而且長度也固定,且為標準的印刷字體,所以無需使用過于復雜的模型。我們選擇DBNet檢測算法和CRNN識別模型作,PaddleOCR的檢測模型目前支持兩種backbone,分別是MobileNetV3、ResNet_vd系列,本實驗兩個模型均使用MobileNetV3作為其主干網絡(Backbone)。
3.2 安裝PaddleOCR
- 1.安裝命令:git clone clone https://github.com/PaddlePaddle/PaddleOCR
如果因為忘了問題無法pull成功,可以選用碼云上的托管即可:
git clone !git clone https://gitee.com/paddlepaddle/PaddleOCR - 2.安裝依賴
pip install -r PaddleOCR/requirements.txt 下載并安裝
3.3 下載預訓練模型
- 1.下載mobileNetv3的檢測預訓練模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_5_pretrained.pdparams - 2.下載MobileNetV3.識別預訓練模型
!wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar - 3.解壓識別預訓練模型壓縮文件
tar -xvf pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train.tar - 4.刪掉壓縮文件(以免占空間)
rm -rf pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train.tar
4.模型訓練
4.1 訓練檢測模型
1.首先我們在configs/det/det_mv3_db.yml 文件中Train和Eval數據集得圖片路徑“data_dir"和標簽路徑”label_file_list".我自己修下是:
4.2 CPU?GPU?
如果你安裝的是paddle-cpu版本,或者沒有gpu顯卡的話,需要將det_mv3_db.yml配置文件中的use_gpu字段修改為false.
-
如果你只有一個gpu顯卡的話,單機單卡訓練可以輸入命令: python tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained
-
如果你是土豪又很多gpu的話,單機多卡訓練,需要通過–gpus 參數設置使用的gpu ID。輸入命令: python -m paddle.distributed.launch --gpus ‘0,1,2,3’ tools/train.py -c configs/det/det_mv3_db.yml
上述指令中,通過-c 選擇訓練使用configs/det/det_db_mv3.yml配置文件。 有關配置文件的詳細解釋,請參考鏈接。您也可以通過-o參數在不需要修改yml文件的情況下,改變訓練的參數,比如,調整訓練的學習率為0.0001python tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001
-o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained
4.3 訓練識別模型
如果您是在自己的數據集上訓練的模型,并且調整了中文字符的字典文件,請注意修改配置文件configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml中的character_dict_path是否是所需要的字典文件。同時修改Train和Eval的圖片路徑data_dir和標簽路徑label_file_list。
同檢測模型,如果您安裝的是cpu版本,請將配置文件中的 use_gpu 字段修改為false
GPU訓練 支持單卡,多卡訓練
#單卡訓練(訓練周期長,不建議)
python tools/train.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml
#多卡訓練,通過–gpus參數指定卡號
python -m paddle.distributed.launch --gpus ‘0,1,2,3’ tools/train.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml
4.4 問題及解決方案
**1.**遇到問題:Config use_gpu cannot be set as true while you are using paddlepaddle cpu version !
解決方案:修改rec_chinese_lite_train_v2.0.yml 的use_gpu 字段為false
**2.**遇到問題:.No Images in train dataset, please ensure
解決方案:1.標注工具識別結果沒有內容, 2.修改batch_size_per_card字段
3.遇到問題:ABORT!!! Out of all 4 trainers, the trainer process with rank=[0, 1, 2, 3] was aborted. Please check its log.
**解決方案:**1.選用單卡訓練。2.在代碼里加一行:paddle.set_device(“gpu”)
5.模型的評估
當文字檢測模型和文字識別模型訓練完成后需要查看評估結果。可以執(zhí)行下面的代碼進行評估:
1.輸入命令并執(zhí)行(這是文字檢測模型的評估代碼):
2.文字檢測模型的評估結果如下:
- 同理,文字識別模型的評估代碼可以自己執(zhí)行
3.從上面的結果可以看出,精準度:92%,召回率96%,hmean:94%,fps:24
hmean是一個綜合指標,從先的表達式可以看出其值介與精度和召回率自己,其表達式為:
6.模型導出
將訓練好 的模型轉換成inference模型需要運行如下命令:
# 導出檢測模型 python PaddleOCR/tools/export_model.py -c PaddleOCR/configs/det/det_mv3_db.yml -o Global.pretrained_model=output/db_mv3/best_accuracy Global.save_inference_dir=inference/db_mv3/ # 導出識別模型 python PaddleOCR/tools/export_model.py -c PaddleOCR/configs/det/det_mv3_db.yml -o Global.pretrained_model=output/db_mv3/best_accuracy Global.save_inference_dir=inference/db_mv3/生成inference文件,如圖下:
其中:-c后面設置訓練算法的yml配置文件-o配置可選參數Global.pretrained_model 參數設置待轉換的訓練模型地址,不用天津文件后綴。pdmodel,.pdopt或者。pdparams即可Global.save_inference_dir參數設置轉換模型保存的地址轉inference模型時,使用的配置文件和訓練時使用的配置文件相同。另外,還需要設置配置文件中的Global.pretrained_model參數,其指向訓練中保存的模型參數文件。 轉換成功后,在模型保存目錄下有三個文件:
/inference/*/
├── inference.pdiparams # inference模型的參數文件
├── inference.pdiparams.info # inference模型的參數信息,可忽略
└── inference.pdmodel # inference模型的program文件
7.模型推理
在執(zhí)行預測時,需要通過參數image_dir指定單張圖像或者圖像集合的路徑、參數det_model_dir,cls_model_dir和rec_model_dir分別指定檢測,方向分類和識別的inference模型路徑。參數use_angle_cls用于控制是否啟用方向分類模型。如果訓練時修改了文本的字典,在使用inference模型預測時,需要通過**–rec_char_dict_path**指定使用的字典路徑,并且設置 rec_char_type=ch。可視化識別結果默認保存到 ./inference_results 文件夾里面。
python3 tools/infer/predict_system.py \--image_dir="./doc/imgs/00018069.jpg" \ #要預測圖片的路徑--det_model_dir="./inference/db_mv3/" \ #加入檢測模型參數的路徑--rec_model_dir="./inference/rec_chinese_lite_v2.0/" \ #加入識別模型參數的路徑--rec_char_dict_path="../dict.txt" \ #加入字典列表的路徑--rec_char_type=ch \ #設置中文或者en--use_angle_cls=false \--output=../output/table \--vis_font_path=./doc/fonts/simfang.ttf #加入字體結果圖
創(chuàng)作不易,求關注和點贊!!
我是一名聽力障礙人士,熱愛學習熱愛健身,想學習怎么健身的歡迎關注哈。有圖有真相!!!
總結
以上是生活随笔為你收集整理的基于PaddleOCR实现车牌识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python车牌识别使用训练集_Tens
- 下一篇: [MATLAB]基本介绍