上一篇教程: 如何运行自定义 OCR 模型
下一篇教程: 基于 DNN 的人脸检测和识别
简介
在本教程中,我们将详细介绍 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
可用于在搜索步骤中控制 beam 大小。
- 为了进一步针对大型词汇表进行优化,引入了一个新选项
vocPruneSize
,以避免迭代整个词汇表,而仅仅迭代具有最高概率的 vocPruneSize
个标记。
cv::dnn::TextRecognitionModel::recognize() 是文本识别的主要函数。
- 输入图像应为裁剪的文本图像或具有
roiRects
的图像
- 其他解码方法将来可能会受到支持
TextDetectionModel
cv::dnn::TextDetectionModel API 为文本检测提供了这些方法
在当前版本中,cv::dnn::TextDetectionModel 支持以下算法
以下提供的预训练模型是 DB 的变体(不带可变形卷积),其性能参考 论文 中的表 1。更多信息,请参阅 官方代码
您可以使用更多的数据训练自己的模型,然后将其转换为 ONNX 格式。我们鼓励您向这些 API 添加新的算法。
预训练模型
TextRecognitionModel
crnn.onnx
网址: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
网址: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
网址: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
网址:https://drive.google.com/uc?export=dowload&id=17_ABp79PlFt9yPCxSaarVc_DKTmrSGGf
sha:bef233c28947ef6ec8c663d20a2b326302421fa3
建议的参数设置:-inputHeight=736, -inputWidth=1280;
说明:此模型在 ICDAR2015 上接受训练,因此仅能检测英文文本实例。
- DB_IC15_resnet18.onnx
网址: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 模型 here。
- 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)
在运行时检查条件,如果失败则抛出异常。
Definition base.hpp:342
步骤 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("文本检测", image);
waitKey();
输出
图片示例
文本定位示例
在执行上述步骤后,可以轻松获取输入图像的检测结果。然后,你可以对文本图像进行变换和裁剪以用于识别。如需了解更多信息,请参阅详细示例
Mat cropped;
fourPointsTransform(recInput, vertices, cropped);
String recResult = recognizer.recognize(cropped);
输出示例
图片示例
图片示例
源代码
可以在 DNN 模块中找到这些 API 的源代码。
详细示例
如需了解更多信息,请参阅
使用图像进行测试
示例
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