Hola de nuevo, ahora relataremos los problemas encontrados a la hora de usar los programas "createsamples.cpp", "haartraining.cpp" y "performance.cpp".
Createsamples: Es un programa que te permite generar archivos .vec de las muestras tomadas indicadas anteriormente y estos archivos valen para luego manejar el haatraining, que se explica a continuación.
Para empezar, el primer problema al que nos encontramos era una conjunción de dos problemas que no decubrimos hasta usar el haartraining, uno nuestro y otro propio del OpenCV al cual navegando por la red encontramos solución; primero, nosotros decidimos usar un tamaño de imagen de 220x270, el cual resulto ser demasiado grande y hacía saltar el programa por problemas con la memoria RAM, y no por falta física de esta en el equipo, sino porque el propio Visual Studio no permitía manejar más. Por otro lado, por un error en el programa cvhaartraining.cpp de OpenCv, las muestras tomadas por el createsamples han de ser cuadradas, aunque nosotros, una vez encontrado el código a modificar, pudimos manejarnos con muestras no cuadradas.
Finalmente, una vez descubiertos y corregidos todos estos errorres, llegamos a la conclusión, tras varios intentos de que el tamaño óptimo para las muestras generadas por el createsamples era un 20% de nuestas imágenes, previa conversión de estas a 210x270 píxeles, es decir, nuestras muestras ahora son de 42x57 píxeles, ya que nos permitía mantener la proporción de las imágenes y nos daba un tamaño suficientemente aceptable para trabajar con ellas.
Por otro lado, pese a que nuestros
compañeros del año pasado explicaron bastante bien las variables de estos 3 programas, nos gustaría hacer alguna pequeña anotación al margen a estas explicaciones....
-width y height: son las dimensiones de la muestra, es decir, la imagen que le pasemos y que le indiquemos con el infoname adoptará ese tamaño, da igual si la imagen origen fuera de 1024x768 o de otras dimensiones, si los valores son de 42x57, toda la imagen quedará reducida a esas dimensiones, no se harán múltiples partes de 42x57 hasta cubrir toda la imagen, por eso es bueno que las dimensiones sean proporcionales a la imagen origen.
Haartraining: Con este programa, fué con el que más problemas hemos tenido, ya que es le que nos mostraba los problemas del createsamples.
El primer problema que hemos tenido, ha sido el ya explicado de que las muestras eran demasiado grandes.
Por otro lado, nos encontramos al usar tamaños de muestras muy pequeñas, de unos 5x5 o 10x10, el modelo entrenado era bastante poco fiable, lo cual nos llevó a la conclusión de que teníamos que hacer las muestras lo más grandes y proporcionales posibles ya que luego las imágenes que le pasaremos al sistema para testearlo serán más grandes, ya que por problemas con OpenCV que aún no hemos sabido como resolver, las imágenes que tenemos que introducirle al testeador, han de ser más grandes.
Por otro lado, nos encontramos con otro problema de origen desconocido que provocaba que al introducir un archivo con extensión .dat para las muestras negativas, en algunos casos, saltaba un error ya que un método del cvhaartraining intentaba coger una parte inexistente de una imagen. Para solucionar dicho error, probamos a usar como imágenes negativas ya el archivo formateado a .vec lo cual nos ha repercutido en la eliminación de dicho error así como en una reducción bastante considerable del tiempo de proceso del entrenador, ya que el cálculo que realiza antes de cada etapa de entrenamiento crecia rápidamente (llegando a superar los miles de segundos) si usábamos las imágenes en .dat, y si las pasábamos como .vec, este se mantiene constante por debajo del segundo.
Además, probamos a usar un sistema con varias divisiones modificando la variable
maxtreesplits, pero esta solo aumentaba el tiempo de proceso de este programa y no encontramos grandes mejoras que justificaran ese proceso extra, ya que también, si no ajustabas bastante bien la variable
minpos, muchas veces no realizaba todas las divisiones.
Finalmente, cabe reseñar que hemos logrado entender como funciona ya este programa y tenemos un modelo (el mío) medianamente válido operativo y ahora estamos generando dos nuevos modelos, uno para mi compañero Alejandro, y otro para mi con una serie de correcciones en las muestras negativas para tratar de mejorar la fiabilidad del actual, aunque el proceso de generación de modelos nos está provocando una gran carga de trabajo para el procesador que nos hemos visto obligados a solicitar ayuda al profesor que nos dirige la práctica, Fernando, para poder usar un par de ordenadores multinúcleo del laboratorio en los que ahora mismo se están generando ambos modelos con un tiempo estimado de duración de unos 7-8 días completos.
Performance: Este ha sido el programa que menos quebraderos de cabeza nos ha causado ya que es el último de toda la etapa de consecución de imágenes y modelos, aunque nos ha provocado un par de inconvenientes.
El primero ha sido que a la hora de testear nuestros modelos y por consiguiente futuras imágenes, hemos visto que no nos permitía hacerlo con imágenes de las mismas dimensiones que las empleadas para generar los modelos, por lo que nos hemos visto obligados a tocar las variables maxSizeDiff y scale_factor, detalle del que nos dimos cuenta tras varios intentos infructuosos de lograr que el modelo funcionara correctamente.
El segundo quebradero de cabeza ha sido el descubrir como hacer para modificar el umbral de decisión que usa el propio programa, que al final encontramos que modificando la variable scale_factor, se modificaba dicho umbral llegando a conseguir variaciones en la precisión del modelo que provocaban la no detección de ninguna imagen positiva hasta la detección máxima que el modelo es capaz de ofrecernos.
Más adelante, cuando tengamos los modelos definitivos, colgaremos alguna imagen de los 'logs' que generan por consola de comando los programas haartraining y preformance (el createsamples es irrelevante) con las explicaciones oportunas de que significa cada una de sus partes.
Por último, también queríamos reseñar que para agilizar la tarea del haartraining, decidimos activar el HyperTreading en todo el programa, ya que es una opción que permite usar el 100% de todos los nucleos de los que disponga el ordenador en el que se esté ejecutando el programa (siempre y cuando este esté programado para activar el HyperTreading).
Para hacer este 'upgrade', simplemente hay que irse al proyecto de Visual Studio deseado, que en nuestro caso fueron todos, y en Propiedades --> C/C++ --> Lenguaje, activar la opción de Compatibilidad con OpenMP.
Un saludo, y hasta la próxima.