Autor: Jia Zhigang, embajador de innovación en Intel Edge Computing
Resumen: OpenVINO+MediaPipe implementa el reconocimiento de texto de escenas basado en la interacción de gestos
Detección de texto de escena OpenVINO
OpenVINO es un marco de implementación de modelos de aprendizaje profundo lanzado por Intel, cuya última versión es OpenVINO2023. OpenVINO2023 viene con Model Zoo, una biblioteca de modelos previamente entrenada que admite varias tareas visuales comunes. El modelo de red que admite la detección de texto de escena proviene del modelo llamado: text-detection-0003 en Model Zoo (red de detección de texto de escena basada en la arquitectura PixelLink ).
Figura-1 Arquitectura del modelo de red PixelLink
Descripción del formato de entrada y salida del modelo de detección de texto de escena PixelLink en la Figura 1
Formato de entrada: imagen en color BGR 1x3x768x1280
Formato de salida:
nombre: "model/link_logits_/add", [1x16x192x320] – salida de pixelLink
nombre: "model/segm_logits/add", [1x2x192x320] – texto de clasificación de píxeles/sin texto
Reconocimiento de texto OpenVINO
El modelo que OpenVINO admite el reconocimiento de texto (números e inglés) es un modelo llamado text-recognition-0012d de Model Zoo, que es un modelo de estructura CRNN típico. (Red de reconocimiento de texto basada en una estructura convolucional VGG similar y un cabezal de codificación y decodificación LSTM bidireccional)
Figura-2 Arquitectura del modelo de red CRNN
Figura-2 Los formatos de entrada y salida del modelo de reconocimiento de texto son los siguientes:
Formato de entrada: 1x1x32x120
Formato de salida: 30, 1, 37
La interpretación de salida se basa en el método de análisis codicioso de CTC, en el que la longitud del juego de caracteres es 37 y el juego de caracteres es: 0123456789abcdefghijklmnopqrstuvwxyz#
# significa en blanco.
Reconocimiento de gestos de MediaPipe
Hablando del kit de desarrollo mediapipe lanzado por Google en 2020, este kit de desarrollo integra varios algoritmos de seguimiento y detección de puntos de referencia, incluidos gestos y posturas. El soporte para el reconocimiento de gestos se implementa a través de dos modelos, uno es para detectar la palma y el otro es para implementar la marca terrestre de la palma.
Figura-3 Descripción del punto de referencia del gesto
Instalación de bibliotecas OpenVINO y MediaPipe
instalación de pip openvino==2023.0.2
pip instalar mediapipe
Primero instale las dependencias del paquete de desarrollo OpenCV-Python .
Instrucciones de creación de aplicaciones
Primero, abra la cámara USB o la cámara web de la computadora portátil basada en OpenCV, lea el cuadro de video y luego complete la detección de puntos de referencia de gestos en cada cuadro. Con base en los datos de puntos de referencia de gestos detectados, obtenga las coordenadas de posición de las puntas del dedo índice de la izquierda. y manos derechas respectivamente (Figura-3) El octavo punto), de esta manera se obtiene el área ROI seleccionada por el gesto. Al mismo tiempo, la imagen del cuadro actual se envía al módulo de reconocimiento de texto de escena OpenVINO para completar Finalmente, se compara el área seleccionada del gesto y el resultado del reconocimiento de texto de la escena, se calcula su relación de intersección de unión y, si el umbral de intersección de unión es mayor que 0,5, se devuelve el resultado del reconocimiento de OCR correspondiente al área y mostrado en la interfaz. Todo el proceso es el siguiente:
Figura-4 Diagrama de flujo de ejecución del programa
Código
De acuerdo con el diagrama de flujo de ejecución del programa en la Figura 4, la parte de detección y reconocimiento de texto de la escena se encapsula en una clase TextDetectAndRecognizer , y el código principal final del programa es el siguiente:
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()
Portado a la placa de desarrollo AlxBoard
Simplemente instale MediaPipe en la placa de desarrollo AIX. No es necesario instalar OpenVINO, porque la placa de desarrollo AIX viene con OpenCV y OpenVINO. Luego puede copiar directamente el archivo de código Python, conectar la cámara USB y usar directamente la línea de comando. herramienta para ejecutar el archivo Python correspondiente
Los resultados de operación y prueba son los siguientes:
Figura-5 Reconocimiento de texto de escena en el área de selección de gestos
Figura-6 Reconocimiento de palabras en inglés en el área de selección de gestos
Siguiente guía:
Instale el paquete de soporte de transmisión de voz:
pip instalar pyttsx
La placa de desarrollo AlxBorad admite la interfaz de micrófono de auriculares de 3,5 mm y admite transmisión de voz. Si selecciona el texto reconocido en el área y lo transmite directamente a través de pyttsx, puede realizar la transición del reconocimiento de gestos a la transmisión de voz. Automáticamente seguirá la tarjeta. palabras para aprender inglés, y se implementará más adelante. Continúe siguiéndonos.