Opencv 3.3 viene con un módulo ( dnn ) muy mejorado y eficiente que lo hace ideal para usar el aprendizaje profundo con OpenCV. Todavía no puede entrenar modelos en OpenCV, y probablemente no tengan ninguna intención de hacer algo así, pero ahora puede usar fácilmente el procesamiento de imágenes y usar los modelos pre-entrenados para hacer predicciones usando el módulo dnn .
Esta nueva versión es compatible con una serie de grandes marcos que incluyen:
- tensorflow
- Antorcha
- café
Objetivo
En este artículo, lo guiaremos a través de todo el proceso de usar un modelo previamente entrenado, cargarlo usando el módulo dnn , preprocesar imágenes usando el método blobfromImage en OpenCV y finalmente hacer predicciones.
Hay dos formas de cargar modelos desde marcos en OpenCV:
- Si desea importar el modelo directamente, use cv2.dnn.createCaffeImporter o cambie el caffe a Torch o Tensorflow, según el marco que esté usando.
- Si desea cargar desde el disco, use cv2.dnn.readNetFromCaffe
Tomaremos el modelo de café Mobile_net_ssd para la detección de objetos como ejemplo para comprender cómo funciona el módulo dnn. Y usaremos el segundo enfoque, es decir, descargando los archivos del modelo y cargando el modelo usando el módulo dnn .
Descargue los archivos del modelo e instale las dependencias
Puede descargar el modelo mobile_net_ssd aquí: https://github.com/chuanqi305/MobileNet-SSD/
pip install opencv-python dlib imutils
Cargue el modelo:
Como estamos usando el modelo caffe , usaremos el módulo cv2.dnn.readNetFromCaffe para cargar nuestro modelo. Necesitará estos dos tipos de archivos para trabajar con cualquier modelo previamente entrenado usando el módulo dnn:
- Archivo .prototxt : básicamente contienen una lista de las capas de red en el modelo que está utilizando.
- Archivo caffemodel (en su caso puede que no sea un modelo Caffe): Este archivo contiene los pesos del modelo.
Necesita ambos archivos para crear el modelo, pasaremos estos dos archivos como argumentos al módulo cv2.dnn.readNetFromCaffe para crear nuestro modelo.
#—–Rutas de los archivos del modelo——–#
proto_file = ‘Modelo/MobileNetSSD_deploy.prototxt.txt’
model_file = ‘Modelo/MobileNetSSD_deploy.caffemodel’
Ahora que tenemos las rutas de nuestros archivos, cargaremos nuestro modelo:
#———Cargar el modelo——–#
net = cv2.dnn.readNetFromCaffe(proto_file,model_file)
Antes de usar este modelo para la predicción, debemos preprocesar nuestra imagen para configurarla según los requisitos de la entrada de nuestro modelo, y esto difiere de un modelo a otro.
Preprocesamiento de imágenes
Así que definiremos algunas variables para el preprocesamiento de imágenes.
#——Etiquetas de clase del modelo——–#
classNames = { 0: ‘fondo’,
1: ‘avión’, 2: ‘bicicleta’, 3: ‘pájaro’, 4: ‘barco’,
5: ‘botella’, 6: ‘autobús’, 7: ‘coche’, 8: ‘gato’, 9: ‘silla’,
10: ‘vaca’, 11: ‘mesa de comedor’, 12: ‘perro’, 13: ‘caballo’,
14: ‘moto’, 15: ‘persona’, 16: ‘planta en maceta’,
17: ‘oveja’, 18: ‘sofá’, 19: ‘tren’, 20: ‘tvmonitor’ }
#——–Parámetros de escala——#
input_shape=(300,300) #la forma requerida para que la imagen de entrada pase a nuestro modelo
mean = (127.5,127.5,127.5) #tendremos que normalizar los píxeles de la imagen y usaremos este valor medio para hacerlo
scale = 0.007843 # luego finalmente escalaremos la imagen para cumplir con los criterios de entrada del modelo
El módulo dnn nos proporciona el método blobFromImage (o blobFromImages si está usando varias imágenes) para los pasos de preprocesamiento y solo tenemos que pasar los parámetros de escala que definimos anteriormente para completar el paso de preprocesamiento y obtener el blob requerido, es decir imagen de entrada
#——preprocesamiento de imagen—-#
blob = cv2.dnn.blobFromImage(img,
factor de escala = escala,
tamaño=entrada_forma,
medio = medio,
swapRB=True) #dado que nuestra imagen ya está en formato BGR porque opencv por defecto la lee en formato BGR
Hacer predicciones usando el modelo
Ahora que tenemos nuestra entrada lista, tenemos que configurarla explícitamente como entrada usando el método setInput() y luego pasarla a nuestro modelo y usar el método de avance para generar predicciones.
#——configuración de entrada—–#
net.setInput(blob)
#—–utilizando el modelo para hacer predicciones
resultados = net.forward()
El método directo nos devuelve una lista de 4 dimensiones:
La tercera dimensión tiene nuestras predicciones, y cada predicción es una lista de 7 valores flotantes. En el índice 1 tenemos el class_id, en el índice 2 tenemos la confianza/probabilidad y del índice 3 al 6 tenemos las coordenadas del objeto detectado.
Veamos directamente cómo se usan en nuestra implementación final.
A continuación se muestra la implementación completa
Python3
import cv2 import dlib from imutils import face_utils img = cv2.imread('object (1).png') #--------Model Path---------# proto_file = 'SSD_MobileNet_prototxt.txt' model_file = 'SSD_MobileNet.caffemodel' #------Variables for the Model ---------# classNames = {0: 'background', 1: 'aeroplane', 2: 'bicycle', 3: 'bird', 4: 'boat', 5: 'bottle', 6: 'bus', 7: 'car', 8: 'cat', 9: 'chair', 10: 'cow', 11: 'diningtable', 12: 'dog', 13: 'horse', 14: 'motorbike', 15: 'person', 16: 'pottedplant', 17: 'sheep', 18: 'sofa', 19: 'train', 20: 'tvmonitor'} input_shape = (300, 300) mean = (127.5, 127.5, 127.5) scale = 0.007843 #---------Load The Model--------# net = cv2.dnn.readNetFromCaffe(proto_file, model_file) #------image preprocessing----# blob = cv2.dnn.blobFromImage(img, scalefactor=scale, size=input_shape, mean=mean, swapRB=True) # since our image is already in the BGR form net.setInput(blob) results = net.forward() for i in range(results.shape[2]): # confidence confidence = round(results[0, 0, i, 2],2) if confidence > 0.7: # class id id = int(results[0, 0, i, 1]) # 3-6 contains the coordinate x1, y1, x2, y2 = results[0, 0, i, 3:7] # print(x1,y1,x2,y2) # scale these coordinates to out image pixel ih, iw, ic = img.shape x1, x2 = int(x1*iw), int(x2*iw) y1, y2 = int(y1 * ih), int(y2 * ih) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 200, 0), 2) cv2.putText(img, f'{classNames[id]}:{confidence*100}', (x1+30, y1-30), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 0, 0), 1) # print(results[0,0,i,:]) img = cv2.resize(img, (640, 720)) cv2.imshow('Image', img) # cv2.imwrite('output1.jpg',img) # Uncomment this line to save the output cv2.waitKey()
Producción:
¿Qué sigue?
Ahora que sabe cómo usar modelos preentrenados, intente usar varios modelos preentrenados de diferentes marcos y cree diferentes aplicaciones como traducción de idiomas, segmentación de imágenes, transferencia de estilo, etc.
Publicación traducida automáticamente
Artículo escrito por bobde_yagyesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA