开发者实战 | 在英特尔开发套件上打造指哪识哪的OCR应用

本文介绍了如何使用英特尔的OpenVINO框架进行场景文字检测和识别,以及结合MediaPipe实现手势控制的文字选择和识别功能。文章详细展示了代码实现步骤,并提到了在AlxBoard开发板上的移植方法和语音播报的扩展可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击蓝字

关注我们,让开发变得更有趣 

作者:贾志刚  英特尔边缘计算创新大使

b1dd45f346bd44cd5097853e9cf4678a.png

01

OpenVINO™场景文字检测

OpenVINO™是英特尔推出的深度学习模型部署框架,当前最新版本是OpenVINO™2023版本。OpenVINO™2023自带各种常见视觉任务支持的预训练模型库Model Zoo,其中支持场景文字检测的网络模型是来自Model Zoo中名称为:text-detection-0003的模型(基于PixelLink架构的场景文字检测网络)。

f0bbdfdbec2ea2abea05db84218e22b1.png

图-1 PixelLink网络模型架构

图-1中的PixelLink场景文字检测模型的输入与输出格式说明

输入格式:

1x3x768x1280 BGR彩色图像

输出格式:

name: "model/link_logits_/add", [1x16x192x320] – pixelLink的输出
name: "model/segm_logits/add", [1x2x192x320] – 像素分类text/no text

左滑查看更多

02

OpenVINO™文字识别

OpenVINO™支持文字识别(数字与英文)的模型是来自Model Zoo中名称为:text-recognition-0012d的模型,是典型的CRNN结构模型。 (基于类似VGG卷积结构backbone与双向LSTM编解码头的文字识别网络)

5c8ae62725d8c8e7e3ba75e3209cfcad.png

图-2 CRNN网络模型架构

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

输入格式:1x1x32x120

输出格式:30, 1, 37

输出解释是基于CTC贪心解析方式,其中37字符集长度,字符集为:0123456789abcdefghijklmnopqrstuvwxyz#

#表示空白。

03

MediaPipe手势识别

谷歌在2020年发布的mediapipe开发包说起,这个开发包集成了包含手势姿态等各种landmark检测与跟踪算法。其中支持手势识别是通过两个模型实现,一个是模型是检测手掌,另外一个模型是实现手掌的landmakr标记。

8c7d24ecae9113846d01554b9e445942.png

图-3 手势landmark点位说明

04

OpenVINO™与MediaPipe库的安装

pip install openvino==2023.0.2
pip install mediapipe

左滑查看更多

请先安装好OpenCV-Python开发包依赖。

05

应用构建说明

首先基于OpenCV打开USB摄像头或者笔记本的web cam,读取视频帧,然后在每一帧中完成手势landmark检测,根据检测到手势landmark数据,分别获取左右手的食指指尖位置坐标(图-3中的第八个点位),这样就得到了手势选择的ROI区域,同时把当前帧的图像送入到OpenVINO™场景文字识别模块中,完成场景文字识别,最后对比手势选择的区域与场景文字识别结果每个区域,计算它们的并交比,并交比阈值大于0.5的,就返回该区域对应的OCR识别结果,并显示到界面上。整个流程如下:

94caef7fe056c256d217177a7c6fbe51.png

图-4程序执行流程图

06

代码实现

根据图-4的程序执行流程图,把场景文字检测与识别部分封装到了一个类TextDetectAndRecognizer,最终实现的主程序代码如下:

import cv2 as cv
import numpy as np
import mediapipe as mp
from text_detector import TextDetectAndRecognizer
digit_nums = ['0','1', '2','3','4','5','6','7','8','9','a','b','c','d','e','f','g',
              'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','#']


mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands


x0 = 0
y0 = 0
detector = TextDetectAndRecognizer()


# For webcam input:
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
# out = cv.VideoWriter("D:/test777.mp4", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15, (np.int(width), np.int(height)), True)
with mp_hands.Hands(
  min_detection_confidence=0.75,
  min_tracking_confidence=0.5) as hands:
  while cap.isOpened():
    success, image = cap.read()


    if not success:
        break


    image.flags.writeable = False
    h, w, c = image.shape
    image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
    results = hands.process(image)


    image = cv.cvtColor(image, cv.COLOR_RGB2BGR)
    x1 = -1
    y1 = -1
    x2 = -1
    y2 = -1
    if results.multi_hand_landmarks:
      for hand_landmarks in results.multi_hand_landmarks:
        mp_drawing.draw_landmarks(
          image,
          hand_landmarks,
          mp_hands.HAND_CONNECTIONS)
        for idx, landmark in enumerate(hand_landmarks.landmark):
            x0 = np.int(landmark.x * w)
            y0 = np.int(landmark.y * h)
            cv.circle(image, (x0, y0), 4, (0, 0, 255), 4, cv.LINE_AA)
            if idx == 8 and x1 == -1 and y1 == -1:
                x1 = x0
                y1 = y0
                cv.circle(image, (x1, y1), 4, (0, 255, 0), 4, cv.LINE_AA)
            if idx == 8 and x1 > 0 and y1 > 0:
                x2 = x0
                y2 = y0
                cv.circle(image, (x2, y2), 4, (0, 255, 0), 4, cv.LINE_AA)


    if abs(x1-x2) > 10 and abs(y1-y2) > 10 and x1 > 0 and x2 > 0:
      if x1 < x2:
        cv.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2, 8)
        text = detector.inference_image(image, (x1, y1, x2, y2))
        cv.putText(image, text, (x1, y1), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)
      else:
        cv.rectangle(image, (x2, y2), (x1, y1), (255, 0, 0), 2, 8)
        text = detector.inference_image(image, (x2, y2, x1, y1))
        cv.putText(image, text, (x2, y2), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)


    # Flip the image horizontally for a selfie-view display.
    cv.imshow('MediaPipe Hands', image)
    # out.write(image)
    if cv.waitKey(1) & 0xFF == 27:
      break


cap.release()
# out.release()

左滑查看更多

07

移植到AlxBoard开发板上

在爱克斯开发板上安装好MediaPipe即可,OpenVINO™不用安装了,因为爱克斯开发板自带OpenCV与OpenVINO™,然后就可以直接把python代码文件copy过去,插上USB摄像头,直接使用命令行工具运行对应的python文件,就可以直接用了,这样就在AlxBoard开发板上实现了基于手势选择区域的场景文字识别应用。

运行与测试结果如下:

d899f3a0ad9ec47d8fe7dee34981902b.png

图-5手势选择区域内的场景文字识别

45e932823881c6d94b09d17e36654b10.png

图-6 手势选择区域内的英文识词

08

后续指南

安装语音播报支持包:

pip install pyttsx

AlxBorad开发板是支持3.5mm耳机mic接口,支持语音播报的,如果把区域选择识别的文字,通过pyttsx直接播报就可以实现从手势识别到语音播报了,自动跟读卡片单词启蒙学英语,后续实现一波,请继续关注我们。

OpenVINO™

--END--

你也许想了解(点击蓝字查看)⬇️➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型➡️ 开发者实战系列资源包来啦!➡️ 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️ 还不知道如何用OpenVINO™作画?点击了解教程。➡️ 几行代码轻松实现对于PaddleOCR的实时推理,快来get!➡️ 使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理
扫描下方二维码立即体验 
OpenVINO™ 工具套件 2023.1

点击 阅读原文 立即体验OpenVINO 2023.1

13871193088ce04b65118792a125557e.png

文章这么精彩,你有没有“在看”?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值