Trabajando con Computer Vision aprecio que estamos muy limitados por las máquinas que usamos, o tiene mucho sentido montar GPUs en casa del tamaño del aire acondicionado y por supuesto no tiene sentido el consumo energético que implica. Aquí estoy yo montando una GPU para el análisis de imágenes.

Este tema implica que la Computer Vision no la podrá usar el común de los data scientist, a los necesarios conocimientos técnicos y matemáticos se añade el disponer de unos recursos tecnológicos que no están al alcance de cualquiera. Sin embargo, los conocimientos técnicos y matemáticos los puedes adquirir o puedes aprovecharte de los entornos colaborativos. Pero podemos iniciarnos en el reconocimiento de imágenes con R y la librería OpenCV y, si salen algunos temas en los que estoy enredando, es posible que la reducción de dimensionalidad y la geometría nos ahorre máquinas y energía.

Vamos a emplear dos ejemplos para ver las posibilidades de OpenCV más R. Partimos de una primera imagen en la que hay 4 personas jugando al fútbol y un balón está volando en el aire. Siento no saber de dónde saqué esta foto; si tiene algún tipo de derecho hacédmelo llegar.

library(opencv)
library(tidyverse)

ub = "/images/2020/11/futbol.png"

futbol <- ocv_read(ub)

Tenemos la imagen cargada y empezar por ocv_edges(futbol) para ver los límites de las imágenes:

Con ocv_face(futbol) podemos ver las caras que identifica:

Una de las caras de perfil no la identifica el algoritmo, pero sí ha funcionado con el balón. Y con ocv_markers(futbol) podemos trazar las marcas, que es una de las vías en las que estoy trabajando para el reconocimiento de caras:

Podemos combinar funciones pero siempre con sentido; por ejemplo, esto nos produciría un error: futbol %>% ocv_grayscale() %>% ocv_markers() ¿por qué motivo?

Este trabajo lo podemos emplear para contar personas en fotografías. Otro ejemplo sería partiendo de una imagen de la selección española que tampoco tengo muy claro de dónde salió:

Vamos a contar personas y para ello propongo el uso de la función ocv_facemask:

library(opencv)
library(tidyverse)
ub2 = "/images/2020/11/seleccion.png"
seleccion <- ocv_read(ub2)

personas <- ocv_facemask(seleccion)
nrow(attr(personas, 'faces'))

A la vista está que ha contado una persona de más. Hay un pliegue en un pantalón que está llevando a error al algoritmo; sólo tenéis que ver el objeto personas. Para evitar el problema podríamos hacer:

ocv_read(ub2) %>% ocv_blur() %>% ocv_face()

Al difuminar la imagen con ocv_blur desaparece el problema en esta foto, pero no podemos generalizar; probad a hacer lo mismo en la foto anterior. El empleo de OpenCV con R no es complejo pero tiene sus limitaciones si queremos sofisticar nuestros análisis. Veremos qué pasa con la geometría.