Beruflich Dokumente
Kultur Dokumente
NRC: 8940
Fecha: 14-07-2020
Tema: OpenCV y Yolo
Ejercicio 1
Reconocimiento facial y de ojos mediante Open CV
Mediante la librería de Open CV se conseguirá abrir la cámara web de la computadora, y
mediante a esta conseguir que detecte rostros con un rectángulo azul y los ojos de la persona
con un rectángulo verde.
2. Importamos la librería cv2 y los archivos descargados anteriormente que deben estar en la
misma carpeta que el archivo OpenCV.py que estemos creando.
4. Colocamos un ciclo While para mantener abierta la cámara hasta que cerremos el programa
en donde colocaremos todos los comandos necesarios para detectar y dibujar los rectángulos
en la imagen capturada por la webcam.
5. Guardamos los frames capturados por la cámara y los cambiamos de BGR a escala de grises.
6. La parte más importante del programa es esta línea de código, ya que aquí vamos a colocar
los valores que sean más eficientes para detectar los rostros, y que no haya falsos positivos ni
errores en la detección. Al manipular estos valores, podrá detectar más rostros de los que hay
realmente en la imagen o menos rostros de los que debería detectar, por lo cual es importante
que se vaya variando cada uno de los 4 parámetros a conveniencia del programador
7. Dibujamos un rectángulo sobre el rostro y luego dentro del rectángulo dibujado buscamos los
ojos para que mediante un ciclo For dibuje los rectángulos de los ojos.
Resultado
#Colocamos un ciclo While para mantener abierta la cámara hasta que cerre
mos el programa
while videocamara.isOpened():
#Guarda los frames capturados por la webcam
ret, img = videocamara.read()
#Se transforma la imagen de BGR a escala de grises
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Busca en la imagen el rostro
rostros = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNei
ghbors=10, minSize=(30,30), maxSize=(300,300))
#Dibujamos el rectángulo
for (x, y , w ,h) in rostros:
#Se dibuja el rectángulo
cv2.rectangle(img, (x,y), (x+w, y+h), (255, 0 , 0), 3)
#Selecciona el rostro
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
Ejercicio 2
Guía Ejercicio Implementación de YOLO con Python
1. Instalación de Dependencias:
Las siguientes cosas son necesarias para ejecutar el código que hemos implementado
como ejercicio de aplicación:
1. Python 3 - Preinstalado
2. Numpy - ejecutamos el comando en la terminal: pip install numpy
3. OpenCV - ingresamos el comando en la terminal: pip install opencv-python
2. Archivos Requeridos:
Para correr el algoritmo necesitamos tener en el mismo directorio de nuestro script (.py)
los 3 archivos siguientes:
2.1. Archivo Weight: es el modelo predefinido, el núcleo del algoritmo para detectar
objetos. Debido a su tamaño se requerirá su descarga desde el siguiente enlace:
https://pjreddie.com/darknet/yolo/
En la sección: “Performance on the COCO Dataset”, el archivo denominado YOLOv3-
416. Debido a que es el formato de imagen blop usado en nuestro programa.
2.2. Archivo Cfg: es el archivo de configuración donde se encuentran todos los ajustes
del algoritmo.
2.3. Nombres de Clase: Archivo de texto donde se listen los nombres de clase.
(coco.names) -contiene el nombre de los objetos que el algoritmo puede detectar.
2.4. Imagen de Entrada – cualquier archivo de imagen (variadas extensiones .jpg, .png,
etc.)
3. Implementando el Código:
3.1. Empezamos importando las librerías Open CV y numpy
3.3. Creamos una matriz para las clases (nombre correspondientes a los objetos que va
a detectar Python), podemos enumerarlas directamente dentro de nuestra variable
Classses, una por una, o importarlas directamente de nuestro archivo de texto
(coco.names) donde están previamente escritas las clases (usaremos esta segunda
opción)
3.4. Para comprobar que nuestro programa lee el archivo coco.names podemos
ejecutar la sentencia:
Obteniendo como resultado una matriz numerando las 80 clases del archivo
coco.names:
Una vez verificado podemos borrar la sentencia print y seguir con nuestro código:
3.5. Procedemos a obtener los nombres de clases que se usaran en los recuadros al
momento de reconocer los objetos en la imagen.
Primero definimos nuestra variable imagen como img y accedemos a los comando de
lectura (comando - imread) de open cv.
Antes de seguir con el código verificaremos que el programa puede leer nuestra
imagen y mostrarla (comando - imshow).
Dependiendo de la resolución de nuestra imagen será necesario redefinir el tamaño de
nuestra imagen mostrada, en nuestro caso el resultado no fue óptimo como se
muestra en la siguiente imagen de salida:
• 320 × 320 es pequeño, así que menos precisión, pero mejor velocidad
• 609 × 609 es más grande, así que alta precisión y velocidad lenta
• 416 × 416 está en el medio y obtienes un poco de ambos
Las salidas de la variable outs son el resultado de la detección. Outs es una matriz que
contiene toda la información sobre los objetos detectados, su posición y la confianza en
la detección.
Cuando realizamos la detección, sucede que tenemos más cuadros para el mismo objeto,
por lo que debemos usar otra función para eliminar este "problema".
Se llama “Non maximum suppresion”.
• Cuadro (Box): contiene las coordenadas del rectángulo alrededor del objeto
detectado.
• Etiqueta (Label): es el nombre del objeto detectado
• Confianza (Confidence): la confianza sobre la detección de 0 a 1.
El programa final nos arrojara el siguiente resultado:
# Cargando YOLO
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
classes = []
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLaye
rs()]
colors = np.random.uniform(0, 255, size=(len(classes), 3))
# Detectando Objetos
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, c
rop=False)
net.setInput(blob)
outs = net.forward(output_layers)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
EJERCICIO DE DEBER
1. En base al programa anterior, utilizar una imagen de extensión .png más de tres rostros y
ubicarla en la misma carpeta donde se encuentren los otros 3 archivos necesarios para el
ejercicio anterior, y conseguir que ubicar en la imagen los rostros y ojos de todas las personas
de la imagen sin ningún falso positivo ni rostro faltante de detectar.