Deep Learning với Tensorflow Module 1 Phần 4 : Những khái niệm cơ bản - Tensor với Numpy và Hàm utility

MVT
Đang cập nhật

Trong mô-đun này, chúng ta sẽ sử dụng một phương thức trong openCV để phát hiện khuôn mặt trong hình ảnh, video hoặc máy ảnh. Hãy nhớ rằng, mô-đun này chỉ phát hiện, không Nhận diện khuôn mặt.

Trước tiên, bạn cần tải xuống và nén tệp tại đây

Import thư viện cần dùng

import numpy as np
import matplotlib.pyplot as plt 
import cv2

Trải nghiệm với một số hình ảnh trước khi bắt đầu code phát hiện khuôn mặt

We should create a function display to resuse multiply

def display_image(img, cmap="gray") : 
    plt.figure(figsize=(12,10))
    plt.imshow(img, cmap=cmap)

Read file image with opencv

messi = cv2.imread("DATA/LIONEL-MESSI.jpg",0)
ronaldo = cv2.imread("DATA/ronaldo.jpg",0)
realmadrid = cv2.imread("DATA/real-madrid.jpg.jpg",0)
display_image(messi)

display_image(realmadrid)

Phát hiện khuôn mặt trên hình ảnh

We will create utility function to detect the face not only image but video or camera

def detect_face(img) : 
    face_img = img.copy()
    face_cascade = cv2.CascadeClassifier("DATA/haarcascades/haarcascade_frontalface_default.xml")
    face_rects = face_cascade.detectMultiScale(img, scaleFactor=1.2, minNeighbors=5) # You can play ground with 2 optional properties are scaleFactor and minNeighbors
    for (x,y,w,h) in face_rects :         
        cv2.rectangle(face_img, (x,y), (x+w,y+h), (230,230,160), 5)
    return face_img

Apply above function to messi image

face_image = detect_face(messi)
display_image(face_image)

detect_realmadrid = detect_face(realmadrid)
display_image(detect_realmadrid)

Phát hiện khuôn mặt trên camera

video = cv2.VideoCapture(0)

ret, frame = video.read() 

if not video.isOpened() : 
    print("Could not open camera")
    sys.exit()
while True : 
    ret, frame = video.read()
    frame_copy = frame.copy()
    frame_copy = cv2.cvtColor(frame_copy, cv2.COLOR_BGR2GRAY)
    if not ret : 
        break
    my_face = detect_face(frame_copy)
    timer = cv2.getTickCount()
    FPS = cv2.getTickFrequency() / (cv2.getTickCount() - timer) / 10000
    cv2.putText(my_face, "FPS: " + str(int(FPS)), (40,20), cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0), 4)
    cv2.imshow("Detect Face", my_face)
    if cv2.waitKey(1) == 27 : 
        break
video.release()
cv2.destroyAllWindows()

Code phát hiện khuôn mặt tốt hơn

video = cv2.VideoCapture(0)

ret, frame = video.read()

if not video.isOpened() : 
    print("Could not open camera")
    sys.exit()    

face_cascade = cv2.CascadeClassifier("DATA/haarcascades/haarcascade_frontalface_default.xml")

face_rects = face_cascade.detectMultiScale(frame)

(face_x, face_y,face_w, face_h) = tuple(face_rects[0])

track_window = (face_x, face_y,face_w, face_h) 

roi = frame[face_y : face_y + face_h , face_x : face_x + face_w]

roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)

roi_hist = cv2.calcHist([roi_hsv],[0],None,[180], [0,180])

cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

term_criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_EPS , 10, 1)

while True : 
    ret, frame = video.read()
    timer = cv2.getTickCount() 
    FPS = cv2.getTickFrequency() / (cv2.getTickCount() - timer ) / 10000
    if not ret or cv2.waitKey(1) == 27 : 
        break

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

    # ===================== Using Mean shift to get track window ===================== #

    # retval, track_window = cv2.meanShift(dst,track_window,term_criteria)

    # if retval : 
    #   (x,y,w,h) = track_window
    #   cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 5)   

    # ===================== Using Cam shift to get track window ===================== #

    retval, track_window = cv2.CamShift(dst,track_window, term_criteria)
    if retval : 
        pts = cv2.boxPoints(retval)
        pts = np.int32(pts)
        cv2.polylines(frame, [pts],True,(0,255,0), 5)

        cv2.putText(frame, "FPS: " + str(int(FPS)), (40,40), cv2.FONT_HERSHEY_SIMPLEX, 1 , (0,0,255), 1)
        cv2.imshow("Face detection", frame)

video.release()
cv2.destroyAllWindows()

Bài viết có liên quan