franyack / IMachineApp

This Android application uses the CIEngine module to automatically manage the photos and images on the device. Then you will be able to manage the result according to your criteria, by moving or erasing images as you want.
1 stars 0 forks source link

Probar que la aplicación puede levantar TensorFlow #5

Closed franyack closed 6 years ago

franyack commented 6 years ago

Debido a que Tensorflow parece la dependencia más importante con la que contará la aplicación, es necesario que en el prototipo 1 se realice la integración con TensorFlow Lite asegurando que la misma levante la biblioteca (usando loggers por ejemplo). Además si es posible, se use alguna funcionalidad afín de asegurar que al momento de integrar la app con el motor de procesamiento no sea mas que ajustar las llamadas para la comunicación entre ellos.

franyack commented 6 years ago

Pude integrar TensorFlow Lite al proyecto existente! (ad0e83c8482464f65f26618e30c68c44b56de246) Gracias a este ejemplo: https://github.com/amitshekhariitbhu/Android-TensorFlow-Lite-Example, el cual usa una mobilenet para detectar objetos en una foto sacada por la cámara, pude integrar TensorFlow Lite a lo realizado hasta el momento. Si bien habrá que arrancar nuevamente el proyecto Android (ya que no es necesario usar archivos .cpp según el nuevo enfoque, y si no entiendo mal tampoco será necesario usar OpenCV (a debatir)), este prototipo será de gran ayuda para pasar bien en limpio el código aprovechando todo lo experimentado hasta el momento.

Lo que se hace con TensorFlow Lite es convertir los grafos a un formato .tflite (partiendo de uno .pb) y recibe las imágenes como objeto Bitmap, luego las convierte en un buffer de bytes y se obtiene como resultado una lista de Recognition que son los diferentes labels y su probabilidad. De ahí en adelante deberíamos aplicar la lógica de jerarquía de labels, coeficiente de pearson, matriz de afinidad, etc.

Lo próximo que voy a hacer es probar la funcionalidad y ver lo que devuelve, revisar los tiempos de procesamiento, etc.

ldvignolo commented 6 years ago

Genial Fran, buenisimo! Lo de OpenCV diría de dejarlo pendiente por ahora, quizás lo necesitemos. Por ejemplo, Marcelo te había sugerido un preprocesamiento cuando presentaste el TP de imágenes, pero no recuerdo bien qué era... Vos te acordás?

Dr. Leandro Daniel Vignolo Assistant Professor | Assistant Research Scientist sinc(i), FICH-UNL/CONICET, Santa Fe, Argentina www.sinc.unl.edu.ar | Tel: +54 (342) 4575233 ext 117

2018-04-17 18:39 GMT-03:00 franyack notifications@github.com:

Pude integrar TensorFlow Lite al proyecto existente! (ad0e83c https://github.com/franyack/IMachineApp/commit/ad0e83c8482464f65f26618e30c68c44b56de246 ) Gracias a este ejemplo: https://github.com/amitshekhariitbhu/Android- TensorFlow-Lite-Example, el cual usa una mobilenet para detectar objetos en una foto sacada por la cámara, pude integrar TensorFlow Lite a lo realizado hasta el momento. Si bien habrá que arrancar nuevamente el proyecto Android (ya que no es necesario usar archivos .cpp según el nuevo enfoque, y si no entiendo mal tampoco será necesario usar OpenCV (a debatir)), este prototipo será de gran ayuda para pasar bien en limpio el código aprovechando todo lo experimentado hasta el momento.

Lo que se hace con TensorFlow Lite es convertir los grafos a un formato .tflite (partiendo de uno .pb) y recibe las imágenes como objeto Bitmap, luego las convierte en un buffer de bytes y se obtiene como resultado una lista de Recognition que son los diferentes labels y su probabilidad. De ahí en adelante deberíamos aplicar la lógica de jerarquía de labels, coeficiente de pearson, matriz de afinidad, etc.

Lo próximo que voy a hacer es probar la funcionalidad y ver lo que devuelve, revisar los tiempos de procesamiento, etc.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/franyack/IMachineApp/issues/5#issuecomment-382156648, or mute the thread https://github.com/notifications/unsubscribe-auth/APJ-G4qyk79mhrdCQ4tjTUy6vjh1xBGZks5tpmD_gaJpZM4TQv0G .

franyack commented 6 years ago

Si, me había sugerido probar que, antes de hacer el resize obligatorio que pide la mobilenet (convertir la imagen a un tamaño de 224x224 pixeles), primero haga todas las imágenes cuadradas rellenando con pixel 0 (color negro) cuando la imagen sea mas chica. Esta recomendación era debida a que, al hacer un resize crudo, quizás se podrían perder objetos o detalles importantes de la imagen. Se me ocurre que para resolverlo primero debería buscar la imagen mas grande del lote, hacerla cuadrada y con estas medidas hacer un resize a todas las otras. De todas maneras, buscando un poco más de información sobre bitmap, hay una manera de hacer este "escalado" mediante esta clase, sin convertir la imágen a un cuadrado primero, afín de no cargar la imagen entera en memoria. Por ejemplo acá hablan sobre eso: https://stackoverflow.com/questions/17839388/creating-a-scaled-bitmap-with-createscaledbitmap-in-android Y en la API de Android también recomiendan darle este tratamiento: https://developer.android.com/topic/performance/graphics/load-bitmap.html

Hoy si puedo pruebo esto y empiezo con las mediciones de tiempo de procesamiento, etc!

leferrad commented 6 years ago

En todo caso, lo que habíamos dicho era que si había que hacer algo de pre-procesamiento con OpenCV tenía que ser suficiente con la API que tiene en Java: http://opencv-java-tutorials.readthedocs.io/en/latest/ Podríamos chequear eso más adelante para quedarnos tranqui que no necesitaríamos más integrar Java con C++.

ldvignolo commented 6 years ago

Perfecto, de acuerdo con todo. Fran, lo que no me quedó claro es porque querés buscar la imagen más grande del lote, si de todas maneras el tamaño es fijo en 224x224 pixeles. Entonces porqué decís de hacer un resize con las medidas de la más grande. Para mi directamente la idea es hacerlas cuadradas a todas y luego escalarlas a 224x224, nada más. Porque según entiendo no interesa el tamaño relativo entre objetos, ¿o si?

Saludos

Dr. Leandro Daniel Vignolo Assistant Professor | Assistant Research Scientist sinc(i), FICH-UNL/CONICET, Santa Fe, Argentina www.sinc.unl.edu.ar | Tel: +54 (342) 4575233 ext 117

2018-04-18 10:02 GMT-03:00 Leandro Ferrado notifications@github.com:

En todo caso, lo que habíamos dicho era que si había que hacer algo de pre-procesamiento con OpenCV tenía que ser suficiente con la API que tiene en Java: http://opencv-java-tutorials.readthedocs.io/en/latest/ Podríamos chequear eso más adelante para quedarnos tranqui que no necesitaríamos más integrar Java con C++.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/franyack/IMachineApp/issues/5#issuecomment-382378466, or mute the thread https://github.com/notifications/unsubscribe-auth/APJ-G7LGONHBb83PxHs8PdxH6i9dsBleks5tpzlegaJpZM4TQv0G .

franyack commented 6 years ago

Exacto Lelo, tenes toda la razón, no importa el tamaño relativo entre las imágenes, por lo que no sería necesario buscar la imagen mas grande. Ayer estuve haciendo bastantes pruebas (usando la mobilenet), esta tarde cuando vuelvo del trabajo commiteo todo y les cuento en detalle lo que hice, problemas que surgieron, etc!

franyack commented 6 years ago

En este commit: df493c65b7087b6c87ae28dc730be2421afb1367 pude usar el método de clasificación de la mobilenet, recibiendo los tags por cada una de las imágenes. En principio anda bien, pero ocurren algunas situaciones a destacar:

Cuando se inicia la app y uno manda a procesar las imágenes, la mayoría de las veces muestra la pantalla "working" de manera correcta, y una vez que termina de hacer todo el proceso, muestra el resultado. La verdad que eso me dejó contento, en principio era lo que esperábamos! Pero como anticipé antes, ocurre algunas veces (pocas) que uno inicia la app y manda a procesar y la pantalla se pone en negro (similar a cuando llamábamos a las funciones en C++).

Otra situación rara es que cuando se hace click en el botón volver, una vez que están los resultados, y se manda a procesar otro lote de imágenes o el mismo, ahí si siempre la pantalla se pone negra hasta obtener los resultados. Creería que siguen trayendo problemas los benditos hilos. Estuve leyendo, investigando y probando y no puedo encontrar nada que solucione este problema. Si bien el ciclo normal de la app terminada no arrojará un botón volver apenas se terminen de procesar las imágenes, es obvio que este bug a futuro traerá dolores de cabeza, y sería correcto resolverlo ahora. El tema es como jaja

Probé muchas alternativas, como cerrando la aplicación desde el menú de tareas y volviéndola a ejecutar pero no da resultado, solo resta esperar un tiempo (debe ser que Android después de cierto tiempo termina matando todos los procesos de las aplicaciones inactivas), y la aplicación se comporta otra vez de manera correcta.

franyack commented 6 years ago

Ataqué el problema mencionado en el último comentario de una manera barata y que de momento puede resultar efectiva. En este commit (63c81b8083ea7216a2fa8aaef14e1181e42ca228) lo que hago es agregar un AlertDialog el cual le avisa al usuario que posiblemente la pantalla se ponga en negro durante el procesamiento. Acá va una imagen de ejemplo:

screenshot_1524521870

Una vez que termina de hacer todo el proceso, arroja los resultados tal cual lo venía haciendo. Creo que con esto podemos dejar de momento de pensar en los problemas con hilos y seguir adelante con los demás requisitos.