AlxBoard 開発ボード上のどこを指すかを識別する OCR アプリケーションを作成する

著者: Jia Zhigang、インテル エッジ コンピューティング イノベーション アンバサダー

要約: OpenVINO+MediaPipe は、ジェスチャ インタラクションに基づいたシーン テキスト認識を実装します。

OpenVINO シーンテキスト検出

OpenVINO は、Intel が提供する深層学習モデル展開フレームワークであり、最新バージョンは OpenVINO2023 です。OpenVINO2023 には、さまざまな一般的なビジュアル タスクをサポートする事前トレーニング済みモデル ライブラリである Model Zoo が付属しています。シーン テキスト検出をサポートするネットワーク モデルは、Model Zoo (PixelLink アーキテクチャに基づくシーン テキスト検出ネットワーク) の text-detection-0003 という名前のモデルからのものです。 )。

図-1 PixelLink ネットワーク モデル アーキテクチャ

図-1 の PixelLink シーン テキスト検出モデルの入出力形式の説明

入力フォーマット: 1x3x768x1280 BGR カラー画像

出力フォーマット:

名前: "model/link_logits_/add"、[1x16x192x320] – ピクセルリンクの出力

名前: "model/segm_logits/add"、[1x2x192x320] – ピクセル分類テキスト/テキストなし

OpenVINO テキスト認識

OpenVINO がテキスト認識 (数字と英語) をサポートするモデルは、Model Zoo の text-recognition-0012d という名前のモデルで、典型的な CRNN 構造モデルです。(同様の VGG 畳み込み構造バックボーンと双方向 LSTM エンコードおよびデコード ヘッドに基づくテキスト認識ネットワーク)

図-2 CRNN ネットワーク モデルのアーキテクチャ

図-2 テキスト認識モデルの入力形式と出力形式は次のとおりです。

入力形式: 1x1x32x120

出力形式:30、1、37

出力の解釈は、CTC 貪欲解析方式に基づいており、文字セットの長さは 37 で、文字セットは 0123456789abcdefghijklmnopqrstuvwxyz# です。

# は空白を意味します。

MediaPipe ジェスチャ認識

2020年にGoogleがリリースしたmediapipe開発キットと言えば、ジェスチャーや姿勢を含むさまざまなランドマーク検出・追跡アルゴリズムが統合された開発キットです。ジェスチャ認識のサポートは、手のひらを検出するモデルと、手のひらのランドマーク マークを実装するモデルの 2 つを通じて実装されます。

図-3 ジェスチャのランドマーク ポイントの説明

OpenVINO および MediaPipe ライブラリのインストール

pip install openvino==2023.0.2

pip インストールメディアパイプ

最初に OpenCV-Python 開発パッケージの依存関係をインストールしてください

アプリのビルド手順

まず、OpenCV に基づいて USB カメラまたはノートブック Web カメラを開き、ビデオ フレームを読み取り、各フレームでジェスチャ ランドマークの検出を完了し、検出されたジェスチャ ランドマーク データに基づいて、左手の人差し指先端の位置座標を取得します。 (図-3の8番目の点)、このようにして、ジェスチャによって選択されたROI領域が取得され、同時に現在のフレームの画像がOpenVINOシーンテキスト認識モジュールに送信されて完了します。最後に、ジェスチャ選択領域とシーンテキスト認識結果を比較し、それらの和集合率を計算し、和集合閾値が0.5より大きい場合、その領域に対応するOCR認識結果を返し、インターフェイスに表示されます。全体のプロセスは次のとおりです。

図-4 プログラム実行フローチャート

コード

図 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()

AlxBoard 開発ボードに移植

AIX 開発ボードに MediaPipe をインストールするだけです。AIX 開発ボードには OpenCV と OpenVINO が付属しているため、OpenVINO をインストールする必要はありません。その後、Python コード ファイルを直接コピーし、USB カメラを接続し、コマンド ラインを直接使用できます。対応する

動作とテスト結果は次のとおりです。

図-5 ジェスチャ選択領域でのシーンテキスト認識

図-6 ジェスチャ選択エリアでの英単語認識

次のガイド:

音声ブロードキャスト サポート パッケージをインストールします。

pip インストール pyttsx

AlxBorad 開発ボードは 3.5mm ヘッドフォン マイク インターフェイスをサポートし、音声ブロードキャストをサポートします。エリア内で認識されたテキストを選択し、pyttsx を通じて直接ブロードキャストすると、ジェスチャ認識から音声ブロードキャストへの移行を実現できます。カードに自動的に追従します。英語を学ぶための単語、今後も実装予定ですので、引き続きフォローしてください。

おすすめ

転載: blog.csdn.net/gc5r8w07u/article/details/133076623