Cargar modelos Tensorflow en OpenCV DNN

DNN es un módulo desarrollado para trabajar con redes neuronales profundas, anteriormente este debía se instalado desde opencv_contrib pero a partir de la versión 3.3 ya forma parte oficial de OpenCV por lo que no se requieren dependencias externas.

Podremos cargar y utilizar modelos pre-entrenados provenientes de los frameworks mas conocidos como:

Detección de objetos OpenCV - Tensorflow

Para nuestro ejemplo vamos a realizar detección de objetos, para ello utilizaremos un modelo pre-entrenado con Tensorflow usando el dataset COCO, lo primero que debemos saber es que requerimos tener dos archivos, primero el modelo “.pb”, lógicamente, y segundo el archivo de configuración del mismo “.pbtxt”, los enlaces a ambos archivos estarán incluidos en el al final de la publicación junto con el código fuente C++ del ejemplo.

auto net = dnn::readNet("../data/frozen_inference_graph.pb", "../data/ssd_mobilenet_v2_coco_2018_03_29.pbtxt");

Lo primero, usar la función dnn::readNet(...) para cargar el modelo, esto nos devuelve un objeto cv::dnn::Net que representa una red neuronal artificial.

auto blob = dnn::blobFromImage(src, 1, Size(300, 300));
net.setInput(blob);

Lo siguiente será procesar la imagen que deseamos analizar para convertirla en una entrada válida para la red, este propósito lo cumple la función dnn::blobFromImage(...), para nuestro caso le pasaremos tres parámetros: imagen, factor de escala y tamaño, este último será 300x300 ya que es lo que nos exige el modelo que estamos utilizando.

std::vector<Mat> outs;
net.forward(outs);

Ya para finalizar usaremos el método forward(...) de la clase Net para realizar la predicción, es decir, iniciamos la red neuronal y obtenemos nuestro resultado.

Lo que resta ahora es interpretar los datos que nos ha devuelto la red, esto será un blob que tendrá la forma 1x1xNx7 en donde N es el numero de detecciones, por cada detección tendremos las siguiente información: [batchId, classId, confidence, left, top, right, bottom]

Veamos en código para dibujar un rectángulo sobre el objeto detectado, le añadiremos el classId y confidence.

float confThreshold = 0.50;
for (size_t k = 0; k < outs.size(); k++)
{
   float* data = (float*)outs[k].data;
   for (size_t i = 0; i < outs[k].total(); i += 7)
   {
    float confidence = data[i + 2];
    if (confidence > confThreshold)
    {
     int left   = (int)data[i + 3];
     int top    = (int)data[i + 4];
     int right  = (int)data[i + 5];
     int bottom = (int)data[i + 6];
     int width  = right - left + 1;
     int height = bottom - top + 1;

     if (width * height <= 1)
     {
      left   = (int)(data[i + 3] * image.cols);
      top    = (int)(data[i + 4] * image.rows);
      right  = (int)(data[i + 5] * image.cols);
      bottom = (int)(data[i + 6] * image.rows);
      width = right - left + 1;
      height = bottom - top + 1;
     }

     int idx = (int)(data[i + 1]) - 1;

     rectangle(image, Rect(left, top, width, height), Scalar(255, 0, 255));
    
     putText(image, String(class_names[idx]), Point(left, top), 1, 2.0, Scalar(255, 128, 128));
     putText(image, String(to_string(confidence)), Point(left, bottom), 1, 2.0, Scalar(128, 128, 255));

    }
   }
}

Ejecutando este código tendremos el siguiente resultado:
OpenCV Tensorflow Deteccion de objetos

En el siguiente enlace puedes descargar el modelo Tensorflow pre-entrenado: frozen_inference_graph.pb y el archivo de configuración aquí: ssd_mobilenet_v2_coco_2018_03_29.pbtxt debes copiarlo en la carpeta data o modificar el código para apuntar a este archivo.

Comentarios


  1. La integración de carga de modelos TensorFlow en OpenCV DNN es un paso estratégico que aprovecha lo mejor de ambas tecnologías. Al utilizar la potencia de TensorFlow para el entrenamiento y la creación de modelos y la versatilidad de OpenCV DNN para la inferencia en tiempo real, estás construyendo una solución robusta y eficiente para tareas de visión por computadora. Además, tu atención a la ciberseguridad refleja una perspectiva avanzada y proactiva en la protección de la aplicación y los datos. La seguridad es una prioridad clave en el desarrollo de software, y al agregar servicios de ciberseguridad, estás garantizando no solo un rendimiento óptimo sino también la integridad y privacidad de la información. La combinación de estas tecnologías junto con medidas de ciberseguridad contribuye a crear una aplicación tecnológica avanzada y segura. Este enfoque holístico no solo demuestra habilidades técnicas, sino también una consideración ética y responsable hacia la protección de datos en un entorno digital en constante cambio. En resumen, tu trabajo en cargar modelos TensorFlow en OpenCV DNN y fortalecer la seguridad con servicios de ciberseguridad refleja un enfoque equilibrado y avanzado hacia la implementación de soluciones tecnológicas. ¡Un logro impresionante!

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API