著者: 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 を通じて直接ブロードキャストすると、ジェスチャ認識から音声ブロードキャストへの移行を実現できます。カードに自動的に追従します。英語を学ぶための単語、今後も実装予定ですので、引き続きフォローしてください。