赞
踩
上一个教程 : 如何运行自定义 OCR 模型
下一个教程 : 基于 DNN 的人脸检测与识别
原作者 | Wenqing Zhang |
---|---|
兼容性 | OpenCV >= 4.5 |
在本教程中,我们将详细介绍 TextRecognitionModel 和 TextDetectionModel 的 API。
————————————————————————————————————————————————————————————————————————
在当前版本中,cv::dnn::TextRecognitionModel 只支持基于 CNN+RNN+CTC 的算法,并提供了 CTC 的贪婪解码方法。更多信息,请参阅原文。
识别前,应设置词汇
和设置解码类型
。
(T、B、Dim)
,其中
T
是序列长度B
是批量大小(推理时只支持 B=1)Dim
是词汇+1 的长度(CTC 的 "空白 "位于 Dim 的索引=0 处)。setDecodeOptsCTCPrefixBeamSearch
可以用来控制搜索步骤中的波束大小。vocPruneSize
,以避免遍历整个词库,而只遍历概率最高的 vocPruneSize
词库。cv::dnn::TextRecognitionModel::recognize() 是文本识别的主要函数。
cv::dnn::TextDetectionModel API 为文本检测提供了这些方法:
在当前版本中,cv::dnn::TextDetectionModel 支持这些算法:
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
转换模型。
- 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. 加载带有词汇表的图像和模型
// 加载裁剪过的文本行图像 // 你可以在 "Images for Testing"(测试图像)中找到裁剪过的测试图像 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> 词汇表; while (std::getline(vocFile, vocLine)) { vocabulary.push_back(vocLine); } model.setVocabulary(vocabulary);
步骤 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. 加载图片和模型
// 加载图像
// 您可以在 "Images for Testing"(测试图片)中找到一些测试图片
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);
步骤 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);
waitKey();
输出:
按照上述步骤操作后,很容易就能得到输入图像的检测结果。然后,您可以对文本图像进行转换和裁剪,以便进行识别。更多信息,请参阅详细示例
// 变换和裁剪
Mat cropped;
fourPointsTransform(recInput, vertices, cropped);
String recResult = recognizer.recognize(cropped);
输出示例
有关详细信息,请参阅
示例:
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/crn_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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。