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

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

3天内不再提示

OpenVINO2021.4版本中场景文字检测与识别模型的推理使用

英特尔物联网 来源:英特尔物联网 作者: 贾志刚 2021-08-26 15:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

场景文字检测与识别模型

OpenVINO2021.4支持场景文字检测是基于MobileNetV2的PixelLink模型,模型有两个分别是text-detection-0003与text-detection-0004。以text-detection-0003模型为例它有两个输出,分别是分割输出与bounding Boxes输出

下面是基于VGG16作为backbone实现的PixelLink的模型。

最终得到输出text/notext的mask区域,对mask区域简单处理之后就会得到每个场景文字区域的ROI。关于后处理,再后续的会有详细代码演示。OpenVINO2021.4不仅支持场景文字的检测还支持场景文字的识别,支持场景文字识别的模型是基于VGG16+双向LSTM,识别0~9与26个字符加空白,并且非大小写敏感!

模型输入与输出格式

PixelLink场景文字检测模型的输入与输出格式如下:

输入格式:1x3x768x1280 BGR彩色图像

输出格式:

name: “model/link_logits_/add”, [1x16x192x320] – pixelLink的输出

name: “model/segm_logits/add”, [1x2x192x320] – 像素分类text/no text

图-3文本识别模型的输入与输出格式如下:

输入格式:1x1x32x120

输出格式:30, 1, 37

输出解释是基于CTC贪心解析方式。

其中37字符集长度,字符集为:

0123456789abcdefghijklmnopqrstuvwxyz#

#表示空白。

同步与异步推理

在OpenVINO的IE推理模块相关SDK支持同步与异步推理模型,同步的意思是阻塞直到返回结果, 异步就是调用推理之后直接返回,接受到处理完成通知之后再解析输出,相比同步方式,异步推理更加适合视频流多路推理的方式。异步推理的执行方式大致如下:

// start the async infer request (puts the request to the queue and immediately returns)

async_infer_request-》StartAsync();

// here you can continue execution on the host until results of the current request are really needed

//。。。

async_infer_request.Wait(IInferRequest::RESULT_READY);

auto output = async_infer_request.GetBlob(output_name);

场景文字检测代码演示

OpenVINO2021.4中场景文字检测的,以text-detection-0003为例。加载模型文件与获取推理请求等与之前的保持一致,无需再说,这里主要是PixelLink模型的输出解析部分,它的解析部分代码如下:

cv::Mat mask = cv::Size(out_w, out_h), CV_8U);

int step = out_h*out_w;

for (int row = 0; row 《 out_h; row++) {

for (int col = 0; col 《 out_w; col++) {

float p1 = detection_out[row*out_w + col];

float p2 = detection_out[step + row*out_w + col]; // text

if (p2》1.0) {

mask.at《uchar》(row, col) = 255;

}

}

}

cv::resize(mask, mask, cv::Size(im_w, im_h));

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

cv::findContours(mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

对输出的Mask数据,完成text与非text的分类,得到二值图象,然后对二值图象完成轮廓发现,根据轮廓发现的的结果输出最大/最小外接矩形,得到每个Text区域的检测结果,最终模型的运行结果如下:

场景文字识别代码演示

场景文字识别是基于场景文字检测模型输出得到的TEXT区域作为输入,基于灰度图象预测输出,使用text-recognition-0012模型。关于模型加载、输入与输出设置同样不再赘述,检测得到TEXT的ROI作为输入,推理与预测文字及显示的代码如下:

auto reco_output = reco_request.GetBlob(reco_output_name);

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

const SizeVector reco_dims = reco_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);

其中RWxRBxRL=30x1x37,CTC解析的函数ctc_decode实现代码如下:

std::string ctc_decode(const float* blob_out, int seq_w, int seq_l) {

printf(“seq width: %d, seq length: %d ”, seq_w, seq_l);

std::string res = “”;

bool prev_pad = false;

const int num_classes = alphabet.length();

int seq_len = seq_w*seq_l;

for (int i = 0; i 《 seq_w; i++) {

int argmax = 0;

int max_prob = blob_out[i*seq_l];

for (int j = 0; j 《num_classes; j++) {

if (blob_out[i*seq_l + j] 》 max_prob) {

max_prob = blob_out[i*seq_l + j];

argmax = j;

}

}

auto symbol = alphabet[argmax];

if (symbol == ‘#’) {

prev_pad = true;

}

else {

if (res.empty() || prev_pad || (!res.empty() && symbol != res.back())) {

prev_pad = false;

res += symbol;

}

}

}

return res;

}

解析过程就是对得到二维矩阵30x37,按行先做argmax,然后再去掉重复,最终得到预测生成的text文本返回。

总结

本文主要讲述了OpenVINO2021.4版本中场景文字检测与识别模型的推理使用,以及同步与异步推理的的基本概念。特别值得注意的是场景文字识别模型是基于灰度图象不是RGB彩色图象,如果搞错这点就会得到错误的文本预测结果。

编辑:jq

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

    关注

    4

    文章

    839

    浏览量

    62317
  • 识别
    +关注

    关注

    3

    文章

    175

    浏览量

    32672
  • vgg
    vgg
    +关注

    关注

    1

    文章

    11

    浏览量

    5483
  • LSTM
    +关注

    关注

    0

    文章

    63

    浏览量

    4465

原文标题:OpenVINO™ 场景文字识别与同步与异步推理

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    从显存瓶颈到推理革命:vLLM 为何成为大模型服务的底层标配

    ,vLLM 无疑是最耀眼的存在——它不仅解决了大模型推理的核心痛点,更重新定义了大模型服务的基础设施标准,成为当下绝大多数 AI 平台、Agent 系统、私有化部署场景的底层选择。 作
    的头像 发表于 05-12 09:57 444次阅读
    从显存瓶颈到<b class='flag-5'>推理</b>革命:vLLM 为何成为大<b class='flag-5'>模型</b>服务的底层标配

    【瑞萨AI挑战赛】手写数字识别模型在RA8P1 Titan Board上的部署

    编译生成的C代码需集成到RT-Thread Studio的嵌入式工程中,完成板端代码的修改、编译与烧录,最终实现手写数字识别模型的板端运行,核心分为工程集成、代码修改、推理逻辑编写三个步骤。 5.1
    发表于 03-15 20:42

    LLM推理模型是如何推理的?

    这篇文章《(How)DoReasoningModelsReason?》对当前大型推理模型(LRM)进行了深刻的剖析,超越了表面的性能宣传,直指其技术本质和核心局限。以下是基于原文的详细技术原理、关键
    的头像 发表于 01-19 15:33 838次阅读
    LLM<b class='flag-5'>推理模型</b>是如何<b class='flag-5'>推理</b>的?

    瑞芯微(EASY EAI)RV1126B OCR文字识别

    1.OCR文字识别简介文字识别也是图像领域一个常见问题。然而,对于自然场景图像,首先要定位图像中的文字
    的头像 发表于 01-12 10:19 7598次阅读
    瑞芯微(EASY EAI)RV1126B OCR<b class='flag-5'>文字</b><b class='flag-5'>识别</b>

    如何精准驱动菜品识别模型--基于米尔瑞芯微RK3576边缘计算盒

    的NPU算力: 1. 目标检测: 当一张图片或视频帧输入后,首先由 YOLOv11s模型进行推理。它的任务是精准定位图片中菜品所在的位置,并输出其边界框,为后续处理划定了关键区域。 2. 特征提取: 系统将
    发表于 10-31 21:19

    什么是AI模型推理能力

    NVIDIA 的数据工厂团队为 NVIDIA Cosmos Reason 等 AI 模型奠定了基础,该模型近日在 Hugging Face 的物理推理模型排行榜中位列榜首。
    的头像 发表于 09-23 15:19 1617次阅读

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别
    的头像 发表于 08-25 14:55 1673次阅读
    迅为RK3568开发板<b class='flag-5'>模型</b><b class='flag-5'>推理</b>测试实战LPRNet 车牌<b class='flag-5'>识别</b>

    【EASY EAI Orin Nano开发板试用体验】PP-OCRV5文字识别实例搭建与移植

    参数中填上dec模型的路径,在第三个参数中填上rec模型的路径,在第四个参数中填上需要进行文字识别的源图片: 看看效果: RK3588s开发板上面成功运行,但是RK3576开发板
    发表于 08-18 16:57

    无法在NPU上推理OpenVINO™优化的 TinyLlama 模型怎么解决?

    在 NPU 上推断 OpenVINO™优化的 TinyLlama 模型。 遇到的错误: get_shape was called on a descriptor::Tensor with dynamic shape
    发表于 07-11 06:58

    模型推理显存和计算量估计方法研究

    随着人工智能技术的飞速发展,深度学习大模型在各个领域得到了广泛应用。然而,大模型推理过程对显存和计算资源的需求较高,给实际应用带来了挑战。为了解决这一问题,本文将探讨大模型
    发表于 07-03 19:43

    无法将Tensorflow Lite模型转换为OpenVINO™格式怎么处理?

    将 Tensorflow Lite 模型转换为 OpenVINO™ 格式。 遇到的错误: FrontEnd API failed with OpConversionFailure:No translator found for TFLite_Detection_PostP
    发表于 06-25 08:27

    使用 NPU 插件对量化的 Llama 3.1 8b 模型进行推理时出现“从 __Int64 转换为无符号 int 的错误”,怎么解决?

    安装了 OpenVINO™ GenAI 2024.4。 使用以下命令量化 Llama 3.1 8B 模型: optimum-cli export openvino -m meta-llama
    发表于 06-25 07:20

    使用Openvino™ GenAI运行Sdxl Turbo模型时遇到错误怎么解决?

    使用 OpenVINO™ GenAI 运行 SDXL Turbo 模型。 遇到的错误: RuntimeError :- Check ov_tokenizer || ov_detokenizer Neither tokenizer nor detokenizer model
    发表于 06-24 06:38

    为什么无法在GPU上使用INT8 和 INT4量化模型获得输出?

    安装OpenVINO™ 2024.0 版本。 使用 optimum-intel 程序包将 whisper-large-v3 模型转换为 int 4 和 int8,并在 GPU 上使用 Ope
    发表于 06-23 07:11

    基于LockAI视觉识别模块:C++目标检测

    快速部署高性能的目标检测应用。 特点: 高性能:优化了推理速度,在保持高精度的同时实现了快速响应。 灵活性:支持多种预训练模型,可以根据具体需求选择合适的模型架构。 易于集成:提供 C
    发表于 06-06 14:43