Cree reconocimiento de texto en vivo con Raspberry Pi (OCR)

En muchos proyectos, la Raspberry Pi se utiliza como cámara de vigilancia o para tareas de aprendizaje automático. Aquí a menudo puede ver texto en imágenes que es de interés para la aplicación. Queremos extraer esto y convertirlo para que podamos analizar el texto con un programa. Este tipo de reconocimiento de texto también es posible con Raspberry Pi, y ni siquiera es difícil. O leemos texto de imágenes estáticas o una transmisión en vivo de la cámara.

En este tutorial, veremos cómo podemos implementar el reconocimiento de texto con Raspberry Pi y qué necesitamos para ello.

Componentes necesarios antes de empezar

La parte principal de la aplicación está puramente basada en software. Por lo tanto, solo necesitamos una pequeña cantidad de hardware para configurar el reconocimiento de texto. Necesitaremos y utilizaremos los siguientes componentes.

Se pueden usar la pantalla, el teclado y el mouse, pero dado que trabajamos de forma remota en Raspberry Pi, no necesariamente los necesitamos.

Por lo tanto, debería haber configurado su Raspberry Pi en consecuencia, así como habilitar SSH y también establecer una conexión de escritorio remoto. Después de eso, podemos empezar directamente.

¿Qué es el reconocimiento de texto (OCR) y cómo funciona en Raspberry Pi?

En resumen, el reconocimiento de texto (reconocimiento óptico de caracteres u OCR para abreviar) en imágenes es más bien un reconocimiento de letras individuales. Si están lo suficientemente cerca, forman una palabra.

Hemos visto en tutoriales anteriores que podemos entrenar un modelo que reconoce objetos en imágenes. Si ahora entrenamos todas las letras (latinas), en lugar de objetos, también podríamos reconocerlas nuevamente por medio de nuestro modelo.
En teoría, esto funciona, pero está asociado con mucho esfuerzo. Las diferentes fuentes, colores, formatos, etc. tendrían que ser entrenados primero. Sin embargo, queremos ahorrar el tiempo necesario para esto.

Por lo tanto, usamos la biblioteca Tesseract de Google. Esto ya incluye dichos modelos y ha sido optimizado por muchos desarrolladores.

Instalación de la biblioteca Tesseract OCR

Podemos compilar Tesseract nosotros mismos o simplemente instalarlo a través del administrador de paquetes. Esto último se hace fácilmente mediante el siguiente comando:

sudo apt install tesseract-ocr

Podemos comprobar fácilmente si la instalación funcionó con tesseract -v.

Ahora ya podemos hacer la primera pequeña prueba. Para eso usaremos esta imagen:Imagen de ejemplo con texto (Fuente)

Puedes descargarlo aquí:

wget https://.de/wp-content/uploads/coffee-ocr.jpg

Luego ejecutamos el siguiente comando:

tesseract coffee-ocr.jpg stdout

La salida se ve así:

Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 554 COFFEE

Entonces, en nuestra imagen de entrada, se reconoció el texto «CAFÉ».

Dado que queremos usar todo en un script de Python, necesitamos algunas bibliotecas como OpenCV y un envoltorio de Python para Tesseract. Instalamos esto a través del administrador de paquetes de Python:

pip3 install opencv-python pillow pytesseract imutils numpy

Prueba de reconocimiento de texto en Raspberry Pi, a través de Python Script

Hasta ahora hemos tratado de reconocer palabras solo en la imagen coloreada sin procesar. Los pasos de preprocesamiento a menudo pueden mejorar el resultado. Por ejemplo, convirtiendo la imagen en color en una imagen en escala de grises. Por otro lado, también podemos intentar detectar bordes dentro de una imagen para resaltar mejor las letras/palabras.

Entonces, comencemos habilitando el reconocimiento de texto en Raspberry Pi usando un script de Python. Para ello, creamos una carpeta y un archivo.

mkdir ocr cd ocr sudo nano example.py

Insertamos el siguiente contenido:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

importar cv2

importar pytesseract

importar numpy como np

de la salida de importación de pytesseract

img_source = cv2.imread(‘imágenes/café.jpg’)

def get_escala de grises (imagen):

devuelve cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

definición de umbral (imagen):

devuelve cv2.umbral(imagen, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

apertura def (imagen):

kernel = np.ones((5, 5), np.uint8)

devuelve cv2.morphologyEx(imagen, cv2.MORPH_OPEN, núcleo)

def astuto (imagen):

devuelve cv2.Canny(imagen, 100, 200)

gris = obtener_escala de grises (img_fuente)

umbral = umbral (gris)

apertura = apertura (gris)

astuto = astuto (gris)

para img en [img_source, gray, thresh, opening, canny]:

d = pytesseract.image_to_data(img, tipo_salida=Salida.DICT)

n_cajas = len(d[‘text’])

# volver a RGB

si len(img.forma) == 2:

imagen = cv2.cvtColor(imagen, cv2.COLOR_GRAY2RGB)

para i en el rango (n_cajas):

si int(d[‘conf’][i]) > 60:

(texto, x, y, w, h) = (d[‘text’][i]D[‘left’][i]D[‘top’][i]D[‘width’][i]D[‘height’][i])

# no mostrar texto vacío

si texto y texto.strip() != «»:

img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

img = cv2.putText(img, texto, (x, y – 10), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 3)

cv2.imshow(‘img’, img)

cv2.esperaClave(0)

Veamos las líneas individuales e interesantes:

  • Importación de las bibliotecas (línea 1-4)
  • Cargue la imagen (línea 5), ​​ajuste la ruta si es necesario.
  • Funciones de preprocesamiento, para convertir a valores grises (líneas 9-23)
  • Línea 32: Aquí extraemos cualquier dato (texto, coordenadas, puntuación, etc.)
  • Para poder colorear los cuadros después, volvemos a convertir la imagen en escala de grises en una imagen con canales de color si es necesario (líneas 36-37)
  • A partir de la línea 39, se colorearán las casillas que tengan una puntuación superior a 60.
  • Para ello extraemos texto, coordenadas de inicio y dimensiones de la caja en la línea 41.
  • Solo si se detectó un texto (no vacío), dibujamos el cuadro (43-45).
  • Luego ejecutamos el script y esperamos a que se presione la tecla de escape (líneas 47/48).

Ahora ejecutamos el script:

python3 example.py

Luego, las 5 imágenes diferentes aparecen una tras otra (presione ESC para que aparezca la siguiente imagen). El texto reconocido está marcado en él. De esta manera, puede determinar qué paso de preprocesamiento es mejor para usted.

Reconocer texto en imágenes en vivo a través de la cámara Raspberry Pi

Hasta ahora, solo hemos usado imágenes estáticas como entrada para nuestro reconocimiento de texto. Ahora, también nos gustaría reconocer textos en la transmisión en vivo de la cámara conectada. Esto requiere solo unos pequeños cambios en nuestro script anterior. Creamos un nuevo archivo:

sudo nano ocr_camera.py

El archivo obtiene el siguiente contenido:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

22

23

24

25

26

27

28

29

30

importar cv2

importar pytesseract

de la salida de importación de pytesseract

tapa = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

mientras que es cierto:

# Captura cuadro por cuadro

ret, cuadro = cap.read()

d = pytesseract.image_to_data(marco, tipo_salida=Salida.DICT)

n_cajas = len(d[‘text’])

para i en el rango (n_cajas):

si int(d[‘conf’][i]) > 60:

(texto, x, y, w, h) = (d[‘text’][i]D[‘left’][i]D[‘top’][i]D[‘width’][i]D[‘height’][i])

# no mostrar texto vacío

si texto y texto.strip() != «»:

marco = cv2.rectangle(marco, (x, y), (x + w, y + h), (0, 255, 0), 2)

marco = cv2.putText(marco, texto, (x, y – 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)

# Mostrar el marco resultante

cv2.imshow(‘marco’, marco)

si cv2.waitKey(1) & 0xFF == ord(‘q’):

descanso

# Cuando todo esté listo, suelte la captura

cap.liberar()

cv2.destroyAllWindows()

Lo que hemos cambiado ahora:

  • En las líneas 5-6, definimos la cámara, en lugar de una imagen fija. La cámara debe estar conectada y reconocida.
  • En la línea 10 leemos el cuadro actual.
  • Aquí hemos omitido los pasos de preprocesamiento, pero también se pueden insertar con bastante facilidad (en la línea 11).

Por último, pero no menos importante, también ejecutamos el script:

python3 ocr_camera.py

Ahora sostenga la cámara sobre un texto y observe cómo se reconocen las palabras:

En mi ejemplo, puede ver bien que una conversión a una imagen de valor gris habría tenido sentido porque la palabra «Tutoriales» es demasiado brillante.

Reconocimiento de texto en idiomas adicionales

Tesseract solo tiene instalado el inglés como idioma predeterminado. Esto lo podemos comprobar con esto:

tesseract --list-langs

Si desea agregar más idiomas en los que se deben reconocer los textos, esto se hace de la siguiente manera:

sudo apt-get install tesseract-ocr-[lang]

Reemplazar [lang] con la abreviatura del idioma (all instala todos los existentes).

Luego puede seleccionar el idioma en el script de Python. Agregue el parámetro:

d = pytesseract.image_to_data(img, lang=’eng’)

Conclusión

Con Tesseract tenemos una poderosa herramienta que proporciona reconocimiento de texto listo para usar para imágenes o marcos. Esto significa que no tenemos que entrenar y crear nuestro propio modelo de aprendizaje automático. A pesar del esfuerzo computacional relativamente alto, el reconocimiento de texto de Raspberry Pi funciona muy bien. El resultado se puede mejorar con varios pasos de procesamiento.

Por cierto, también puede encontrar ambos scripts en el repositorio de Github.