目錄
- 簡介
- 模型訓練
-
- 步驟一:文本檢測模型(`detection`)
-
- 1.準備訓練資料集
- 2.下載下傳預訓練模型
-
- 模型介紹
- 下載下傳預訓練模型
- 3. 開始訓練
-
- 斷點訓練
- 4.模型評估
- 5.模型測試
- 6.訓練模型轉inference模型
- 步驟二:文本識别模型(`recognition`)
-
- 1.準備訓練資料集
-
- 資料下載下傳
- 資料集劃分
- 2.下載下傳預訓練模型
-
- 模型介紹
- 下載下傳預訓練模型
- 3.開始訓練
- 4.評估
- 5.測試
- 6.訓練模型轉inference模型
- 步驟三:文本角度分類模型
-
- 1.準備訓練資料集
-
- 資料集劃分
- 2.開始訓練
-
- 資料增強
- 訓練
- 3.評估
- 4.預測
- 5.訓練模型轉inference模型
- 步驟四:三模型聯合推理
- 五、放在最後:推理模型清單(V2.0,2021年1月20日更新)
-
- 一、文本檢測模型
- 二、文本識别模型
-
- 1. 中文識别模型
- 2. 英文識别模型
- 3. 多語言識别模型(更多語言持續更新中...)
-
- 1. 生成意大利語配置檔案測試現有模型
- 2. 生成意大利語配置檔案訓練自己的資料
- 三、文本方向分類模型
簡介
PaddleOCR
算法主要包含三個部分,分别是:
- DB文本檢測(
)detection
- 檢測框矯正(
)classification
- CRNN文本識别(
)recognition
在訓練時,這三個模型單獨進行訓練,得到三個模型的訓練權重,在推理預測時會把三個模型整合在一起,即
PaddleOCR
推理模型的最終結果是由上述三個模型串聯推理而得,推理步驟大緻如下:
- 第一步,進行文本檢測,得到文本位置的檢測框;
- 第二步,根據得到的文本檢測框對其進行角度分類;
- 第三步,進行文本識别。
模型訓練
步驟一:文本檢測模型( detection
)
detection
以文本檢測模型(
detection
)為例,進行訓練
1.準備訓練資料集
icdar2015
資料集可以從官網下載下傳到,首次下載下傳需注冊。
将下載下傳到的資料集解壓到工作目錄下,假設解壓在
PaddleOCR/train_data/
下。另外,
PaddleOCR
将零散的标注檔案整理成單獨的标注檔案,您可以通過
wget
的方式進行下載下傳。
# 在PaddleOCR路徑下
cd PaddleOCR/
wget -P ./train_data/ https://paddleocr.bj.bcebos.com/dataset/train_icdar2015_label.txt
wget -P ./train_data/ https://paddleocr.bj.bcebos.com/dataset/test_icdar2015_label.txt
PaddleOCR
也提供了資料格式轉換腳本(該腳本的目的就是将零散的标注檔案整理為一個單獨的檔案),可以将官網
label
轉換支援的資料格式。 資料轉換工具在
ppocr/utils/gen_label.py
, 這裡以訓練集為例:
# 将官網下載下傳的标簽檔案轉換為 train_icdar2015_label.txt
python gen_label.py --mode="det" --root_path="icdar_c4_train_imgs/" \
--input_path="ch4_training_localization_transcription_gt" \
--output_label="train_icdar2015_label.txt"
解壓資料集和下載下傳标注檔案後,
PaddleOCR/train_data/
有兩個檔案夾和兩個檔案,分别是:
/PaddleOCR/train_data/icdar2015/text_localization/
└─ icdar_c4_train_imgs/ icdar資料集的訓練資料
└─ ch4_test_images/ icdar資料集的測試資料
└─ train_icdar2015_label.txt icdar資料集的訓練标注
└─ test_icdar2015_label.txt icdar資料集的測試标注
提供的标注檔案格式如下,中間用"\t"分隔:
" 圖像檔案名 json.dumps編碼的圖像标注資訊"
ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
json.dumps
編碼前的圖像标注資訊是包含多個字典的
list
,字典中的
points
表示文本框的四個點的坐标(x, y),從左上角的點開始順時針排列。
transcription
表示目前文本框的文字,當其内容為“###”時,表示該文本框無效,在訓練時會跳過。
如果您想在其他資料集上訓練,可以按照上述形式建構标注檔案。
2.下載下傳預訓練模型
模型介紹
PaddleOCR
開源的文本檢測算法清單:
- DB(paper) [2](ppocr推薦)
- EAST(paper)[1]
- SAST(paper)[4]
在
ICDAR2015
文本檢測公開資料集上,算法效果如下:
模型 | 骨幹網絡 | precision | recall | Hmean | 下載下傳連結 |
---|---|---|---|---|---|
EAST | ResNet50_vd | 85.80% | 86.71% | 86.25% | 下載下傳連結 |
EAST | MobileNetV3 | 79.42% | 80.64% | 80.03% | 下載下傳連結 |
DB | ResNet50_vd | 86.41% | 78.72% | 82.38% | 下載下傳連結 |
DB | MobileNetV3 | 77.29% | 73.08% | 75.12% | 下載下傳連結 |
SAST | ResNet50_vd | 91.39% | 83.77% | 87.42% | 下載下傳連結 |
在
Total-text
文本檢測公開資料集上,算法效果如下:
模型 | 骨幹網絡 | precision | recall | Hmean | 下載下傳連結 |
---|---|---|---|---|---|
SAST | ResNet50_vd | 89.63% | 78.44% | 83.66% | 下載下傳連結 |
說明:
SAST
模型訓練額外加入了
icdar2013
、
icdar2017
、
COCO-Text
、
ArT
等公開資料集進行調優。
PaddleOCR
用到的經過整理格式的英文公開資料集下載下傳:百度雲位址 (提取碼: 2bpi)
下載下傳預訓練模型
PaddleOCR
的檢測模型目前支援兩種骨幹網絡,分别是
MobileNetV3
、
ResNet_vd
系列,您可以根據需求使用PaddleClas中的模型更換骨幹網絡。
cd PaddleOCR/
# 下載下傳MobileNetV3的預訓練模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x0_5_pretrained.tar
# 或,下載下傳ResNet18_vd的預訓練模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_vd_pretrained.tar
# 或,下載下傳ResNet50_vd的預訓練模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar
# 解壓預訓練模型檔案,以MobileNetV3為例
tar -xf ./pretrain_models/MobileNetV3_large_x0_5_pretrained.tar ./pretrain_models/
# 注:正确解壓backbone預訓練權重檔案後,檔案夾下包含衆多以網絡層命名的權重檔案,格式如下:
./pretrain_models/MobileNetV3_large_x0_5_pretrained/
└─ conv_last_bn_mean
└─ conv_last_bn_offset
└─ conv_last_bn_scale
└─ conv_last_bn_variance
└─ ......
3. 開始訓練
如果您安裝的是cpu版本,請将配置檔案中的
use_gpu
字段修改為
false
# 單機單卡訓練 mv3_db 模型
python tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./pretrain_models/MobileNetV3_large_x0_5_pretrained/
# 單機多卡訓練,通過 --gpus 參數設定使用的GPU ID;如果使用的paddle版本小于2.0rc1,請使用'--select_gpus'參數選擇要使用的GPU
python -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./pretrain_models/MobileNetV3_large_x0_5_pretrained/
上述指令中,通過
-c
選擇訓練使用
configs/det/det_db_mv3.yml
配置檔案。
有關配置檔案的詳細解釋,請參考連結。
您也可以通過
-o
參數在不需要修改
yml
檔案的情況下,改變訓練的參數,比如,調整訓練的學習率為
0.0001
斷點訓練
如果訓練程式中斷,如果希望加載訓練中斷的模型進而恢複訓練,可以通過指定
Global.checkpoints
指定要加載的模型路徑:
python tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./your/trained/model
注意:
Global.checkpoints
的優先級高于
Global.pretrain_weights
的優先級,即同時指定兩個參數時,優先加載
Global.checkpoints
指定的模型,如果
Global.checkpoints
指定的模型路徑有誤,會加載
Global.pretrain_weights
指定的模型。
4.模型評估
PaddleOCR
計算三個
OCR
檢測相關的名額,分别是:
Precision
、
Recall
、
Hmean
。
運作如下代碼,根據配置檔案
det_db_mv3.yml
中
save_res_path
指定的測試集檢測結果檔案,計算評估名額。
評估時設定後處理參數
box_thresh=0.5
,
unclip_ratio=1.5
,使用不同資料集、不同模型訓練,可調整這兩個參數進行優化
訓練中模型參數預設儲存在
Global.save_model_dir
目錄下。在評估名額時,需要設定
Global.checkpoints
指向儲存的參數檔案。
注:、
box_thresh
是
unclip_ratio
後處理所需要的參數,在評估
DB
模型時不需要設定
EAST
5.模型測試
測試單張圖像的檢測效果
python tools/infer_det.py -c configs/det/det_mv3_db.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false
測試
DB
模型時,調整後處理門檻值,
測試檔案夾下所有圖像的檢測效果
python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o Global.infer_img="./doc/imgs_en/" Global.pretrained_model="./output/det_db/best_accuracy" Global.load_static_weights=false
6.訓練模型轉inference模型
截止到目前,我們得到了文本檢測的訓練模型,并對其進行了測試,但這并不是最終的推理模型,需要進行轉換,以
MobileNetV3
為
backbone
訓練的
DB
算法為例,将訓練好的模型轉換成
inference
模型隻需要運作如下指令:
# -c 後面設定訓練算法的yml配置檔案
# -o 配置可選參數
# Global.pretrained_model 參數設定待轉換的訓練模型位址,不用添加檔案字尾 .pdmodel,.pdopt或.pdparams。
# Global.load_static_weights 參數需要設定為 False。
# Global.save_inference_dir參數設定轉換的模型将儲存的位址。
python3 tools/export_model.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_det_train/best_accuracy Global.load_static_weights=False Global.save_inference_dir=./inference/det_db/
步驟二:文本識别模型( recognition
)
recognition
1.準備訓練資料集
PaddleOCR
支援兩種資料格式:
-
用于訓練公開資料,調試算法;lmdb
-
訓練自己的資料:通用資料
資料下載下傳
訓練資料的預設存儲路徑是
PaddleOCR/train_data
,如果您的磁盤上已有資料集,
Windows
系統需要将資料集拷貝至對應位置,
Linux
隻需建立軟連結至資料集目錄:
ln -sf <path/to/dataset> <path/to/paddle_ocr>/train_data/dataset
若您本地沒有資料集,可以在官網下載下傳 icdar2015 資料,用于快速驗證。也可以參考DTRB,下載下傳
benchmark
所需的
lmdb
格式資料集。
資料集劃分
若您希望使用自己的資料進行訓練,請參考下文組織您的資料。
- 訓練集
首先請将訓練圖檔放入同一個檔案夾(
train_images
),并用一個
txt
檔案(
rec_gt_train.txt
)記錄圖檔路徑和标簽。
注意: 預設請将圖檔路徑和圖檔标簽用
\t
分割,如用其他方式分割将造成訓練報錯
" 圖像檔案名 圖像标注資訊 "
train_data/train_0001.jpg 簡單可依賴
train_data/train_0002.jpg 用科技讓複雜的世界更簡單
PaddleOCR
提供了一份用于訓練
icdar2015
資料集的标簽檔案,通過以下方式下載下傳:
# 訓練集标簽
wget -P ./train_data/ic15_data https://paddleocr.bj.bcebos.com/dataset/rec_gt_train.txt
# 測試集标簽
wget -P ./train_data/ic15_data https://paddleocr.bj.bcebos.com/dataset/rec_gt_test.txt
PaddleOCR
也提供了資料格式轉換腳本,可以将官網
label
轉換支援的資料格式。 資料轉換工具在
ppocr/utils/gen_label.py
, 這裡以訓練集為例:
# 将官網下載下傳的标簽檔案轉換為 rec_gt_label.txt
python gen_label.py --mode="rec" --input_path="{path/of/origin/label}" --output_label="rec_gt_label.txt"
最終訓練集應有如下檔案結構:
|-train_data
|-ic15_data
|- rec_gt_train.txt
|- train
|- word_001.png
|- word_002.jpg
|- word_003.jpg
| ...
- 測試集
同訓練集類似,測試集也需要提供一個包含所有圖檔的檔案夾(
test
)和一個
rec_gt_test.txt
,測試集的結構如下所示:
|-train_data
|-ic15_data
|- rec_gt_test.txt
|- test
|- word_001.jpg
|- word_002.jpg
|- word_003.jpg
| ...
- 字典
最後需要提供一個字典(
{word_dict_name}.txt
),使模型在訓練時,可以将所有出現的字元映射為字典的索引。
是以字典需要包含所有希望被正确識别的字元,
{word_dict_name}.txt
需要寫成如下格式,并以
utf-8
編碼格式儲存:
l
d
a
d
r
n
word_dict.txt
每行有一個單字,将字元與數字索引映射在一起,
“and”
将被映射成
[2 5 1]
ppocr/utils/ppocr_keys_v1.txt
是一個包含6623個字元的中文字典
ppocr/utils/ic15_dict.txt
是一個包含36個字元的英文字典
ppocr/utils/dict/french_dict.txt
是一個包含118個字元的法文字典
ppocr/utils/dict/japan_dict.txt
是一個包含4399個字元的日文字典
ppocr/utils/dict/korean_dict.txt
是一個包含3636個字元的韓文字典
ppocr/utils/dict/german_dict.txt
是一個包含131個字元的德文字典
ppocr/utils/dict/en_dict.txt
是一個包含63個字元的英文字典
您可以按需使用。
目前的多語言模型仍處在
demo
階段,會持續優化模型并補充語種,非常歡迎您為我們提供其他語言的字典和字型,如您願意可将字典檔案送出至 dict 将語料檔案送出至corpus,我們會在Repo中感謝您。
- 自定義字典
如需自定義dic檔案,請在
configs/rec/rec_icdar15_train.yml
中添加
character_dict_path
字段, 指向您的字典路徑。
并将
character_type
設定為
ch
。
- 添加空格類别
如果希望支援識别"空格"類别, 請将
yml
檔案中的
use_space_char
字段設定為
True
。
2.下載下傳預訓練模型
模型介紹
PaddleOCR
基于動态圖開源的文本識别算法清單:
- CRNN(paper)[7](ppocr推薦)
- Rosetta(paper)[10]
- STAR-Net(paper)[11]
- RARE(paper)[12] coming soon
- SRN(paper)[5] coming soon
參考[DTRB]3文字識别訓練和評估流程,使用
MJSynth
和
SynthText
兩個文字識别資料集訓練,在
IIIT
,
SVT
,
IC03
,
IC13
,
IC15
,
SVTP
,
CUTE
資料集上進行評估,算法效果如下:
模型 | 骨幹網絡 | Avg Accuracy | 模型存儲命名 | 下載下傳連結 |
---|---|---|---|---|
Rosetta | Resnet34_vd | 80.9% | rec_r34_vd_none_none_ctc | 下載下傳連結 |
Rosetta | MobileNetV3 | 78.05% | rec_mv3_none_none_ctc | 下載下傳連結 |
CRNN | Resnet34_vd | 82.76% | rec_r34_vd_none_bilstm_ctc | 下載下傳連結 |
CRNN | MobileNetV3 | 79.97% | rec_mv3_none_bilstm_ctc | 下載下傳連結 |
StarNet | Resnet34_vd | 84.44% | rec_r34_vd_tps_bilstm_ctc | 下載下傳連結 |
StarNet | MobileNetV3 | 81.42% | rec_mv3_tps_bilstm_ctc | 下載下傳連結 |
下載下傳預訓練模型
PaddleOCR
提供了訓練腳本、評估腳本和預測腳本,本節将以
CRNN
識别模型為例:
首先下載下傳預訓練模型,您可以下載下傳訓練好的模型在
icdar2015
資料上進行
finetune
cd PaddleOCR/
# 下載下傳MobileNetV3的預訓練模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar
# 解壓模型參數
cd pretrain_models
tar -xf rec_mv3_none_bilstm_ctc_v2.0_train.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_train.tar
3.開始訓練
如果您安裝的是cpu版本,請将配置檔案中的
use_gpu
字段修改為false
# GPU訓練 支援單卡,多卡訓練,通過--gpus參數指定卡号
# 訓練icdar15英文資料 訓練日志會自動儲存為 "{save_model_dir}" 下的train.log
python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/rec/rec_icdar15_train.yml
- 資料增強
PaddleOCR
提供了多種資料增強方式,如果您希望在訓練時加入擾動,請在配置檔案中設定
distort: true
。
預設的擾動方式有:顔色空間轉換(
cvtColor
)、模糊(
blur
)、抖動(
jitter
)、噪聲(
Gasuss noise
)、随機切割(
random crop
)、透視(
perspective
)、顔色反轉(
reverse
)。
訓練過程中每種擾動方式以50%的機率被選擇,具體代碼實作請參考:img_tools.py
由于OpenCV的相容性問題,擾動操作暫時隻支援Linux
- 訓練
PaddleOCR
支援訓練和評估交替進行, 可以在
configs/rec/rec_icdar15_train.yml
中修改
eval_batch_step
設定評估頻率,預設每500個
iter
評估一次。評估過程中預設将最佳
acc
模型,儲存為
output/rec_CRNN/best_accuracy
。
如果驗證集很大,測試将會比較耗時,建議減少評估次數,或訓練完再進行評估。
提示: 可通過
-c
參數選擇
configs/rec/
路徑下的多種模型配置進行訓練,
PaddleOCR
支援的識别算法有:
配置檔案 | 算法名稱 | backbone | trans | seq | pred |
---|---|---|---|---|---|
| CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc |
| CRNN | ResNet34_vd | None | BiLSTM | ctc |
| CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc |
| CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc |
| Rosetta | Mobilenet_v3 large 0.5 | None | None | ctc |
| CRNN | Resnet34_vd | None | BiLSTM | ctc |
| Rosetta | Resnet34_vd | None | None | ctc |
訓練中文資料,推薦使用
rec_chinese_lite_train_v2.0.yml
,如您希望嘗試其他算法在中文資料集上的效果,請參考下列說明修改配置檔案:
以
rec_chinese_lite_train_v2.0.yml
為例:
Global:
...
# 添加自定義字典,如修改字典請将路徑指向新字典
character_dict_path: ppocr/utils/ppocr_keys_v1.txt
# 修改字元類型
character_type: ch
...
# 識别空格
use_space_char: True
Optimizer:
...
# 添加學習率衰減政策
lr:
name: Cosine
learning_rate: 0.001
...
...
Train:
dataset:
# 資料集格式,支援LMDBDateSet以及SimpleDataSet
name: SimpleDataSet
# 資料集路徑
data_dir: ./train_data/
# 訓練集标簽檔案
label_file_list: ["./train_data/train_list.txt"]
transforms:
...
- RecResizeImg:
# 修改 image_shape 以适應長文本
image_shape: [3, 32, 320]
...
loader:
...
# 單卡訓練的batch_size
batch_size_per_card: 256
...
Eval:
dataset:
# 資料集格式,支援LMDBDateSet以及SimpleDataSet
name: SimpleDataSet
# 資料集路徑
data_dir: ./train_data
# 驗證集标簽檔案
label_file_list: ["./train_data/val_list.txt"]
transforms:
...
- RecResizeImg:
# 修改 image_shape 以适應長文本
image_shape: [3, 32, 320]
...
loader:
# 單卡驗證的batch_size
batch_size_per_card: 256
...
注意,預測/評估時的配置檔案請務必與訓練一緻。
4.評估
評估資料集可以通過
configs/rec/rec_icdar15_train.yml
修改
Eval
中的
label_file_path
設定。
# GPU 評估, Global.checkpoints 為待測權重
python -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy
5.測試
使用
PaddleOCR
訓練好的模型,可以通過以下腳本進行快速預測。
預設預測圖檔存儲在
infer_img
裡,通過
-o Global.checkpoints
指定權重:
# 預測英文結果
python3 tools/infer_rec.py -c configs/rec/rec_icdar15_train.yml -o Global.pretrained_model={path/to/weights}/best_accuracy Global.load_static_weights=false Global.infer_img=doc/imgs_words/en/word_1.png
預測使用的配置檔案必須與訓練一緻,如您通過
python3 tools/train.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml
完成了中文模型的訓練,您可以使用如下指令進行中文模型預測。
# 預測中文結果
python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model={path/to/weights}/best_accuracy Global.load_static_weights=false Global.infer_img=doc/imgs_words/ch/word_1.jpg
6.訓練模型轉inference模型
識别模型轉
inference
模型與檢測的方式相同,如下:
# -c 後面設定訓練算法的yml配置檔案
# -o 配置可選參數
# Global.pretrained_model 參數設定待轉換的訓練模型位址,不用添加檔案字尾 .pdmodel,.pdopt或.pdparams。
# Global.load_static_weights 參數需要設定為 False。
# Global.save_inference_dir參數設定轉換的模型将儲存的位址。
python3 tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_rec_train/best_accuracy Global.load_static_weights=False Global.save_inference_dir=./inference/rec_crnn/
注意:如果您是在自己的資料集上訓練的模型,并且調整了中文字元的字典檔案,請注意修改配置檔案中的
character_dict_path
是否是所需要的字典檔案。
轉換成功後,在目錄下有三個檔案:
/inference/rec_crnn/
├── inference.pdiparams # 識别inference模型的參數檔案
├── inference.pdiparams.info # 識别inference模型的參數資訊,可忽略
└── inference.pdmodel # 識别inference模型的program檔案
步驟三:文本角度分類模型
1.準備訓練資料集
請按如下步驟設定資料集:
訓練資料的預設存儲路徑是
PaddleOCR/train_data/cls
,如果您的磁盤上已有資料集,
Windows
系統需要将資料集拷貝至對應位置,
Linux
隻需建立軟連結至資料集目錄:
ln -sf <path/to/dataset> <path/to/paddle_ocr>/train_data/cls/dataset
資料集劃分
- 訓練集
首先請将訓練圖檔放入同一個檔案夾(
train_images
),并用一個
txt
檔案(
cls_gt_train.txt
)記錄圖檔路徑和标簽。
注意: 預設請将圖檔路徑和圖檔标簽用
\t
分割,如用其他方式分割将造成訓練報錯
和
180
分别表示圖檔的角度為
度和
180
度
" 圖像檔案名 圖像标注資訊 "
train/word_001.jpg 0
train/word_002.jpg 180
最終訓練集應有如下檔案結構:
|-train_data
|-cls
|- cls_gt_train.txt
|- train
|- word_001.png
|- word_002.jpg
|- word_003.jpg
| ...
- 測試集
同訓練集類似,測試集也需要提供一個包含所有圖檔的檔案夾(
train
)和一個
cls_gt_test.txt
,測試集的結構如下所示:
|-train_data
|-cls
|- cls_gt_test.txt
|- test
|- word_001.jpg
|- word_002.jpg
|- word_003.jpg
| ...
2.開始訓練
将準備好的
txt
檔案和圖檔檔案夾路徑分别寫入配置檔案的
Train/Eval.dataset.label_file_list
和
Train/Eval.dataset.data_dir
字段下,
Train/Eval.dataset.data_dir
字段下的路徑和檔案裡記載的圖檔名構成了圖檔的絕對路徑。
如果您安裝的是cpu版本,請将配置檔案中的
use_gpu
字段修改為false
# GPU訓練 支援單卡,多卡訓練,通過 '--gpus' 指定卡号,如果使用的paddle版本小于2.0rc1,請使用'--select_gpus'參數選擇要使用的GPU
# 啟動訓練,下面的指令已經寫入train.sh檔案中,隻需修改檔案裡的配置檔案路徑即可
python3 -m paddle.distributed.launch --gpus '0,1,2,3,4,5,6,7' tools/train.py -c configs/cls/cls_mv3.yml
資料增強
PaddleOCR
提供了多種資料增強方式,如果您希望在訓練時加入擾動,請在配置檔案中取消
Train.dataset.transforms
下的
RecAug
和
RandAugment
字段的注釋。
預設的擾動方式有:顔色空間轉換(
cvtColor
)、模糊(
blur
)、抖動(
jitter
)、噪聲(
Gasuss noise
)、随機切割(
random crop
)、透視(
perspective
)、顔色反轉(
reverse
),随機資料增強(
RandAugment
)。
訓練過程中除随機資料增強外每種擾動方式以50%的機率被選擇,具體代碼實作請參考:
rec_img_aug.py
randaugment.py
由于OpenCV的相容性問題,擾動操作暫時隻支援linux
訓練
PaddleOCR支援訓練和評估交替進行, 可以在
configs/cls/cls_mv3.yml
中修改
eval_batch_step
設定評估頻率,預設每1000個iter評估一次。訓練過程中将會儲存如下内容:
├── best_accuracy.pdopt # 最佳模型的優化器參數
├── best_accuracy.pdparams # 最佳模型的參數
├── best_accuracy.states # 最佳模型的名額和epoch等資訊
├── config.yml # 本次實驗的配置檔案
├── latest.pdopt # 最新模型的優化器參數
├── latest.pdparams # 最新模型的參數
├── latest.states # 最新模型的名額和epoch等資訊
└── train.log # 訓練日志
如果驗證集很大,測試将會比較耗時,建議減少評估次數,或訓練完再進行評估。
注意,預測/評估時的配置檔案請務必與訓練一緻。
3.評估
評估資料集可以通過修改
configs/cls/cls_mv3.yml
檔案裡的
Eval.dataset.label_file_list
字段設定。
export CUDA_VISIBLE_DEVICES=0
# GPU 評估, Global.checkpoints 為待測權重
python3 tools/eval.py -c configs/cls/cls_mv3.yml -o Global.checkpoints={path/to/weights}/best_accuracy
4.預測
使用 PaddleOCR 訓練好的模型,可以通過以下腳本進行快速預測。
通過
Global.infer_img
指定預測圖檔或檔案夾路徑,通過
Global.checkpoints
指定權重:
# 預測分類結果
python3 tools/infer_cls.py -c configs/cls/cls_mv3.yml -o Global.pretrained_model={path/to/weights}/best_accuracy Global.load_static_weights=false Global.infer_img=doc/imgs_words/ch/word_1.jpg
5.訓練模型轉inference模型
方向分類模型轉inference模型與檢測的方式相同,如下:
# -c 後面設定訓練算法的yml配置檔案
# -o 配置可選參數
# Global.pretrained_model 參數設定待轉換的訓練模型位址,不用添加檔案字尾 .pdmodel,.pdopt或.pdparams。
# Global.load_static_weights 參數需要設定為 False。
# Global.save_inference_dir參數設定轉換的模型将儲存的位址。
python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_cls_train/best_accuracy Global.load_static_weights=False Global.save_inference_dir=./inference/cls/
轉換成功後,在目錄下有三個檔案:
/inference/cls/
├── inference.pdiparams # 分類inference模型的參數檔案
├── inference.pdiparams.info # 分類inference模型的參數資訊,可忽略
└── inference.pdmodel # 分類inference模型的program檔案
步驟四:三模型聯合推理
以下代碼實作了文本檢測、方向分類器和文本識别串聯推理,在執行預測時,需要通過參數image_dir指定單張圖像或者圖像集合的路徑、參數
det_model_dir
指定檢測inference模型的路徑、參數
rec_model_dir
指定識别inference模型的路徑、參數
use_angle_cls
指定是否使用方向分類器、參數
cls_model_dir
指定方向分類器inference模型的路徑、參數
use_space_char
指定是否預測空格字元。可視化識别結果預設儲存到
./inference_results
檔案夾裡面。
# 預測image_dir指定的單張圖像
python tools/infer/predict_system.py --image_dir="./inference_img/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer" --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer" --use_angle_cls=True --use_space_char=True
# 預測image_dir指定的圖像集合
python tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True
# 如果想使用CPU進行預測,需設定use_gpu參數為False
python tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False
五、放在最後:推理模型清單(V2.0,2021年1月20日更新)
說明 :2.0版模型和1.1版模型的主要差別在于動态圖訓練vs.靜态圖訓練,模型性能上無明顯差距。
PaddleOCR提供的可下載下傳模型包括
推理模型
、
訓練模型
、
預訓練模型
、
slim模型
,模型差別說明如下:
模型類型 | 模型格式 | 簡介 |
---|---|---|
推理模型 | inference.pdmodel、inference.pdiparams | 用于python預測引擎推理,詳情 |
訓練模型、預訓練模型 | *.pdparams、*.pdopt、*.states | 訓練過程中儲存的模型的參數、優化器狀态和訓練中間資訊,多用于模型名額評估和恢複訓練 |
slim模型 | *.nb | 用于lite部署 |
一、文本檢測模型
模型名稱 | 模型簡介 | 配置檔案 | 推理模型大小 | 下載下傳位址 |
---|---|---|---|---|
ch_ppocr_mobile_slim_v2.0_det | slim裁剪版超輕量模型,支援中英文、多語種文本檢測 | ch_det_mv3_db_v2.0.yml | 推理模型 (coming soon) / 訓練模型 (coming soon) | |
ch_ppocr_mobile_v2.0_det | 原始超輕量模型,支援中英文、多語種文本檢測 | ch_det_mv3_db_v2.0.yml | 3M | 推理模型 / 訓練模型 |
ch_ppocr_server_v2.0_det | 通用模型,支援中英文、多語種文本檢測,比超輕量模型更大,但效果更好 | ch_det_res18_db_v2.0.yml | 47M | 推理模型 / 訓練模型 |
二、文本識别模型
1. 中文識别模型
模型名稱 | 模型簡介 | 配置檔案 | 推理模型大小 | 下載下傳位址 |
---|---|---|---|---|
ch_ppocr_mobile_slim_v2.0_rec | slim裁剪量化版超輕量模型,支援中英文、數字識别 | rec_chinese_lite_train_v2.0.yml | 推理模型 / 訓練模型 | |
ch_ppocr_mobile_v2.0_rec | 原始超輕量模型,支援中英文、數字識别 | rec_chinese_lite_train_v2.0.yml | 3.71M | 推理模型 / 訓練模型 / 預訓練模型 |
ch_ppocr_server_v2.0_rec | 通用模型,支援中英文、數字識别 | rec_chinese_common_train_v2.0.yml | 94.8M | 推理模型 / 訓練模型 / 預訓練模型 |
說明:
訓練模型
是基于預訓練模型在真實資料與豎排合成文本資料上finetune得到的模型,在真實應用場景中有着更好的表現,
預訓練模型
則是直接基于全量真實資料與合成資料訓練得到,更适合用于在自己的資料集上finetune。
2. 英文識别模型
模型名稱 | 模型簡介 | 配置檔案 | 推理模型大小 | 下載下傳位址 |
---|---|---|---|---|
en_number_mobile_slim_v2.0_rec | slim裁剪量化版超輕量模型,支援英文、數字識别 | rec_en_number_lite_train.yml | 推理模型 / 訓練模型 | |
en_number_mobile_v2.0_rec | 原始超輕量模型,支援英文、數字識别 | rec_en_number_lite_train.yml | 2.56M | 推理模型 / 訓練模型 |
3. 多語言識别模型(更多語言持續更新中…)
說明: 新增的多語言模型的配置檔案通過代碼方式生成,您可以通過
--help
參數檢視目前PaddleOCR支援生成哪些多語言的配置檔案:
# 該代碼需要在指定目錄運作
cd {your/path/}PaddleOCR/configs/rec/multi_language/
python3 generate_multi_language_configs.py --help
下面以生成意大利語配置檔案為例:
1. 生成意大利語配置檔案測試現有模型
如果您僅僅想用配置檔案測試PaddleOCR提供的多語言模型可以通過下面指令生成預設的配置檔案,使用PaddleOCR提供的小語種字典進行預測。
# 該代碼需要在指定目錄運作
cd {your/path/}PaddleOCR/configs/rec/multi_language/
# 通過-l或者--language參數設定需要生成的語種的配置檔案,該指令會将預設參數寫入配置檔案
python3 generate_multi_language_configs.py -l it
2. 生成意大利語配置檔案訓練自己的資料
如果您想訓練自己的小語種模型,可以準備好訓練集檔案、驗證集檔案、字典檔案和訓練資料路徑,這裡假設準備的意大利語的訓練集、驗證集、字典和訓練資料路徑為:
- 訓練集:{your/path/}PaddleOCR/train_data/train_list.txt
- 驗證集:{your/path/}PaddleOCR/train_data/val_list.txt
- 使用PaddleOCR提供的預設字典:{your/path/}PaddleOCR/ppocr/utils/dict/it_dict.txt
- 訓練資料路徑:{your/path/}PaddleOCR/train_data
使用以下指令生成配置檔案:
# 該代碼需要在指定目錄運作
cd {your/path/}PaddleOCR/configs/rec/multi_language/
# -l或者--language字段是必須的
# --train修改訓練集,--val修改驗證集,--data_dir修改資料集目錄,-o修改對應預設參數
# --dict指令改變字典路徑,示例使用預設字典路徑則該參數可不填
python3 generate_multi_language_configs.py -l it \
--train train_data/train_list.txt \
--val train_data/val_list.txt \
--data_dir train_data \
-o Global.use_gpu=False
模型名稱 | 模型簡介 | 配置檔案 | 推理模型大小 | 下載下傳位址 |
---|---|---|---|---|
french_mobile_v2.0_rec | 法文識别 | rec_french_lite_train.yml | 2.65M | 推理模型 / 訓練模型 |
german_mobile_v2.0_rec | 德文識别 | rec_german_lite_train.yml | 2.65M | 推理模型 / 訓練模型 |
korean_mobile_v2.0_rec | 韓文識别 | rec_korean_lite_train.yml | 3.9M | 推理模型 / 訓練模型 |
japan_mobile_v2.0_rec | 日文識别 | rec_japan_lite_train.yml | 4.23M | 推理模型 / 訓練模型 |
it_mobile_v2.0_rec | 意大利文識别 | rec_it_lite_train.yml | 2.53M | 推理模型 / 訓練模型 |
xi_mobile_v2.0_rec | 西班牙文識别 | rec_xi_lite_train.yml | 2.53M | 推理模型 / 訓練模型 |
pu_mobile_v2.0_rec | 葡萄牙文識别 | rec_pu_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
ru_mobile_v2.0_rec | 俄羅斯文識别 | rec_ru_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
ar_mobile_v2.0_rec | 阿拉伯文識别 | rec_ar_lite_train.yml | 2.53M | 推理模型 / 訓練模型 |
hi_mobile_v2.0_rec | 印地文識别 | rec_hi_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
chinese_cht_mobile_v2.0_rec | 中文繁體識别 | rec_chinese_cht_lite_train.yml | 5.63M | 推理模型 / 訓練模型 |
ug_mobile_v2.0_rec | 維吾爾文識别 | rec_ug_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
fa_mobile_v2.0_rec | 波斯文識别 | rec_fa_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
ur_mobile_v2.0_rec | 烏爾都文識别 | rec_ur_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
rs_mobile_v2.0_rec | 塞爾維亞文(latin)識别 | rec_rs_lite_train.yml | 2.53M | 推理模型 / 訓練模型 |
oc_mobile_v2.0_rec | 歐西坦文識别 | rec_oc_lite_train.yml | 2.53M | 推理模型 / 訓練模型 |
mr_mobile_v2.0_rec | 馬拉地文識别 | rec_mr_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
ne_mobile_v2.0_rec | 尼泊爾文識别 | rec_ne_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
rsc_mobile_v2.0_rec | 塞爾維亞文(cyrillic)識别 | rec_rsc_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
bg_mobile_v2.0_rec | 保加利亞文識别 | rec_bg_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
uk_mobile_v2.0_rec | 烏克蘭文識别 | rec_uk_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
be_mobile_v2.0_rec | 白俄羅斯文識别 | rec_be_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
te_mobile_v2.0_rec | 泰盧固文識别 | rec_te_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
ka_mobile_v2.0_rec | 卡納達文識别 | rec_ka_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
ta_mobile_v2.0_rec | 泰米爾文識别 | rec_ta_lite_train.yml | 2.63M | 推理模型 / 訓練模型 |
三、文本方向分類模型
模型名稱 | 模型簡介 | 配置檔案 | 推理模型大小 | 下載下傳位址 |
---|---|---|---|---|
ch_ppocr_mobile_slim_v2.0_cls | slim量化版模型 | cls_mv3.yml | 推理模型 / 訓練模型 | |
ch_ppocr_mobile_v2.0_cls | 原始模型 | cls_mv3.yml | 1.38M | 推理模型 / 訓練模型 |