Procesamiento de Imágenes en Dart con TensorFlow
Clase 8 de 29 • Curso de Integración Módulos Nativos iOS/Android para Flutter
Resumen
Para integrar modelos de TensorFlow en aplicaciones Dart y procesar imágenes reales desde el dispositivo, primero debes modificar la funcionalidad inicial del servicio para recibir un archivo de imagen en lugar de un input generado mediante código. Este ajuste permite una mejor interacción con imágenes reales tomadas de la galería del dispositivo.
¿Qué cambios necesitas hacer en la carga del modelo?
La carga del modelo de TensorFlow se mantiene sin modificaciones. Lo principal es ajustar la manera en que tu aplicación recibe la imagen. Anteriormente usabas un listado generado en código, pero ahora recibirás un archivo directo, denominado image file. Recuerda importar las librerías adecuadas de Dart específicamente para manejar archivos de imagen.
¿Cómo procesar imágenes en Dart?
El procesamiento implica convertir la imagen y reducir su tamaño para que el modelo interprete con mayor eficiencia. Esto se logra mediante distintas funciones disponibles en la librería image.dart previamente instalada:
- Usa la función
decode image
para transformar y decodificar el archivo de imagen recibido. - Redimensiona la imagen usando
copy resize
, proporcionándole las dimensiones requeridas por tu modelo TensorFlow, generalmente 224x224 píxeles.
El siguiente código ejemplifica cómo manejar esta conversión:
var imageInput = img.decodeImage(await imageFile.readAsBytes());
var resizeImage = img.copyResize(imageInput, width: 224, height: 224);
¿Cómo convertir imágenes al formato que necesita TensorFlow?
Luego del redimensionamiento, transforma la imagen a píxeles y normaliza sus colores basándote en el sistema RGB, con valores de 0 a 1:
- Realiza un recorrido por los valores del alto y ancho de la imagen.
- Usa
getPixel(x, y)
para obtener el valor RGB del píxel. - Normaliza cada valor RGB al dividirlo entre 255 para llevarlo a un rango entre 0 y 1.
Ejemplo de normalización en código:
var pixel = resizeImage.getPixel(x, y);
input[0][y][x][0] = pixel.r / 255;
input[0][y][x][1] = pixel.g / 255;
input[0][y][x][2] = pixel.b / 255;
¿Qué hacer si no recibes imágenes?
Introduce un estado inicial neutro o de base en caso de no recibir imágenes, asegurando la estabilidad y funcionalidad continua de tu aplicación:
var input = List.generate(1, (_) => List.generate(224, (_) => List.generate(224, (_) => List.generate(3, (_) => 0))));
Esto previene errores y asegura que tu modelo siempre reciba entradas válidas.
¿Cómo ejecutar y cerrar correctamente el intérprete?
Finalmente, para obtener los resultados, ejecuta el intérprete de TensorFlow con las entradas (input
) y salidas (output
) indicadas. Al finalizar, no olvides cerrar adecuadamente el intérprete para administrar correctamente los recursos de la aplicación:
interpreter.run(input, output);
interpreter.close();
Te invitamos a comentar qué otros escenarios o dudas encuentras al implementar modelos de TensorFlow en aplicaciones Flutter usando Dart.