marzo 5, 2021 10:00 am

Jesús

En los últimos dos artículos hablamos sobre machine learning en OpenCV, específicamente sobre cómo crear un clasificador de dígitos escritos a mano, y cómo optimizar automáticamente los hiperparámetros de un Support Vector Machine (SVM).

El día de hoy daremos fin a nuestra pequeña incursión en el mundo de machine learning + OpenCV explorando los diversos modelos que esta librería pone a nuestra disposición.

Al terminar de leer este post habrás aprendido:

  • Cuáles son los diferentes tipos de clasificadores que podemos entrenar en OpenCV.
  • Cómo crear un ranking basado en el desempeño de los modelos en un problema estándar.

¿Estás listo? Iniciemos, pues.

Creación del Entorno de Programación con virtualenv

El proyecto de hoy es extremadamente sencillo, pues se compone de un sólo archivo, datasmarts/tour.py, el cual encapsula la exploración de los múltiples modelos que veremos en breve.

datasmarts
└── tour.py

Para crear el entorno virtual, ejecuta los siguientes comandos:

Luego, instala las librerías que se listan en el extracto inferior:

Haz la instalación efectiva con pip:

pip install -r requirements.txt

Implementación del Script Exploratorio de Algoritmos de Machine Learning en OpenCV

Abre el archivo datasmarts/tour.py e importa los módulos relevantes:

Necesitaremos evaluar el desempeño de cada modelo midiendo su precisión o “accuracy”; para ello usaremos la función compute_accuracy() implementada abajo:

También imprimiremos un ranking de modelos, de mejor a peor, basado en su accuracy. Para ello recibiremos una lista de pares que asocian el nombre de un modelo con su respectiva precisión. Toda la lógica necesaria para armar y mostrar dicho ranking se encuentra en la función print_ranking():

Descarguemos el conjunto de datos digits a través de scikit-learn. Para aprender más al respecto, lee este artículo:

Sólo para darnos una idea de los datos con los que trabajaremos, imprimamos las dimensiones del conjunto de datos, y mostremos en pantalla una imagen de muestra:

Convertimos las imágenes en vectores de 64 elementos (casteados a floats):

Del total de los datos, apartaremos 20% para probar el desempeño del modelo entrenado:

Definimos ahora el grupo de algoritmos que probaremos. OpenCV nos ofrece las siguientes opciones:

Las probaremos todas, salvo por Decision Trees y Artificial Neural Network, Multilayer Perceptron porque, siendo 100% honesto, no pude hacerlos funcionar.

oops

🙁

Ciclaremos por cada modelo para entrenarlo, pero primero, tenemos que tener la precaución de convertir las etiquetas en enteros cuando el clasificador en cuestión sea Logistic Regression, ya que de lo contrario, se rompe:

El resto del procedimiento es el mismo para todos los algoritmos: Entrenamos el modelo, lo corremos sobre el conjunto de pruebas para obtener las predicciones, calculamos su accuracy y añadimos el resultado a results:

Lo último que hacemos es imprimir un ranking de los resultados de los modelos, ordenados de mejor a peor, con base a su accuracy:

Ejecución del Script Exploratorio de Algoritmos de Machine Learning en OpenCV

Para correr el programa, ejecuta este comando en tu terminal:

python datasmarts/tour.py

Verás en pantalla la siguiente imagen de muestra:

Imagen de muestra.

Imagen de muestra.

Y en la consola las dimensiones de los datos:

Dimensiones de los features: (1797, 64)

Por último, en tu terminal verás el ranking de los ocho modelos explorados:

Ranking:
1. KNN: 98.06%
2. Naïve Bayes: 95.28%
3. Random Forest: 93.61%
4. Logistic Regression: 83.61%
5. Expectation Maximization: 25.83%
6. Boosted Trees: 19.44%
7. SVM: 9.17%
8. SGD: 8.89%

Recordemos que no llevamos a cabo ningún tipo de optimización de hiperparámetros en ningún caso. En otras palabras, usamos los modelos con sus valores “por defecto”, por lo que es altamente probable que con un poco de experimentación el orden de este listado varíe drásticamente.

De cualquier manera, vemos que K-Nearest Neighbors, Naïve Bayes y Random Forest conforman el podio, todos con una precisión por encima del 90%, lo cual no está nada mal. 

La varianza en la parte media y baja de la lista es salvaje pues del 83.1% de Logistic Regression, ubicado en el cuarto puesto, bajamos precipitosamente a un 25.83%, cortesía de Expectation Maximization. 

Los últimos dos puestos los ocupan, curiosamente, dos variantes de SVM. Lo chistoso del caso es que en el post anterior demostramos que un SVM con los parámetros correctos puede alcanzar casi un 99% de precisión en este mismo dataset.

¿Ves lo importante que es dar con los parámetros apropiados?

Resumen

En el artículo de hoy nos dimos una vuelta por el módulo ml de OpenCV, donde toda la oferta de algoritmos de machine learning reside.

Descubrimos que OpenCV ofrece desde algoritmos sencillos tales como Logistic Regression, hasta otros bastante más complejos como las redes neuronales.

Evidentemente, la oferta de OpenCV en lo que a ML respecta es bastante limitada cuando se compara con alternativas especializadas como scikit-learn o TensorFlow, pero, en mi opinión, no está nada mal para una librería cuyo enfoque es otro muy distinto.

Es más, me atrevería a decir que OpenCV ofrece una selección bastante razonable y completa dentro del contexto de computer vision, puesto que el 99% de las veces que combinemos ML con CV, será en la forma de clasificadores de features visuales, en vez de complicadas regresiones o unsupervised learning.

Y a ti, ¿qué te parece? Déjame tus comentarios abajo o envíamelos a jesus@datasmarts.net

Ah, y si deseas jugar más con OpenCV y machine learning, puedes descargar el código acá ??

¡Chao!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.