作者:賈志剛英特爾邊緣計算創(chuàng)新大使
01OpenVINO場景文字檢測
OpenVINO是英特爾推出的深度學(xué)習(xí)模型部署框架,當(dāng)前最新版本是OpenVINO2023版本。OpenVINO2023自帶各種常見視覺任務(wù)支持的預(yù)訓(xùn)練模型庫Model Zoo,其中支持場景文字檢測的網(wǎng)絡(luò)模型是來自Model Zoo中名稱為:text-detection-0003的模型(基于PixelLink架構(gòu)的場景文字檢測網(wǎng)絡(luò))。
圖-1 PixelLink網(wǎng)絡(luò)模型架構(gòu)
圖-1中的PixelLink場景文字檢測模型的輸入與輸出格式說明
輸入格式:
1x3x768x1280 BGR彩色圖像
輸出格式:
name: "model/link_logits_/add", [1x16x192x320] – pixelLink的輸出 name: "model/segm_logits/add", [1x2x192x320] – 像素分類text/no text
左滑查看更多
02OpenVINO文字識別
OpenVINO支持文字識別(數(shù)字與英文)的模型是來自Model Zoo中名稱為:text-recognition-0012d的模型,是典型的CRNN結(jié)構(gòu)模型。(基于類似VGG卷積結(jié)構(gòu)backbone與雙向LSTM編解碼頭的文字識別網(wǎng)絡(luò))
圖-2 CRNN網(wǎng)絡(luò)模型架構(gòu)
圖-2文本識別模型的輸入與輸出格式如下:
輸入格式:1x1x32x120
輸出格式:30, 1, 37
輸出解釋是基于CTC貪心解析方式,其中37字符集長度,字符集為:0123456789abcdefghijklmnopqrstuvwxyz#
#表示空白。
03MediaPipe手勢識別
谷歌在2020年發(fā)布的mediapipe開發(fā)包說起,這個開發(fā)包集成了包含手勢姿態(tài)等各種landmark檢測與跟蹤算法。其中支持手勢識別是通過兩個模型實現(xiàn),一個是模型是檢測手掌,另外一個模型是實現(xiàn)手掌的landmakr標(biāo)記。
圖-3手勢landmark點位說明
04OpenVINO與MediaPipe庫的安裝
pip install openvino==2023.0.2 pip install mediapipe
左滑查看更多
請先安裝好OpenCV-Python開發(fā)包依賴。
05應(yīng)用構(gòu)建說明
首先基于OpenCV打開USB攝像頭或者筆記本的web cam,讀取視頻幀,然后在每一幀中完成手勢landmark檢測,根據(jù)檢測到手勢landmark數(shù)據(jù),分別獲取左右手的食指指尖位置坐標(biāo)(圖-3中的第八個點位),這樣就得到了手勢選擇的ROI區(qū)域,同時把當(dāng)前幀的圖像送入到OpenVINO場景文字識別模塊中,完成場景文字識別,最后對比手勢選擇的區(qū)域與場景文字識別結(jié)果每個區(qū)域,計算它們的并交比,并交比閾值大于0.5的,就返回該區(qū)域?qū)?yīng)的OCR識別結(jié)果,并顯示到界面上。整個流程如下:
圖-4程序執(zhí)行流程圖
06代碼實現(xiàn)
根據(jù)圖-4的程序執(zhí)行流程圖,把場景文字檢測與識別部分封裝到了一個類TextDetectAndRecognizer,最終實現(xiàn)的主程序代碼如下:
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開發(fā)板上
在愛克斯開發(fā)板上安裝好MediaPipe即可,OpenVINO不用安裝了,因為愛克斯開發(fā)板自帶OpenCV與OpenVINO,然后就可以直接把python代碼文件copy過去,插上USB攝像頭,直接使用命令行工具運行對應(yīng)的python文件,就可以直接用了,這樣就在AlxBoard開發(fā)板上實現(xiàn)了基于手勢選擇區(qū)域的場景文字識別應(yīng)用。
08后續(xù)指南
安裝語音播報支持包:
pip install pyttsx
AlxBorad開發(fā)板是支持3.5mm耳機(jī)mic接口,支持語音播報的,如果把區(qū)域選擇識別的文字,通過pyttsx直接播報就可以實現(xiàn)從手勢識別到語音播報了,自動跟讀卡片單詞啟蒙學(xué)英語,后續(xù)實現(xiàn)一波,請繼續(xù)關(guān)注我們。
審核編輯:湯梓紅
-
英特爾
+關(guān)注
關(guān)注
61文章
9949瀏覽量
171692 -
開發(fā)套件
+關(guān)注
關(guān)注
2文章
154瀏覽量
24271 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121111 -
OpenVINO
+關(guān)注
關(guān)注
0文章
92瀏覽量
196
原文標(biāo)題:在英特爾開發(fā)套件上打造指哪識哪的OCR應(yīng)用|開發(fā)者實戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論