Phát hiện khuôn mặt (face detection) là một trong những tính năng được hỗ trợ bởi Cloud Vision API như đã trình bày trong bài viết Khám phá Google Cloud Vision API“.
Mình xin nhắc lại một chút về bài toán Face Detection một chút. Đây là một bài toán được xem là cơ bản của Machine Learning – nhằm phát hiện đâu là khuôn mặt của người trong ảnh hoặc video. Bài toán này không giải quyết được là khuôn mặt đó là của ai?. Nó thường áp dụng trong những trường hợp chỉ cần đếm số lượng người mà không cần quan tâm đó là người nào. Ví dụ:
- Xác định bao nhiêu người đang có trong thang máy.
- Hôm nay có bao nhiêu người tham quan siêu thị/ cửa hàng,….
- Bao nhiêu người đang hiện diện trong phòng họp ?
- …
Thông thường, đối với bài toán này, chúng ta phải có tập train-test và thuật toán để tạo model là khuôn mặt (face). Rồi từ đó mới dự đoán (predict) được đâu khuôn mặt (face). Để kết qủa dự đoán được chính xác thì phải cần tập dữ liệu đủ lớn (????), thuật toán phù hợp và thời gian huấn luyện, kiểm tra mất rất nhiều thời gian. Đến với Cloud Vision API thì các công việc trên đã được Google làm rồi. Bạn chỉ cần sử dụng thôi. Thật là đơn giản đúng không?
Để cho các bạn dễ hình dung kết quả của mà Cloud Vision API mang lại, bạn có thể chạy thử demo trực tiếp trên giao diện web của Cloud Vision AI.
Kết quả sẽ trong như thế này.
Trong bài viết này sử dụng API được public của Cloud Vision API với ngôn ngữ lập trình python (ngoài ra Cloud Vision API còn hỗ trợ các ngôn ngữ lập trình khác như : C#, Go, Java, php, nodejs). Cụ thể :
- python version 3.x
- google-cloud-vision
Trình diễn Google Cloud Vision API với Python
I. Cài đặt thư viện cần thiết bằng pip
Những thư viện cần thiết
pip3 install google-cloud-vision
Sau khi cài đặt thành công thì chúng ta có thể sử dụng Cloud Vision API được rồi.
II. Phát hiện khuôn mặt với Cloud Vision API
Nào bây giờ chúng ta sẽ đi vào phần chính của nội dung bài viết.
Các dịch vụ của Google Cloud Platform (GCP) thì phải chứng thực bạn là ai và bạn có role thực hiện dịch vụ này hay không? . Trong ví dụ này, mình sử dụng cách chứng thực bằng file json. Ở đây mình đặt tên file ‘client_demo.json‘. Và thiết lập tên biến môi trường là ‘GOOGLE_APPLICATION_CREDENTIALS‘.
Đoạn code chính của chương trình
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = os.path.join('certs', 'client_demo.json')
def detect_faces_uri(uri):
"""Detects faces in the file located in Google Cloud Storage or the web."""
client = vision.ImageAnnotatorClient()
image = vision.types.Image()
image.source.image_uri = uri
response = client.face_detection(image=image)
faces = response.face_annotations
print (faces)
if __name__ == '__main__':
image_url = 'gs://cloud-samples-data/vision/face/faces.jpeg'
detect_faces_uri(image_url)
Cloud Vision API sẽ trả về cho chúng ta chuỗi JSON có cấu trúc như hình bên dưới.
[bounding_poly {}
fd_bounding_poly {}
landmarks {}
roll_angle: 1.7871191501617432
pan_angle: -25.329906463623047
tilt_angle: -0.32616662979125977
detection_confidence: 0.8218700885772705
landmarking_confidence: 0.5853151082992554
joy_likelihood: VERY_LIKELY
sorrow_likelihood: VERY_UNLIKELY
anger_likelihood: VERY_UNLIKELY
surprise_likelihood: VERY_UNLIKELY
under_exposed_likelihood: VERY_UNLIKELY
blurred_likelihood: VERY_UNLIKELY
headwear_likelihood: VERY_UNLIKELY
,
...
]
Kết quả bên trên được mình rút ngắn lại rồi, nhưng nhìn vẫn rối mắt, có quá nhiều thông tin. Mình cần phải chọn lọc lại những thông tin mà mình cần. Giả sử, trong bài viết này cần thông tin là:
- Vị trí của khuôn mặt có trong ảnh
- Khuôn mặt có nét gì ? giận dữ ? vui ?..
Giờ mình điều chỉnh code một xíu – chỉ lấy 2 thông tin như đề cập ở trên cho tấm ảnh đầu vào.
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = os.path.join('certs', 'client_demo.json')
def detect_faces_uri(uri):
"""Detects faces in the file located in Google Cloud Storage or the web."""
client = vision.ImageAnnotatorClient()
image = vision.types.Image()
image.source.image_uri = uri
"""
neu muon su dung image o local. thi su dụng doan code nay !
with io.open(path, 'rb') as image_file:
content = image_file.read()
image = vision.types.Image(content=content)
"""
response = client.face_detection(image=image)
faces = response.face_annotations
# Names of likelihood from google.cloud.vision.enums
likelihood_name = ('UNKNOWN', 'VERY_UNLIKELY', 'UNLIKELY', 'POSSIBLE',
'LIKELY', 'VERY_LIKELY')
print('Faces:')
for face in faces:
print('anger: {}'.format(likelihood_name[face.anger_likelihood]))
print('joy: {}'.format(likelihood_name[face.joy_likelihood]))
print('surprise: {}'.format(likelihood_name[face.surprise_likelihood]))
vertices = (['({},{})'.format(vertex.x, vertex.y)
for vertex in face.bounding_poly.vertices])
print('face bounds: {}'.format(','.join(vertices)))
if __name__ == '__main__':
image_url = 'gs://cloud-samples-data/vision/face/faces.jpeg'
detect_faces_uri(image_url)
Kết quả của mình nhận được sẽ là như bên dưới.
Faces:
anger: VERY_UNLIKELY
joy: VERY_LIKELY
surprise: VERY_UNLIKELY
face bounds: (1126,224),(2144,224),(2144,1407),(1126,1407)
anger: VERY_UNLIKELY
joy: VERY_UNLIKELY
surprise: VERY_UNLIKELY
face bounds: (168,1305),(793,1305),(793,1844),(168,1844)
Nếu các bạn cần nhiều thông tin hơn thì hãy xem tài liệu chi tiết Cloud Vision API ở đây.
Những thông tin trên hi vọng giúp ích cho các bạn về các khả năng mà Cloud Vision API trên nền tảng GCP có thể hỗ trợ được. Ở bài viết tiếp theo, chúng ta sẽ tiếp tục một vài ví dụ nho nhỏ – Phát hiện nhãn (Detect labels) được hỗ trợ bởi Cloud Vision API.
Khi có chỗ nào chưa rõ, cần support, các bạn hãy liên hệ với các chuyên gia – Cloud Ace Việt Nam – để được hỗ trợ tốt hơn.
Tham khảo
- Google Cloud : Detect faces
- Google Cloud : Vision AI
- Blog kỹ thuật về Google Cloud : Khám phá Google Cloud Vision API
cam on nha phat trien toi rat thich ung dung nay va toi muon cai dat de su dung vay rat mong nha phat trien dup do cho toi toi xin cam on
rat tot
toi nrat thich ung dung nay va rat mong nha phat trien tao dieu kien dup do toi xin cam on
rat tot va toi mong duoc dup do cho toi toi xin cam on rat nhieu