文章目录
- 前言
- 一、手写数字识别
- 1. Net 实现方式
- 2. Model 实现方式
- 二、通用字符识别
- 1. 文字检测
- 2. 文字识别
- 总结
前言
- 需要下载安装OpenCV工具包的朋友,请前往 此处 ;
- 系统要求:Windows系统,LabVIEW>=2018,兼容32位和64位。
一、手写数字识别
手写数字识别(mnist数据集)参考工程:https://github.com/jinay1991/LeNet-MNIST/tree/master
1. Net 实现方式
参考工具包附带的范例:examples/Molitec/OpenCV/dnn/Net_1 (TF_mnist).vi
- 范例提供的 frozen_graph.pb 模型文件,需要用 TensorFlow 载入,所以把 new.vi 切换到 “readNetFromTensorflow” 模式;
- 网络输入格式是 28 * 28 的单通道图片(灰度),预处理后的 Blob 形状为(1 * 1 * 28 * 28);
- 网络输出(1 * 10)的二维Blob,10个数字分别代表识别结果为 0~9 的概率;
范例实现过程如下图所示。
2. Model 实现方式
Model 类同样位于 dnn 模块。Model 是一个基类,根据不同的应用情景,衍生出一系列子类:
函数选板如下图。子目录下的函数,是子类私有方法。外部的是共有方法。
使用 Model 类实现手写数字识别,参考范例:examples/Molitec/OpenCV/dnn/Model_1 (Classification_mnist).vi
- 插入一个 Net 类的 new.vi,切换到 “readNetFromTensorflow”模式,载入模型到 Net 对象(与上文一样);
- 插入一个 Model 类的 new.vi ,切换模式到 “ClassificationModel - From Net”,输入上述 Net 对象,创建ClassificationModel子类;
(切换到 “From file” 模式,可以直接从文件载入模型。但遇到 Model 不支持的文件类型时,可以请 Net 代劳) - 插入 Model 类共有方法 setInputSize.vi ,设置 size 为 (28 * 28);
- 使用 blobFromImage 处理之后,还需要 reshape 成(28 * 28)的二维Mat,以满足Model的输入要求;
- 插入 ClassificationModel 子类的私有方法 CM_classify.vi ,输入上述的二维Mat,运行后输出结果簇result;
- 插入一个 Model 类的 delete.vi ,销毁对象。
完整过程如下图。
二、通用字符识别
本例将用到 Model 的两个子类:TextDetectionModel 和 TextRecognitionModel,即 文字检测 + 文字识别。
参考范例:examples/Molitec/OpenCV/dnn/Model_2 (TextDetection_and_TextRecognition).vi
1. 文字检测
文字检测的任务,是获取一张图片中存在文字的区域,返回多个(旋转)矩形的ROI范围。
TextDetectionModel 的两个子类 TextDetectionModel_DB 和 TextDetectionModel_EAST 都可以实现这个功能。
Google 提供了 DB 和 EAST 模型,可供下载使用:
- DB_IC15_resnet50.onnx:
url: https://drive.google.com/uc?export=dowload&id=17_ABp79PlFt9yPCxSaarVc_DKTmrSGGf
sha: bef233c28947ef6ec8c663d20a2b326302421fa3
recommended parameter setting: -inputHeight=736, -inputWidth=1280;
description: This model is trained on ICDAR2015, so it can only detect English text instances.- DB_IC15_resnet18.onnx:
url: https://drive.google.com/uc?export=dowload&id=1vY_KsDZZZb_svd5RT6pjyI8BS1nPbBSX
sha: 19543ce09b2efd35f49705c235cc46d0e22df30b
recommended parameter setting: -inputHeight=736, -inputWidth=1280;
description: This model is trained on ICDAR2015, so it can only detect English text instances.- DB_TD500_resnet50.onnx:
url: https://drive.google.com/uc?export=dowload&id=19YWhArrNccaoSza0CfkXlA8im4-lAGsR
sha: 1b4dd21a6baa5e3523156776970895bd3db6960a
recommended parameter setting: -inputHeight=736, -inputWidth=736;
description: This model is trained on MSRA-TD500, so it can detect both English and Chinese text instances.- DB_TD500_resnet18.onnx:
url: https://drive.google.com/uc?export=dowload&id=1sZszH3pEt8hliyBlTmB-iulxHP1dCQWV
sha: 8a3700bdc13e00336a815fc7afff5dcc1ce08546
recommended parameter setting: -inputHeight=736, -inputWidth=736;
description: This model is trained on MSRA-TD500, so it can detect both English and Chinese text instances.- EAST:
Download link: https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz?dl=1
This model is based on https://github.com/argman/EAST
本例将使用 DB_IC15_resnet18.onnx 这个模型,它只能检测英文字符。如需检测中文,请下载其他合适的模型。
- 插入一个 Model 类的 new.vi ,切换模式到 “TextDetectionModel_DB - From file”,输入模型路径;
- 插入多个 TextDetectionModel_DB 子类的私有方法 TDM_DB_set.vi ,通过切换模式,设置不同的参数;
(BinaryThreshold=0.1 ,PolygonThreshold=0.3 ,UnclipRatio=2 ,MaxCandidates=200) - 插入一个 Model 类共有方法 setInputParams.vi ,设置预处理参数;
(该模型输入尺寸为 1280 * 736 ,BGR通道采用不同的均值进行归一化) - 插入一个 TextDetectionModel 子类的私有方法 TDM_detectTextRectangles.vi ,直接输入彩色图片,无需预处理( Model 内部会根据setInputParams的参数自动进行预处理),运行后输出检测结果;
- 插入一个 Model 类的 delete.vi ,销毁对象。
完整过程如下图。输出的 results 簇包含两项:旋转矩形列表 + 置信度列表。其中的矩形坐标都是基于原图片的,所以如果你要做可视化的话,绘图之前不需要再做尺度转化了。
2. 文字识别
文字识别的任务,是从一个包含文字的图像切片中,提取文字内容。这通常要以文字检测作为前提任务。
使用 Model 的子类 TextRecognitionModel 实现文字识别功能。
Google 提供了文字识别模型,以及相应的字符集,可供下载使用:
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
parameter setting: -rgb=0;
description: The classification number of this model is 36 (0~9 + a~z).The training dataset is 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
parameter setting: -rgb=1;
description: The classification number of this model is 94 (0~9 + a~z + A~Z + punctuations).The training datasets are MJsynth and 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
parameter setting: -rgb=1;
description: The classification number of this model is 3944 (0~9 + a~z + A~Z + Chinese characters + special characters).The training dataset is ReCTS (https://rrc.cvc.uab.es/?ch=12).
本例使用模型 crnn_cs.onnx 和字符集 alphabet_94.txt,只能识别英文。如需中文,可使用 crnn_cs_CN.onnx 和 alphabet_3944.txt 。
- 插入一个 Model 类的 new.vi ,切换模式到 “TextRecognitionModel - From file”,输入模型路径;
- 插入一个 TextRecognitionModel 私有方法 TRM_setDecodeType.vi,输入参数 CTC-greedy;
- 插入一个 TextRecognitionModel 私有方法 TRM_setVocabulary.vi,输入字符集数组;
- 插入一个 Model 共有方法 setInputParams.vi ,设置预处理参数;
(该模型输入尺寸为 100 * 32 ,BGR通道采用相同的均值 127.5 进行归一化) - 插入一个 TextRecognitionModel 私有方法 TRM_recognize.vi ,切换成 single 模式,每次只识别一个图像切片;
- 将上述文字检测的结果,用For循环展开,对原图片进行ROI切片,依次输入到 TRM_recognize.vi ,同样无需预处理。每一次循环,得到一个字符串;
- 插入一个 Model 类的 delete.vi ,销毁对象。
完整过程如下图。其中,boxPoints 函数提取旋转矩形的四个点坐标,boundingRect 函数计算点集的最小矩形边界,二者结合就把 “旋转矩形” 变成了 “最小外接矩形”,从而方便对图像进行ROI提取。二者都位于imgproc选板。
工具包附带的范例,结合了文字检测+文字识别,并做了可视化处理。效果如下图:
总结
- 本系列博文作为LabVIEW工具包—OpenCV的教程,将以专栏的形式陆续发布和更新。
- 对工具包感兴趣的朋友,欢迎下载试用:秣厉科技 - LabVIEW工具包 - OpenCV
- 各位看官有什么想法、建议、吐槽、批评,或新奇的需求,也欢迎留言讨论。