Closed jorgevelap closed 4 years ago
Ok. Entonces todo bien con Cprime.
Tras continuar revisando donde puede estar el error, he visto que la función ChannelsExtractroLUV la primera línea es comprobar que la imagen es tipo CV_8UC3. Cuando realizo estas pruebas con el resto de clases (gradientMag, por ejemplo), veo que cuando realizo el test, el tipo de imagen que se le pasa es CV_8UC3, sin embargo, desde channelsCompute, las imagenes que se le pasan son del tipo CV_32F ya que son las imagenes LUV obtenidas previamente.
Aunque yo las pruebas finales de los valores los resultados son muy parecidos a los de matlab, las variaciones son mínimas, tengo la duda de si esto puede estar afectando negativamente. Estoy revisándolo para hacer alguna prueba mas, pero es que he seguido buscando y no encuentro ninguna diferencia, salvo las pequeñas variaciones que hay entre matlab y el c++.
Por ejemplo, llamando a channelsExtractorLUV, se obtienen estos ejemplos con la misma imagen en algunos de los píxeles:
Matlab C++ 0.3047 ----> 0.343399 0.3056 -----> 0.322325
Todas las comparativas son con diferencias similares a esta, por lo que no detecto donde puede estar el error.
Gracias.
Actualización: Haciendo pruebas sale bien utilizando ambos tipos de imágenes, debido a las conversiones y comprobaciones que se hacen en la clase y chnsPyramid todas las imagenes que retorna son CV_32F.
Tras diversas pruebas realizadas, he visto que había un determinado momento en el que el valor de trace era muy alto, y revisando los cálculos he visto que había un error en margin_vector debido al cálculo de m_wl_weights. Ya esta corregido. He realizado diversas pruebas y el resultado de trace es muy similar al de matlab. Creo que ya son correctos todos los calculos, aun así sigue sin realizar detecciones. No se donde puede estar el error ahora, ya que para diferentes iteraciones con distintos valores, cuando no detecta posible coche muestra siempre los mismos valores min_pos_cost y neg_cost.
No consigo que haga la detección de coche pero parece que todos los valores que utiliza son correctos.
No se cual puede ser el siguiente paso a realizar, ya que la ejecución de badacostDetector parece que realiza correctamente el proceso.
Ya he actualizado los últimos cambios realizados. Gracias.
He continuado con las pruebas para ver donde podía estar el error. No he encontrado nada. lo único que parece que se encuentra entre las líneas del bucle donde obtiene las características, que son parecidas pero no exactamente iguales a las que debería obtener. Después de muchas pruebas sin obtener nada, lo único que se me ocurre es, obtener los valores de la imagen en matlab en YML y compararla para ver la diferencia, y a partir de aquí buscar donde puede estar surgiendo el error.
Por otro lado, coger una de estas escalas completas y utilizarla como imagen sintética y ver si da exactamente los mismos resultados que matlab, aunque no debería salir diferente.
A continuación dejo parte de la comparación de una de las imágenes. Si que parece que hay bastante diferencia entre algunos píxeles.
Gracias.
Yo estoy con el código desde ayer ya muy metido también a ver si encuentro dónde puede estar el problema.
JM.
Vale, muchas gracias.
De todas formas, sigo indicando en este hilo si detecto algo que pueda llevar a error o alguna duda que me pueda surgir.
Con respecto a lo que comente de las diferencias entre imagenes de matlab y c++, lo que se detecta es que hay diferencia en los bordes de los objetos. A continuación, muestro 3 imagenes, una que se obtiene en matlab, otra convertida desde matlab a través de un fichero YAML y la diferencia. Esto es para la primera imagen de la piramide, en la cual se detectan diferencias en los bordes de los objetos.
Gracias.
Actualización de las pruebas Después de las pruebas previas, he comprobado que si en el bucle entra la imagen que aporta matlab se obtiene el mismo resultado, por lo que el error esta en la imagen de la entrada.
Viendo como es la imagen previa a badacostFilters (donde se llama a los filtros), para la primera imagen con la que se ha probado se obtiene un resultado óptimo (ha habido que cambiar el padding, ya que habia diferencia en los bordes, 3 pixeles de borde) y se obtiene el siguiente resultado:
La siguiente prueba que voy a realizar es ver las entradas y salidas de este filtrado, para detectar si esta aquí el error y ver si ayudaría a la solución del problema.
Después de realizar las pruebas de badacostFilters, he visto que el filtrado no se realizaba de forma correcta. he probado utilizando como entrada al filtro la imagen obtenida por matlab y el resultado era erroneo. Creo que había un error en filter2D el cual al cambiar uno de los parametros con los que llamar a la función ha retornado un resultado correcto, ya que la resta entre la imagen de matlab y la de c++ filtrada era una imagen completamente negro. Creo que en esta función se da algún error mas, ya que al ejecutar el código completo todavía hay diferencias, pero cada vez se acerca mas al resultado correcto.
En los primeros casos, todos los valores de K también son iguales tanto en matlab como c++.
Creo que lo siguiente que tengo que hacer es comparar distintas imágenes filtradas a ver si alguna otra esta dando errores.
Gracias.
Perfecto. Cuando pongas un comentario de cambio de algo sencillo en el código me gustaría ver el trozo de código también en el comentario. Asío sabemos qué es lo que has cambiado.
Vale, en el caso del filter2D si que lo he dejado comentado al lado ya que quiero seguir revisándolo para asegurar que todo es correcto. En este caso era del parametro "anchor" de filter2D que indica la posición del kernel respecto a la imagen.
Tras la realización de algunas pruebas, no consigo corregir el error. Las imágenes previas al filtro tanto en matlab como en c++ son prácticamente iguales(adjunto imagen con ambas imágenes, la resta y el máximo y el mínimo de la imagen diferencia). Pero tras pasar los filtros, hay imágenes con mucha diferencia sobre las de matlab y otras que son prácticamente iguales a las de matlab.
Dicho error creo que se da por la función filter2D, ya que si utilizo la imagen de matlab (obtenida a través del yaml) sale también diferente.
Con respecto a estas imágenes, he mirado cuales eran los valores máximos y mínimos de la imagen diferencia, la cual da unos resultados bastante bajos. Ha cambiado con respecto a valores anteriores debido a los bordes, sobre los cuales he realizado una corrección.
He seguido trabajando sobre esa parte del código y no consigo encontrar si está aquí el error o hay algún otro. A continuación dejo uno de los ejemplos de lo que ocurre. Con la misma imagen, utilizando filtros diferentes (dependiendo de la iteración en la que se encuentre) , parece que filtra correctamente o hay muchas diferencias entre las imágenes:
No se si debe haber algún valor previo de la imagen que haga que con un filtro la imagen resultado sea tan diferente a la que debe ser.
Gracias.
El principal problema que teníamos es que en el filtrado de los 10 canales ACF, usábamos cv::filter2D
que implementa una correlación, cuando necesitábamos la convolución (como se usa en Matlab con el conv2). Utilizando la función cv::flip
de OpenCV antes del filter2D implementamos corréctamente el conv2 de Matlab. Ver commit e6ed5dd25f911f7cb881a9364df94dc56dda2279.
Tienes ya el detector en una única escala funcionando en el repo con el commit 00dcae4eb218c61148a1ea342f49801cb80afa57. Voy a mover también la parte de filtrado + ACF (channelsCompute) a una clase nueva que calcule los canales ACF después de filtrarlos (los Locally Decorrelated Channel Features).
Me he equivocado, todavía no he conseguido arreglar el test de ACF.
El detector + "nom maximum suppression" ahora funciona correctamente. Ver commits b80b934782275e57b9d058df5b172d5a23b8e484 (NMS), a3c5e6d35b1db63e1b456484b531b1a1bc6861d6 (corregir la ventana de detección según la clase detectada) y 01ae35245f1bfc9dca563484b6b8ee98b4cd233e (detector).
Probando esta función de Matlab, estoy teniendo el problema cuando llego a la linea 92 en la cual llama a acfDetectBadacostTrees1, me aparece el siguiente error:
Unrecognized function or variable 'acfDetectBadacostTrees1'.
Sin embargo el fichero con la función está en la carpeta private, de la misma forma que estaban por ejemplo gradientMex que si que funcionan. ¿Cuál puede ser el problema?
Gracias