0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探索OpenVINO™ 手写字符使用方法

英特尔物联网 来源:英特尔物联网 作者:英特尔物联网 2021-07-28 09:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

引言

手写数字识别是一个很基础的模式识别问题,从传统特征提取加机器学习训练方法到深度神经网络训练的识别方法识别都会达到比较高的精度,同时手写数字识别也是一个特别不稳定,很难具备普适性的模型,需要针对性的数据集与训练,然后才得到比较好的识别精度。

OpenVINO 在2021.4 版本中已经加入了手写数字识别的预训练模型,开始支持手写数字识别,下面让我们一起探索与尝试下它的使用方法与效果如何!

模型介绍

在OpenVINO 2021.4版本中支持的手写数字识别模型为handwritten-score-recognition-0003

,支持《digit》 or 《digit》。《digit》 格式的数字识别与小数点识别。该模型的结构有两个部分组成,前面是一个典型的CNN骨干网络,采用的是VGG-16类似的架构,实现特征提取;后面是一个双向的LSTM网络,实现序列预测;最终的预测结果基于CTC解析即可。其输入与输出格式如下:

输入格式为:[NCHW]= [1x1x32x64]

输出格式为:[WxBxL]=[16x1x13]

其中13表示“0123456789._#”,#表示空白、_表示非数字的字符

对输出格式的解码方式支持CTC贪心与Beam搜索,演示程序使用CTC贪心解码,这种方式相对简单,前面一篇文章中我们已经详细介绍过了,后面就直接套用即可!

模型使用与演示

使用该模型必须是基于常见文字检测得到的ROI区域,然后转化为灰度图象,使用该模型完成预测,关于场景文字检测,在前面一篇文章中我已经详细交代过了,这里就不再赘述。这里小可脑洞大开,针对常见的文本图象,采用OpenCV二值图象轮廓分析来完成数字ROI区域得截取,同样取得了不错得效果。基本的流程是这样:

Step 1: 读取图象并二值化

代码如下

Mat src = imread(“D:/images/zsxq/ocr.png”);

imshow(“input”, src);

Mat gray, binary;

cvtColor(src, gray, COLOR_BGR2GRAY);

adaptiveThreshold(gray, binary, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 25, 10);

其中adaptiveThreshold函数实现对灰度图象自适应二值化,参数blockSize=25表示高斯窗口大小,constants=10表示自适应常量值。需要注意的是参数blockSize值必须为奇数。

Step 2: 使用轮廓分析过填充过滤小噪点

代码如下

std::vector《vector《Point》》 contours;

std::vector《Vec4i》 hireachy;

findContours(binary, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

int image_height = src.rows;

int image_width = src.cols;

for (size_t t = 0; t 《 contours.size(); t++) {

double area = contourArea(contours[t]);

if (area 《 10) {

drawContours(binary, contours, t, Scalar(0), -1, 8);

}

}

上面的代码findContours表示轮廓发现,RETR_EXTERNAL表示采用发现最外层轮廓,CHAIN_APPROX_SIMPLE表示采用简单的链式编码收集轮廓上的像素点集。contourArea表示计算一个轮廓的面积,计算方式基于格林积分公式。drawContours表示绘制轮廓,其中thickness参数为-1表示填充,大于零表示绘制边缘。这里通过对白色噪点填充为黑色,完成噪声去除,

Step 3:膨胀预处理

对第二步输出的图象我们不能直接通过轮廓发现截取ROI,然后交给数字识别网络去识别,原因是这样会导致ROI区域的宽高比失衡,导致输入的数字resize之后发现畸变,识别精度会降低,所以通过膨胀操作,把数字适度的加宽与加高,主要是加宽,这样保持输入ROI区域resize之后不变性,就很容易识别了。这部分预处理的代码如下:

Mat se = getStructuringElement(MORPH_RECT, Size(45, 5));

Mat temp;

dilate(binary, temp, se);

其中dilate表示膨胀操作、然后对得到temp图象。

Step 4:数字识别推理与解析

对图-4进行轮廓发现,截取ROI,遍历每个轮廓,调用识别推理即可输出。其中加载模型与获取推理请求,这里就不再赘述了,截取ROI与推理解析部分的代码如下:

// 处理输出结果

findContours(temp, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

for (size_t t = 0; t 《 contours.size(); t++) {

Rect box = boundingRect(contours[t]);

Mat roi = gray(box);

size_t image_size = h*w;

Mat blob_image;

resize(roi, blob_image, Size(w, h));

// NCHW

unsigned char* data = static_cast《unsigned char*》(input-》buffer());

for (size_t row = 0; row 《 h; row++) {

for (size_t col = 0; col 《 w; col++) {

data[row*w + col] = blob_image.at《uchar》(row, col);

}

}

// 执行预测

infer_request.Infer();

auto output = infer_request.GetBlob(output_name);

const float* blob_out = static_cast《PrecisionTrait《Precision::FP32》::value_type*》(output-》buffer());

const SizeVector reco_dims = output-》getTensorDesc().getDims();

const int RW = reco_dims[0];

const int RB = reco_dims[1];

const int RL = reco_dims[2];

std::string ocr_txt = ctc_decode(blob_out, RW, RL);

std::cout 《《 ocr_txt 《《 std::endl;

cv::putText(src, ocr_txt, box.tl(), cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(255, 0, 0), 1);

cv::rectangle(src, box, Scalar(0, 0, 255), 2, 8, 0);

}

首先进行轮廓发现,然后根据每个轮廓截取ROI区域,设置输入数据,推理,解析输出采用CTC方式。

扩展探索

这里我没有采用场景文字检测来获取ROI,而是采用传统的二值图象分析来完成,主要是避免跟前面的文字内容重叠,同时启发更多的思路。另外采用膨胀扩展。

有时候并非是上上之选,还可以直接修改ROI大小来扩展,这部分其实可以参考上一篇场景文字识别的代码,轮廓发现获取外接矩形,直接修改ROI大小的方式,同时根据横纵比过滤非数字符号。改动部分就是去掉第三步膨胀,然后直接在第四步循环中添加下面的代码;

Rect box = boundingRect(contours[t]);

float rate = box.width / box.height;

if (rate 》 1.5) {

continue;

}

box.x = box.x - 15;

box.width = box.width + 30;

box.y = box.y - 5;

box.height = box.height + 10;

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数字识别
    +关注

    关注

    2

    文章

    22

    浏览量

    10321

原文标题:OpenVINO™ 手写字符识别模型与使用

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    锡膏的储存及使用方法详解

    锡膏是一种常用的焊接辅助材料,广泛应用于电子、电器、通讯、仪表等行业的焊接工艺中。正确的储存和使用方法对于保证锡膏的品质和焊接效果至关重要。本文将就锡膏的储存和使用方法进行详细介绍,希望能对广大焊接工作者有所帮助。
    的头像 发表于 07-18 17:36 1063次阅读
    锡膏的储存及<b class='flag-5'>使用方法</b>详解

    基于LockAI视觉识别模块:手写数字识别

    评分等场景。这项技术不仅提高了数据处理的速度和准确性,还极大地简化了输入流程,为金融、邮政和教育等行业带来了显著的便利。 1.2 手写数字识别常用方法 目前,实现手写数字识别方法有很多
    发表于 06-30 16:45

    请问如何优化OpenVINO™工具套件中的内存使用?

    运行OpenVINO™推断时找不到优化内存使用情况的方法
    发表于 06-25 06:56

    无法将Openvino™ 2025.0与onnx运行时Openvino™ 执行提供程序 1.16.2 结合使用,怎么处理?

    使用OpenVINO™与英特尔 i5-8500 CPU 和超核处理器 630 iGPU 一起部署模型。 使用了 Microsoft.ML.OnnxRuntime.OpenVino
    发表于 06-24 06:31

    为什么无法通过“pip install openvino-dev==2025.0.0”安装 2025.0 OpenVINO™?

    通过“pip install openvino-dev==2025.0.0OpenVINO™ 2025.0 安装。 收到的错误: ERROR: No matching distribution found for openvino
    发表于 06-23 08:13

    如何为Raspbian Bullseye构建开源OpenVINO™?

    为 Raspbian* Bullseye 构建开源OpenVINO™ 的变通方法步骤
    发表于 03-07 07:07

    在Visual Studio中使用OpenVINO™ C API时无法读取网络怎么解决?

    使用 OpenVINO C API 加载中间表示 (IR),方法是引用Hello 分类 C 样本。 使用ie_infer_request_set_blob 时收到的状态为 -1(一般错误)。
    发表于 03-07 07:01

    如何部署OpenVINO™工具套件应用程序?

    编写代码并测试 OpenVINO™ 工具套件应用程序后,必须将应用程序安装或部署到生产环境中的目标设备。 OpenVINO™部署管理器指南包含有关如何轻松使用部署管理器将应用程序打包并部署到目标主机的详细信息。 注意:OpenVIN
    发表于 03-06 08:23

    OpenVINO™ Toolkit中如何保持模型稀疏性?

    OpenVINO™ Toolkit 中支持的优化方法,保持模型稀疏性。
    发表于 03-06 06:47

    请问使用2022.2时是否可以读取模型OpenVINO™层?

    使用 2020.3 时,使用 net.layers 和 layers.blob 读取模型OpenVINO™层。 OpenVINO™自 2021.2 OpenVINO™起,使用 2022.2 作为 net.layers 和 la
    发表于 03-06 06:37

    安装OpenVINO™ 2023.2使用pip install openvino-dev命令的开发工具后报错怎么解决?

    安装OpenVINO™ 2023.2 使用 pip install openvino-dev 命令的开发工具。 遇到错误: ModuleNotFoundError: 没有名为 \'distutils\' 的模块
    发表于 03-05 08:39

    通过Docker映像OpenVINO™ DL Workbench OpenVINO™安装,无法上传模型怎么解决?

    通过 Docker 映像OpenVINO™ DL Workbench OpenVINO™安装。 无法上传模型: Model cannot be downloaded due to network
    发表于 03-05 08:08

    如何下载 OpenVINO™ 工具套件?

    需要下载用于开发工作的 OpenVINO™ 工具套件。
    发表于 03-05 06:49

    精密空调操作使用方法详解

    精密空调操作使用方法详解
    的头像 发表于 02-10 14:44 1886次阅读
    精密空调操作<b class='flag-5'>使用方法</b>详解

    AB伺服软件使用方法

    AB伺服软件使用方法
    发表于 12-24 14:45 1次下载