上一個教程: 如何執行自定義 OCR 模型
下一個教程: 基於 DNN 的人臉檢測與識別
| |
| 原始作者 | Wenqing Zhang |
| 相容性 | OpenCV >= 4.5 |
簡介
在本教程中,我們將詳細介紹 TextRecognitionModel 和 TextDetectionModel 中的 API。
TextRecognitionModel
在當前版本中,cv::dnn::TextRecognitionModel 僅支援基於 CNN+RNN+CTC 的演算法,並提供了 CTC 的貪婪解碼方法。更多資訊,請參考 原始論文
在識別之前,您應該 setVocabulary 和 setDecodeType。
- "CTC-greedy",文字識別模型的輸出應該是一個機率矩陣。形狀應該是
(T, B, Dim),其中
T 是序列長度
B 是批大小(推理中僅支援 B=1)
- 和
Dim 是詞彙表長度 +1(CTC 的 'Blank' 在 Dim 的索引 0 處)。
- "CTC-prefix-beam-search",文字識別模型的輸出應該是一個與 "CTC-greedy" 相同的機率矩陣。
- 該演算法在 Hannun 的 論文中提出。
setDecodeOptsCTCPrefixBeamSearch 可用於控制搜尋步驟中的波束大小。
- 為了進一步最佳化大型詞彙表,引入了一個新的選項
vocPruneSize,以避免迭代整個詞彙表,而只迭代機率最高的 vocPruneSize 個 token。
cv::dnn::TextRecognitionModel::recognize() 是文字識別的主要函式。
- 輸入影像應該是一個裁剪的文字影像或一個帶有
roiRects 的影像
- 未來可能會支援其他解碼方法
TextDetectionModel
cv::dnn::TextDetectionModel API 提供了以下文字檢測方法
在當前版本中,cv::dnn::TextDetectionModel 支援以下演算法
以下提供的預訓練模型是 DB 的變體(沒有可變形卷積),效能可以參考 論文 中的表 1。更多資訊,請參考 官方程式碼
您可以使用更多資料訓練自己的模型,並將其轉換為 ONNX 格式。我們鼓勵您向這些 API 新增新的演算法。
預訓練模型
TextRecognitionModel
crnn.onnx
url: https://drive.google.com/uc?export=dowload&id=1ooaLR-rkTl8jdpGy1DoQs0-X0lQsB6Fj
sha: 270d92c9ccb670ada2459a25977e8deeaf8380d3,
alphabet_36.txt: https://drive.google.com/uc?export=dowload&id=1oPOYx5rQRp8L6XQciUwmwhMCfX0KyO4b
引數設定:-rgb=0;
描述:該模型的分類數為 36 (0~9 + a~z)。
訓練資料集為 MJSynth。
crnn_cs.onnx
url: https://drive.google.com/uc?export=dowload&id=12diBsVJrS9ZEl6BNUiRp9s0xPALBS7kt
sha: a641e9c57a5147546f7a2dbea4fd322b47197cd5
alphabet_94.txt: https://drive.google.com/uc?export=dowload&id=1oKXxXKusquimp7XY1mFvj9nwLzldVgBR
引數設定:-rgb=1;
描述:該模型的分類數為 94 (0~9 + a~z + A~Z + 標點符號)。
訓練資料集為 MJsynth 和 SynthText。
crnn_cs_CN.onnx
url: https://drive.google.com/uc?export=dowload&id=1is4eYEUKH7HR7Gl37Sw4WPXx6Ir8oQEG
sha: 3940942b85761c7f240494cf662dcbf05dc00d14
alphabet_3944.txt: https://drive.google.com/uc?export=dowload&id=18IZUUdNzJ44heWTndDO6NNfIpJMmN-ul
引數設定:-rgb=1;
描述:該模型的分類數為 3944 (0~9 + a~z + A~Z + 漢字 + 特殊字元)。
訓練資料集為 ReCTS (https://rrc.cvc.uab.es/?ch=12)。
更多模型可以在 這裡 找到,這些模型來自 clovaai。您可以透過 CRNN 訓練更多模型,並透過 torch.onnx.export 轉換模型。
TextDetectionModel
- DB_IC15_resnet50.onnx
url: https://drive.google.com/uc?export=dowload&id=17_ABp79PlFt9yPCxSaarVc_DKTmrSGGf
sha: bef233c28947ef6ec8c663d20a2b326302421fa3
推薦引數設定:-inputHeight=736, -inputWidth=1280;
描述:該模型在 ICDAR2015 上訓練,因此只能檢測英文文字例項。
- DB_IC15_resnet18.onnx
url: https://drive.google.com/uc?export=dowload&id=1vY_KsDZZZb_svd5RT6pjyI8BS1nPbBSX
sha: 19543ce09b2efd35f49705c235cc46d0e22df30b
推薦引數設定:-inputHeight=736, -inputWidth=1280;
描述:該模型在 ICDAR2015 上訓練,因此只能檢測英文文字例項。
- DB_TD500_resnet50.onnx
url: https://drive.google.com/uc?export=dowload&id=19YWhArrNccaoSza0CfkXlA8im4-lAGsR
sha: 1b4dd21a6baa5e3523156776970895bd3db6960a
推薦引數設定:-inputHeight=736, -inputWidth=736;
描述:該模型在 MSRA-TD500 上訓練,因此可以檢測英文和中文文字例項。
- DB_TD500_resnet18.onnx
url: https://drive.google.com/uc?export=dowload&id=1sZszH3pEt8hliyBlTmB-iulxHP1dCQWV
sha: 8a3700bdc13e00336a815fc7afff5dcc1ce08546
推薦引數設定:-inputHeight=736, -inputWidth=736;
描述:該模型在 MSRA-TD500 上訓練,因此可以檢測英文和中文文字例項。
我們將在未來 這裡 釋出更多 DB 模型。
- EAST
下載連結:https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz?dl=1
該模型基於 https://github.com/argman/EAST
用於測試的影像
文字識別
url: https://drive.google.com/uc?export=dowload&id=1nMcEy68zDNpIlqAn6xCk_kYcUTIeSOtN
sha: 89205612ce8dd2251effa16609342b69bff67ca3
文字檢測
url: https://drive.google.com/uc?export=dowload&id=149tAhIcvfCYeyufRoZ9tmc2mZDKE_XrF
sha: ced3c03fb7f8d9608169a913acf7e7b93e07109b
文字識別示例
步驟 1. 載入具有詞彙表的影像和模型
int rgb = IMREAD_COLOR;
Mat image = imread("path/to/text_rec_test.png", rgb);
TextRecognitionModel model("path/to/crnn_cs.onnx");
model.setDecodeType("CTC-greedy");
std::ifstream vocFile;
vocFile.open("path/to/alphabet_94.txt");
String vocLine;
std::vector<String> vocabulary;
while (std::getline(vocFile, vocLine)) {
vocabulary.push_back(vocLine);
}
model.setVocabulary(vocabulary);
#define CV_Assert(expr)
在執行時檢查條件,如果失敗則丟擲異常。
定義 base.hpp:423
步驟 2. 設定引數
double scale = 1.0 / 127.5;
Scalar mean = Scalar(127.5, 127.5, 127.5);
Size inputSize = Size(100, 32);
model.setInputParams(scale, inputSize, mean);
步驟 3. 推理
std::string recognitionResult = recognizer.recognize(image);
std::cout << "'" << recognitionResult << "'" << std::endl;
輸入影像
圖片示例
輸出
文字檢測示例
步驟 1. 載入影像和模型
Mat frame = imread("/path/to/text_det_test.png");
步驟 2.a 設定引數 (DB)
TextDetectionModel_DB model("/path/to/DB_TD500_resnet50.onnx");
float binThresh = 0.3;
float polyThresh = 0.5;
uint maxCandidates = 200;
double unclipRatio = 2.0;
model.setBinaryThreshold(binThresh)
.setPolygonThreshold(polyThresh)
.setMaxCandidates(maxCandidates)
.setUnclipRatio(unclipRatio)
;
double scale = 1.0 / 255.0;
Scalar mean = Scalar(122.67891434, 116.66876762, 104.00698793);
Size inputSize = Size(736, 736);
model.setInputParams(scale, inputSize, mean);
uint32_t uint
定義 interface.h:42
步驟 2.b 設定引數 (EAST)
TextDetectionModel_EAST model("EAST.pb");
float confThreshold = 0.5;
float nmsThreshold = 0.4;
model.setConfidenceThreshold(confThresh)
.setNMSThreshold(nmsThresh)
;
double detScale = 1.0;
Size detInputSize = Size(320, 320);
Scalar detMean = Scalar(123.68, 116.78, 103.94);
bool swapRB = true;
model.setInputParams(detScale, detInputSize, detMean, swapRB);
步驟 3. 推理
std::vector<std::vector<Point>> detResults;
model.detect(detResults);
polylines(frame, results, true, Scalar(0, 255, 0), 2);
imshow("Text Detection", image);
cv::Mat::empty
輸出
圖片示例
文字定位示例
按照上述步驟操作後,很容易獲得輸入影像的檢測結果。然後,您可以進行變換和裁剪文字影像以進行識別。更多資訊,請參考 詳細示例
Mat cropped;
fourPointsTransform(recInput, vertices, cropped);
String recResult = recognizer.recognize(cropped);
輸出示例
圖片示例
圖片示例
原始碼
這些 API 的 原始碼 可以在 DNN 模組中找到。
詳細示例
更多資訊,請參考
使用影像進行測試
示例
example_dnn_scene_text_recognition -mp=path/to/crnn_cs.onnx -i=path/to/an/image -rgb=1 -vp=/path/to/alphabet_94.txt
example_dnn_scene_text_detection -mp=path/to/DB_TD500_resnet50.onnx -i=path/to/an/image -ih=736 -iw=736
example_dnn_scene_text_spotting -dmp=path/to/DB_IC15_resnet50.onnx -rmp=path/to/crnn_cs.onnx -i=path/to/an/image -iw=1280 -ih=736 -rgb=1 -vp=/path/to/alphabet_94.txt
example_dnn_text_detection -dmp=path/to/EAST.pb -rmp=path/to/crnn_cs.onnx -i=path/to/an/image -rgb=1 -vp=path/to/alphabet_94.txt
在公共資料集上進行測試
文字識別
測試影像的下載連結可以在 用於測試的影像 中找到
示例
example_dnn_scene_text_recognition -mp=path/to/crnn.onnx -e=true -edp=path/to/evaluation_data_rec -vp=/path/to/alphabet_36.txt -rgb=0
example_dnn_scene_text_recognition -mp=path/to/crnn_cs.onnx -e=true -edp=path/to/evaluation_data_rec -vp=/path/to/alphabet_94.txt -rgb=1
文字檢測
測試影像的下載連結可以在 用於測試的影像 中找到
示例
example_dnn_scene_text_detection -mp=path/to/DB_TD500_resnet50.onnx -e=true -edp=path/to/evaluation_data_det/TD500 -ih=736 -iw=736
example_dnn_scene_text_detection -mp=path/to/DB_IC15_resnet50.onnx -e=true -edp=path/to/evaluation_data_det/IC15 -ih=736 -iw=1280