Cree una aplicación OCR que identifique dónde apuntar en la placa de desarrollo AlxBoard

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.

Supongo que te gusta

Origin blog.csdn.net/gc5r8w07u/article/details/133076623
Recomendado
Clasificación