Cài đặt môi trường lập trình và một số thư viện cần thiết

Một phần của tài liệu Ứng dụng TensorFlow xây dựng hệ thống nhận diện khuôn mặt và phát hiện đối tượng trên robot NAO: báo cáo nghiên cứu khoa học sinh viên (Trang 25)

7. Kết cấu của đề tài

2.1.Cài đặt môi trường lập trình và một số thư viện cần thiết

2.1.1. Cài đặt phần mềm Anaconda

Để cài đặt phần mềm này trên hệ điều hành Windows, truy cập vào website: https://www.anaconda.com/download/, tiến hành tải Anaconda về và cài đặt như một phần mềm bình thường. Để cài đặt trên hệ điều hành Ubuntu, truy cập website [9] và làm theo hướng dẫn.

2.1.2. Cài đặt thư viện Tensorflow

Để cài đặt, thực hiện các bước sau:

- Tạo môi trường lập trình python phiên bản 3.6.3 có tên là facerecognition (Có thể thay bằng tên khác) bằng conda chứa trong Anaconda đã cài đặt:

(C:\Users\minht\Anaconda3) C:\>conda create --name Tensorflow python=3.6.3

- Sau khi cài đặt xong môi trường lập trình python 3.6.3, tiến hành kích hoạt môi trường này bằng câu lệnh:

# Trên nền tảng windown

(C:\Users\minht\Anaconda3) C:\>activate Tensorflow

(Tensorflow)C:> # Giao diện command line sẽ thay đổi giống thế này #Trên nền tảng Ubuntu

(Tensorflow)serverb304@serverb304:~$ source activate Tensorflow (Tensorflow)serverb304@serverb304:~$Giao diện command line sẽ thay đổi giống thế này

- Cuối cùng là cài đặt thư viện Tensorflow bằng lệnh:

(Tensorflow)C:> pip install --ignore-installed --upgrade Tensorflow

- Để kiểm tra kết quả cài đặt, tiến hành nhập lệnh python, sau đó, gõ tiếp

import Tensorflow as tf. Nếu chương trình không báo lỗi gì thì việc cài

Chú ý: Kể từ bây giờ, trong đề tài này tác giả mặc định là chương trình của tác giả đã kích hoạt môi trường Tensorflow.

 Sử dụng command trên hệ điều hành Windows để cài đặt.  Đường dẫn trên command có thể ở bất cứ đâu.

2.1.3. Cài đặt thư viện Google Text To Speech

Để cài đặt thư viện này, tiến hành chạy lệnh sau:

(Tensorflow)C:> pip install gTTS

Sau khi cài đặt, chạy lệnh python, sao đó chạy lệnh from gtts import gTTS, nếu chương trình không báo lỗi gì việc cài đặt đã thành công.

2.1.4. Cài đặt thư viện OpenCV

Trong đề tài này, tác giả sử dụng OpenCV phiên bản 3.3.0.10. Để cài đặt thực hiện tải thư viện OpenCV từ đường dẫn https://pypi.python.org/pypi/opencv- python#downloads và tiến hành tải gói cài đặt phù hợp về. Sau khi tải về sẽ cài đặt thư viện bằng lệnh sau:

(Tensorflow)C:> pip install path # với path là đường dẫn đến file vừa tải

về

Sau khi cài đặt xong, gõ lệnh python, sau đó chạy lệnh import cv2. Nếu chương trình không báo lỗi gì thì việc cài đặt đã thành công.

2.1.5. Cài các thư viện hỗ trợ khác

- Cài đặt thư viện scikit-learn bằng lệnh:

(Tensorflow)C:> conda install scikit-learn

- Cài đặt thư viện scipy bằng lệnh:

(Tensorflow)C:> conda install -c anaconda scipy (adsbygoogle = window.adsbygoogle || []).push({});

- Cài đặt thư viện matplotlib bằng lệnh:

(Tensorflow)C:> conda install -c conda-forge matplotlib

- Cài đặt thư viện pillow bằng lệnh:

(Tensorflow)C:> pip install pillow

2.2. Xây dựng chương trình thu thập dữ liệu hình ảnh khuôn mặt

Trong đề tài này, tác giả sẽ xây dựng chương trình thu thập hình ảnh với độ phân giải 320x240 px, trong phòng B304 với một độ sáng nhất định để phù hợp với hình ảnh truyền từ Robot NAO lên trên server. Các phương pháp thu thập dữ liệu hình ảnh tác giả sử dụng:

 Sử dụng hệ thống camera trong phòng học B304.

 Sử dụng camera trên raspberry pi hoặc camera trên laptop.

2.2.1. Sử dụng hệ thống camera trong phòng B304

Để lấy được dữ liệu hình ảnh chứa khuôn mặt trong phòng B304, tác giả đã sử dụng biện pháp tách khung hình trong các video mà camera đã lưu lại, sau đó

dùng thư viện xử lý ảnh OpenCV để phát hiện mặt người. Nếu trong frame hình đó có chứa mặt người sẽ tiến hành lưu trữ lại. Sau đó sẽ thực hiện phân loại hình ảnh theo từng người. Dưới đây là đoạn code xử lý của chương trình:

import cv2

import math

import os

import config

#Hàm phát hiện khuôn mặt

defdetect_faces(image):

haar_faces = cv2.CascadeClassifier(config.HAAR_FACES)

detected = haar_faces.detectMultiScale(image,

scaleFactor=config.HAAR_SCALE_FACTOR,

minNeighbors=config.HAAR_MIN_NEIGHBORS, minSize=config.HAAR_MIN_SIZE,

flags=cv2.CASCADE_SCALE_IMAGE)

return detected #Chuong trình chính

if __name__ == '__main__':

videoFile ="out.mp4" #Video sẽ tách khuôn mặt

imagesFolder ="test" #Thư mục lưu hình ảnh khuôn mặt tách ra từ khuôn mặt cap = cv2.VideoCapture(videoFile)

frameRate = cap.get(5) #frame rate while(cap.isOpened()):

frameId = cap.get(1) ret, frame = cap.read()

if(ret !=True):

break (adsbygoogle = window.adsbygoogle || []).push({});

if(frameId % math.floor(60)==0): #60 frame sẽ kiểm tra một lần faces = detect_faces(frame)

if len(faces) >0:

print(len(faces))

filename = imagesFolder +"/image_"+ str(int(frameId))+".jpg"

cv2.imwrite(filename, frame) #Lưu hình ảnh lại cap.release()

2.2.2. Sử dụng camera trên raspberry pi hoặc camera trên laptop.

Đối với phương pháp này, tác giả cũng sử dụng OpenCV để phát hiện khuôn mặt.

 Trên raspberry pi, nếu chương trình phát hiện có khuôn mặt thì chương trình sẽ thực hiện chụp hình và lưu lại.

 Trên laptop, tác giả xây dụng để lấy dữ liệu hình ảnh của từng người. Khi lấy dữ liệu sẽ tạo thư mục riêng cho người đó để sau này không phải mất thời gian để phân loại hình ảnh ra thành từng thư mục riêng.

import cv2

from time import sleep

import datetime import numpy as np import os cam = cv2.VideoCapture(0) cam.set(3,320) cam.set(4,240)

detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Id=input('Nhap ho ten sinh vien: ')

os.chdir("320") ifnot Id in os.listdir("."): os.mkdir(Id) os.chdir("../") sampleNum=0 try: while(True):

ret, img = cam.read()

if ret ==True:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = detector.detectMultiScale(img,1.3,5)

if len(faces) ==1:

for(x,y,w,h)in faces:

sampleNum=sampleNum+1

dt_current = datetime.datetime.now()

cv2.imwrite("320/"+Id +"/Image_RGB_" +

cv2.imwrite("320/"+Id +"/Image_GRAY_" +

str(dt_current).replace(":","_").replace(".","_")+".jpg", gray)

sleep(1)

cv2.imshow('frame',img)

if cv2.waitKey(100)&0xFF== ord('q'):

break (adsbygoogle = window.adsbygoogle || []).push({});

if sampleNum==60:

break

else:

print("No found camera")

break except KeyboardInterrupt: cam.release() cv2.destroyAllWindows() cam.release() cv2.destroyAllWindows()

Hình 2-2: Code thu thập dữ liệu theo từng người

Trong đoạn code trên, tác giả sử dụng OpenCV để phát hiện khuôn mặt và chụp hình. Ở đây chương trình cho phép lấy dữ liệu hình ảnh của từng người. Khi lấy của người nào sẽ nhập tên của người đó. Như vậy sẽ không phải mất thời gian phân lớp lại. Số hình ảnh muốn lấy sẽ do tác giả quy định.

2.3. Tổ chức dữ liệu trước khi cho học máy

Trước khi trình bày phần này, tác giả giới thiệu tổng quan về tập dữ liệu học của tác giả.

Bảng 2-1: Thông tin tập dữ liệu học máy trong đề tài

Số người thu thập Số hình ảnh / người Số hình cho học máy Số hình thử nghiệm 50 60 48 (80%) 12 (20%) Theo Bảng 2-1: Thông tin tập dữ liệu học máy trong đề tài, tập dữ liệu của tác giả sử dụng vào đề tài có chứa hình ảnh khuôn mặt của 50 người, trong tập hình ảnh của mỗi người sẽ có 60 hình ảnh, sau đó sẽ chọn ra ngẫu nghiên 48 hình ảnh phân vào tập train, 12 hình sẽ được phân vào tập test.

Tập dữ liệu mẫu dùng để học máy: Ban đầu tác giả chọn 2 bộ dữ liệu mẫu:

CASIA-WebFace và MS-Celeb-1M để tiến hành cho học máy, sau đó sẽ dùng

kết quả đã học máy của tác giả và tập hình ảnh thử nghiệm để kiểm tra độ chính xác của tập dữ liệu đã học. Kết quả trên model nào có độ chính xác cao hơn thì tác giả sẽ chọn model đó làm model học máy của đề tài này.

Bảng 2-2: Kết quả kiểm tra độ chính xác của tập dữ liệu của tác giả trên hai dataset khuôn mặt

Training Dataset Độ chính xác trên tập thử nghiệm (%)

CASIA-WebFace 89,7 %

MS-Celeb-1M 89,2 %

Từ Bảng 2-2: Kết quả kiểm tra độ chính xác của tập dữ liệu của tác giả trên hai dataset khuôn mặt, tác giả nhận thấy độ chính xác của kết quả học máy trên hai tập dữ liệu này là không chênh lệch quá nhiều, nhưng tác giả vẫn quyết định lấy model có độ chính xác cao hơn là CASIA-WebFace làm bộ dữ liệu cho học máy trong việc thực hiện đề tài này.

Quy trình học máy:

2.3.1. Tổ chức thư mục hình ảnh

Vì tác giả sử dụng biện pháp học máy có giám sát nên cấu trúc dữ liệu để cho máy học được tổ chức như sau: Tất cả hình ảnh khuôn mặt của mỗi người sẽ được chứa trong một thư mục, tên của thư mục sẽ là tên của người đó. Và tất cả các thư mục chứa hình ảnh của những người được cho học máy sẽ được chứa trong một thư mục. Hình ảnh Tiền xử lý Trích xuất đặc trưng Học máy Kiểm tra Hình 2-3: Quy trình học máy

2.3.2. Tiến hành xử lý hình ảnh trước khi cho máy học

Trong đề tài này, để tiến hành xử lý hình ảnh trước khi đưa vào học máy tác giả đã sử dụng kết quả của bài báo [2] để áp dụng vào việc xử lý hình ảnh trước khi cho máy học và code của chương trình được tham khảo tại [7].

Trong bài báo [2] kết quả đạt được như sau:

(Trích trong bài báo [2])

Theo Hình 2-5: Kết quả Face Detection Data Set and Benchmark năm 2016, tác giả nhận thấy kết quả đạt được của bài báo này trong việc phát hiện và căn chỉnh khuôn mặt trước khi train là rất tốt. Từ đó tác giả đã ứng dụng nó vào đề tài của mình.

Để chạy chương trình được tải về từ [7], chạy lệnh như hình sau:

Sau khi chạy chương trình xử lý hình ảnh, thì kết quả thu được sẽ là các hình ảnh trong Hình 2-7: Kết quả thu được sau tiền xử lý.

Hình 2-6: Lệnh chạy chương trình tiền xử lý hình ảnh (adsbygoogle = window.adsbygoogle || []).push({});

Hình 2-7: Kết quả thu được sau tiền xử lý

2.4. Tiến hành cho học máy

Khi học máy, chương trình sẽ thực hiện 2 công việc:  Tiến hành training thông qua tập hình ảnh training.  Kiểm tra độ chính xác thông qua tập hình ảnh test.

Chương trình học máy này được tác giả nghiên cứu [7] và áp dụng vào nghiên cứu để cho máy học.

 Để tiến hành học máy, thực hiện câu lệnh sau:

python /home/serverb304/NCKHK13/MinhTien/facenet/src/classifier.py TRAIN /home/serverb304/NCKHK13/MinhTien/facenet/CASIA/Output_train /home/serverb304/NCKHK13/MinhTien/facenet/CASIA/model/201705 11-185253.pb /home/serverb304/NCKHK13/MinhTien/facenet/CASIA/result/my_clas sifier.pkl

- Cấu trúc của câu lệnh trên như sau:

python path_python_file mode path_to_image path_to_model

path_save_result

python: lệnh để thực thi chương trình python.

path_python: đường dẫn tới file python sẽ thực thi.

mode: Có 2 chế độ: TRAIN là chế độ học. CLASSIFY là chế độ

kiểm tra.

path_to_image: Đường dẫn tới thư mục hình ảnh chô máy học.

path_to_model: đường dẫn tới file model cần sử dụng.

path_save_result: đường dẫn tới thư mục lưu kết quả.

 Để kiểm tra tra độ chính xác trên tập dữ liệu ngẫu nhiên thực thi lệnh sau:

python /home/serverb304/NCKHK13/MinhTien/facenet/src/classifier.py CLASSIFY /home/serverb304/NCKHK13/MinhTien/facenet/CASIA/Output_test /home/serverb304/NCKHK13/MinhTien/facenet/CASIA/model/201705 11-185253.pb /home/serverb304/NCKHK13/MinhTien/facenet/CASIA/result/my_clas sifier.pkl

- Cấu trúc của câu lệnh trên như sau:

python path_python_file mode path_to_image path_to_model

path_save_result

python: lệnh để thực thi chương trình python.

mode: Có 2 chế độ: TRAIN là chế độ học. CLASSIFY là chế độ

kiểm tra.

path_to_image: Đường dẫn tới thư mục hình kiểm tra.

path_to_model: đường dẫn tới file model sẽ sử dụng.

path_save_result: đường dẫn tới file kết quả sau khi cho máy học. 2.5. Thử nghiệm nhận diện trên camera

Quy trình nhận diện khuôn mặt:

Để kiểm tra trực tiếp kết quả thông qua camera, tiến hành chạy lệnh sau:

(Tensorflow) (adsbygoogle = window.adsbygoogle || []).push({});

serverb304@serverb304:~/NCKHK13/MinhTien/facerecognition$ pyth on facerecognition.py

Câu lệnh trên có chức năng thực thi chương trình có chức năng kiểm tra trong một video hoặc hình ảnh truyền từ camera có những khuôn mặt nào máy đã học được, đồng thời sẽ chụp và lưu lại những khuôn mặt có trong video hoặc hình ảnh lấy từ camera. Kết quả như Hình 2-9: Kết quả sau khi chạy chương trình nhận diện khuôn mặt sau khi học máy.

Hình 2-8: Quy trình nhận diện khuôn mặt

Input Detect Face Crop Face

Rút trích đặc trưng

Phân loại Dataset

Ngoài ra tác giả còn chia tập học ra 3 tập học với số lượng hình ảnh lần lượt là 16, 32 và 48 hình ảnh. Sau đó kiểm tra so với tập test và đạt được kết quả như sau:

Bảng 2-3: Kết quả so sánh độ chính xác trên các tập học có số lượng ảnh khác nhau

Số lượng hình 16 32 48 Độ chính xác 89,2% 89,7% 89,7%

Từ Bảng 2-3: Kết quả so sánh độ chính xác trên các tập học có số lượng ảnh khác nhau, tác giả nhận thấy rằng, với tập dữ liệu học thu thập tại phòng B304 với điều kiện ánh sáng tương tự nhau nên độ tương đồng của các ảnh là như nhau, với số lượng ảnh học là 32 ảnh và 48 ảnh thì phần trăm đúng không thay đổi. Vì vậy để nâng cao được độ chính xác của phương pháp học này, cần phải thu thập ảnh ở nhiều môi trường và thời gian khác nhau. Dưới đây là hình ảnh kết quả lúc thử kết quả trên tập test với số lượng ảnh học là 48 ảnh (Hình 2-10: Kết quả thử nghiệm trên tập học 48 hình ảnh với tập test 12 hình).

Hình 2-9: Kết quả sau khi chạy chương trình nhận diện khuôn mặt sau khi học máy

2.6. Tiểu kết

Qua chương 2, tác giả đã xây dựng được hệ thống học máy nhận diện khuôn mặt, từ thu thập dữ liệu, cho học máy và cuối cùng là tiến hành kiểm tra thực nghiệm. Sang chương 3, tác giả sẽ tiến hành ứng dụng việc nhận diện khuôn mặt vào Robot NAO để có thể cho Robot NAO trở thành một người máy thông minh hơn.

Chương 3 : Xây dựng ứng dụng nhận diện khuôn mặt trên Robot NAO

Từ kết quả nhận diện khuôn mặt sau khi thực hiện quá trình học máy, tác giả đi đến việc kết hợp kết quả trả về đó với Robot NAO để giúp Robot NAO có thể thông minh hơn. Ý tưởng của tác giả là sẽ cho Robot NAO chào những người mà hệ thống đã được học trước đó. Mỗi ngày Robot chỉ chào mỗi người một lần. Để thực hiện việc xây dựng hệ thống này, tác giả có hai giải pháp:

Sử dụng NAOqi API để điều khiển Robot chào. Ưu điểm của giải pháp này là tốc độ nhanh. Nhưng điểm yếu của cách xử lý này là Robot NAO vẫn chưa thể thực hiện việc chào một người bằng tiếng Việt vì phần mềm của Robot chưa hỗ trợ.

Lựa chọn hai, tác giả sẽ kết hợp giữa thư viện NAOqi API và Google Text

To Speech để giúp Robot có thể chào được tiếng Việt. Ưu điểm của giải pháp này

là Robot có thể nói tiếng Việt nhưng nhược điểm của nó là sẽ chậm hơn phương pháp đầu tiên vì phụ thuộc nhiều vào tốc độ đường truyền Internet.

Trước khi đi vào xây dựng chương trình, có một lưu ý là NAOqi API chỉ hỗ trợ lập trình trên Python 2.7.x, còn bộ công cụ học máy lại được tác giả xây dựng trên nên tảng Python 3.6.3. Vì vậy, để xây dựng chương trình này, tác giả sẽ kết hợp cả hai phiên bản Python 2.7.x và Python 3.6.3.

Bây giờ tác giả xin trình bày quá trình xây dựng hai giải pháp trên.

3.1. Sử dụng NAOqi API để điều khiển Robot chào.

3.1.1. Xây dựng module truyền hình ảnh từ Robot NAO lên server

Để xây dựng hương trình thực hiện chức năng này, tác giả sử dụng

ALProxy để kết nối tới Robot NAO, sau đó dùng module ALVideoDevice

để sử dụng được camera trên Robot NAO. Dưới đây là code của chương trình:

# vim: set fileencoding=utf-8 :

import sys

import numpy as np (adsbygoogle = window.adsbygoogle || []).push({});

import cv2

from naoqi import ALProxy

# Kiểm tra các tham số đầu vào khi chạy chương trình trên command # Lệnh chạy chương trình đúng là: python tenfile.py ip_address_nao port_nao

if(len(sys.argv)<=2):

print"parameter error"

print"python "+ sys.argv[0]+" <ipaddr> <port>"

# Nhận các tham số IP và Port của NAO để kết nối server với Robot NAO

ip_addr = sys.argv[1]

port_num = int(sys.argv[2])

# get NAOqi module proxy

videoDevice = ALProxy(' ', ip_addr, port_num)

# Sử dụng topcamera của Robot NAO AL_kTopCamera =0

AL_kQVGA =1 # Độ phân giải camera sử dụng là 320x240 AL_kBGRColorSpace =13

captureDevice = videoDevice.subscribeCamera(

"sessionName", AL_kTopCamera, AL_kQVGA,

Một phần của tài liệu Ứng dụng TensorFlow xây dựng hệ thống nhận diện khuôn mặt và phát hiện đối tượng trên robot NAO: báo cáo nghiên cứu khoa học sinh viên (Trang 25)