Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)

Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)

16:20 - 13/03/2019

Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)

NVIDIA Jetson AGX Orin hiệu suất AI mạnh nhất của NVIDIA Jetson Family với 275 TOPS, 2048 NVIDIA® CUDA® cores, 64 Tensor Cores
NVIDIA Jetson AGX Orin Hardware Layout and GPIO Expansion Header Pinout
NVIDIA Jetson là nền tảng hàng đầu thế giới dành cho Trí tuệ nhân tạo (AI) và Deep Learning
Cách sử dụng Camera CSI với hệ điều hành Raspberry Pi Bulleyes mới nhất
Jetson Stats dùng cho Giám sát và Điều khiển trên NVIDIA Jetson Ecosystem [Xavier NX, Nano, AGX Xavier, TX1, TX2]

Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)

Xin chào các bạn!

Ở phần trước mình đã hướng dẫn các bạn cài đặt thư viện Opencv dùng cho việc xử lý ảnh. Cụ thể hôm nay mình sẽ giới thiệu đến các bạn một số tính năng cơ bản như nhận diện khuôn mặt với đầu vào là một ảnh và hình ảnh thu được trực tiếp từ Camera. Camera cho Raspberry Pi (Link here). 

Đầu tiên chúng ta cần tải xuống tệp sau từ Github :

https://github.com/opencv/opencv/tree/master/data/haarcascades

Chúng ta cần sử dụng 2 tệp xml ở đây là :

+ haarcascade_frontalface_default.xml : để nhận diện khuôn mặt

+ haarcascade_eye.xml : để nhận diện mắt

1. Nhận diện khuôn mặt từ một ảnh.

Các bạn cần chuẩn bị một hình ảnh khuôn mặt ( một hoặc nhiều đều ok ). Ở đây mình sử dụng một ảnh với tên là "obama.jpg".

Các bạn copy 2 file trên ra Desktop của các bạn sau đó các bạn mở Terminal lên thực hiện thao tác sau :

cd Desktop/

sudo nano face.py

Chúng ta vừa tạo ra một file Python có tên là " face.py ". Sau đó các bạn gõ đoạn code sau :


import cv2
 
#Tải một tập tin mô hình nhận diện khuôn mặt và nhận diện mắt
 
face_cascade = cv2.CascadeClassifier('/home/pi/Desktop/haarcascade_frontalface_default.xml')
 
eye_cascade = cv2.CascadeClassifier('/home/pi/Desktop/haarcascade_eye.xml')
 
#Đọc hình ảnh đầu vào
 
img = cv2.imread("obama.jpg")
 
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
#Tìm kiếm các khuôn mặt trong ảnh bằng cách sử dụng file mô hình nhận diện khuôn mặt đã được tải lên
 
faces = face_cascade.detectMultiScale(gray_img, scaleFactor= 1.3, minNeighbors= 5, minSize = (100, 100), flags = cv2.CASCADE_SCALE_IMAGE)
 
print(type(faces))
 
print(faces)
 
#Vẽ một hình chữ nhật xung quanh mỗi khuôn mặt được tìm thấy
 
for x,y,w,in faces:
 
    roi_gray = gray_img[y:y + h, x:x + w]
 
    roi_color = img[y:y + h, x:x + w]
 
    img = cv2.rectangle(img, (x,y),(x+w,y+h),(255,0,0), 2)
 
      # ---Các tham số để vẽ một hình chữ nhật
 
      # cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
 
      # img là biến image, nó có thể là " frame" như trong ví dụ này
 
      # x1,y1 --------------
 
      # |                               |
 
      # |                               |
 
      # |                               |
 
      # --------------------     x+w,y+h
 
      # (255,0,0) là màu (R,G,B)
 
      # Số 2 cuối cùng trong bộ tham số là độ dày từ 1 đến 3 của đường viền
 
    eyes = eye_cascade.detectMultiScale(roi_gray)
 
    for (ex,ey,ew,eh) in eyes:
 
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
 
resized = cv2.resize(img, (int(img.shape[1]/2),int(img.shape[0]/2)))
 
#Hiển thị hình ảnh
 
cv2.imshow("image",resized)
 
cv2.waitKey(1)
 
cv2.destroyAllWindows()

+ Tiếp theo dùng lệnh : Python3 face.py để chạy file.+ Sau đó chúng ta dùng tổ hợp phím Ctrl + X để thoát, chọn YEnter để lưu file.

Chúng ta sẽ thu được hình ảnh như sau :

Mình sẽ giải thích ngắn gọn về đoạn code :

+ Đầu tiên chúng ta sử dụng hàm cv2.imread() để đọc ảnh.

+ Tiếp theo đó chúng ta chuyển ảnh của chúng ta sang màu xám.

+ Sau đó sử dụng mô hình nhận diện (face_cascadeeye_cascade) để tìm khuôn mặt khả dĩ nhất trong hình ảnh của chúng ta.

+ Mình có đặt lại kích thước ảnh khi hiển thị bằng cách sử dụng hàm cv2.resize()

2. Nhận diện khuôn mặt với hình ảnh trực tiếp từ camera

Giờ chúng ta lắp camera với Raspberry Pi và thử nhận diện khuôn mặt. Về cơ bản thì nguyên lý cũng gần giống như ví dụ trên.


from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2

# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 24
rawCapture = PiRGBArray(camera, size=(640, 480))
#Load a cascade file for detecting faces
face_cascade = cv2.CascadeClassifier('/home/pi/Desktop/Face_recognition/haarcascade_frontalface_default.xml')
print ("\n [INFO] Initializing face capture. Look the camera and wait ...")
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # convert frame to array
    image = frame.array
    #Convert to grayscale
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    #Look for faces in the image using the loaded cascade file
    faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (100, 100), flags = cv2.CASCADE_SCALE_IMAGE)
 
    print ("Found "+str(len(faces))+" face(s)")
    #Draw a rectangle around every found face
    for (x,y,w,h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)
        print(x,y,w,h)
    # display a frame    
    cv2.imshow("Frame", image)
    #wait for 'q' key was pressed and break from the loop
    if cv2.waitKey(1) & 0xff == ord("q"):
        exit()
    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)


+ Đầu tiên chúng ta sẽ khởi tạo PiCamera và PiRGBArray object với kích thước frame là 320×240, framrate = 24.

camera = PiCamera()
camera.resolution = (320, 240)
camera.framerate = 24
rawCapture = PiRGBArray(camera, size=(320, 240))

 

+ Tiếp theo chúng ta truy cập vào video stream với method capture_continuous(). Method này trả về một infinite iterator của các frame nhận được từ RPi Camera.

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True) :

+ Tiếp đến chúng ta chuyển frame thành dạng array và chuyển đổi nó sang dạng grayscale.

image = frame.array
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

+ Từ tệp mô hình đã tải lên chúng ta sẽ tìm kiếm khuôn mặt.

faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (100, 100), flags = cv2.CASCADE_SCALE_IMAGE)

+ Chúng ta sẽ vẽ một hình chữ nhật xung quanh khuôn mặt mà chúng ta tìm được bằng vòng lặp :

for (x,y,w,h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)

+ Giờ thì chúng ta sẽ hiển thị các frame :

cv2.imshow("Frame", image)

+ Việc ngắt chương trình có thể thực hiện bằng việc nhấn phím "q" hoặc tổ hợp phím Ctrl + C

+ Cuối cùng chúng ta bắt buộc phải xóa frame đang được hiển thị trước khi nhận frame tiếp theo.

rawCapture.truncate(0)

Ta sẽ thu được kết quả như hình :

Các bạn hãy thử các ví dụ vừa rồi và xem kết quả như thế nào nhé !!!

Ở bài viết tiếp theo mình sẽ hướng dẫn các bạn cách nhận dạng các khuôn mặt với OpenCV

Nếu các bạn có bất kỳ ý tưởng mới nào đừng ngần ngại mà hãy inbox trực tiếp cho fanpage . Xin chào và hẹn gặp lại các bạn trong các bài viết tiếp theo !!!

PIVIETNAM.COM.VN CHÚC CÁC BẠN THÀNH CÔNG !!!

Thực hiện bài viết : Đào Văn Hậu


Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :

Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!

Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.