OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
高级API:TextDetectionModel和TextRecognitionModel

上一教程: 如何运行自定义OCR模型
下一教程: 基于DNN的人脸检测和识别

原作者张文庆
兼容性OpenCV >= 4.5

引言

本教程将详细介绍TextRecognitionModel和TextDetectionModel的API。


TextRecognitionModel

在当前版本中,cv::dnn::TextRecognitionModel仅支持基于CNN+RNN+CTC的算法,并提供CTC的贪婪解码方法。更多信息,请参考原文

在识别之前,您应该setVocabularysetDecodeType

  • 对于"CTC-greedy",文本识别模型的输出应为概率矩阵。形状应为(T, B, Dim),其中
    • T是序列长度
    • B是批大小(推理中仅支持B=1
    • Dim是词汇表长度+1(CTC的'Blank'位于Dim的index=0)。
  • 对于"CTC-prefix-beam-search",文本识别模型的输出应与"CTC-greedy"相同的概率矩阵。
    • 该算法在Hannun的论文中提出。
    • setDecodeOptsCTCPrefixBeamSearch可用于控制搜索步骤中的beam size。
    • 为了进一步优化大型词汇表,引入了一个新的选项vocPruneSize,以避免迭代整个词汇表,而只迭代概率最高的vocPruneSize个标记。

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");
CV_Assert(vocFile.is_open());
String vocLine;
std::vector<String> vocabulary;
while (std::getline(vocFile, vocLine)) {
vocabulary.push_back(vocLine);
}
}
CV_Assert
#define CV_Assert(expr)
运行时检查条件,如果失败则抛出异常。

定义 base.hpp:359

步骤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;

输入图像

图片示例

输出

'welcome'

文本检测示例

步骤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)
;
步骤2. 设置参数
.setUnclipRatio(unclipRatio);
double scale = 1.0 / 255.0;
Scalar mean = Scalar(127.5, 127.5, 127.5);
Scalar mean = Scalar(122.67891434, 116.66876762, 104.00698793);
Size inputSize = Size(100, 32);

定义 interface.h:42

步骤2.b 设置参数 (EAST)
TextDetectionModel_EAST model("EAST.pb");
float confThreshold = 0.5;
float nmsThreshold = 0.4;
model.setConfidenceThreshold(confThreshold)
;
.setNMSThreshold(nmsThreshold);
double detScale = 1.0;
Size detInputSize = Size(320, 320);
Scalar detMean = Scalar(123.68, 116.78, 103.94);
bool swapRB = true;

model.setInputParams(scale, inputSize, mean);

model.setInputParams(detScale, detInputSize, detMean, swapRB);
std::vector<std::vector<Point>> detResults;
model.detect(detResults);
// 可视化
polylines(frame, detResults, true, Scalar(0, 255, 0), 2);
imshow("文本检测", frame);

图片示例

输入图像

waitKey();

文本识别示例

按照上述步骤,很容易获得输入图像的检测结果。然后,您可以进行转换和裁剪文本图像以进行识别。更多信息,请参考详细示例
// 转换和裁剪
Mat cropped;
fourPointsTransform(recInput, vertices, cropped);

String recResult = recognizer.recognize(cropped);

输入图像
输入图像

输出示例

源代码

这些API的源代码可以在DNN模块中找到。

详细示例

samples/dnn/scene_text_spotting.cpp

使用图像测试

示例
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