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:
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.
- Descargar código: OpenCV-Tensorflow.zip.
ResponderEliminarLa 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!