5. Cấu trúc luận văn
3.1. Chƣơng trình nội suy ảnh mặt ngƣời
3.1.1. Tập dữ liệu Mặt người Olivetti
Tập dữ liệu này chứa một tập hợp các hình ảnh khuôn mặt đƣợc chụp trong khoảng thời gian từ tháng 4 năm 1992 đến tháng 4 năm 1994 tại AT &
T Lab Laboratory Cambridge [19]. Hàm
Pattklearn.datasets.fetch_olivetti_faces là hàm tìm tải xuống / lƣu trữ dữ liệu từ AT & T.
Có 40 đối tƣợng khác nhau. Mỗi đối tƣợng có mƣời hình ảnh khác nhau. Đối với một số đối tƣợng, hình ảnh đƣợc chụp ở các thời điểm khác nhau, thay đổi ánh sáng, nét mặt (mở, nhắm mắt, cƣời, không cƣời) và chi tiết khuôn mặt (đeo kính, không đeo kính). Tất cả các hình ảnh đƣợc chụp trên một nền đồng nhất tối với các đối tƣợng ở tƣ thế thẳng đứng, phía trƣớc (với một ít sai lệch do sự chuyển động qua lại hai bên).
Đặc điểm tập dữ liệu: Số lớp: 40
Tổng số ảnh: 400 Kích thƣớc: 64x64
Mức độ xám đã đƣợc chuyển đổi: từ 0 đến 1
Hình ảnh đƣợc lƣợng tử hóa thành 256 mức xám và đƣợc lƣu dƣới dạng số nguyên 8 bit không dấu; trình tải sẽ chuyển đổi các giá trị này thành các giá trị kiểu float trong khoảng [0, 1], để dễ dàng hơn khi làm việc với nhiều thuật toán.
Nhãn đối với cơ sở dữ liệu này là một số nguyên từ 0 đến 39 (còn gọi là lớp) cho biết danh tính của ngƣời trong hình; tuy nhiên, chỉ với 10 ví dụ cho mỗi lớp,
Tập dữ liệu ban đầu có kích thƣớc 92 x 112, phiên bản đang dùng có kích thƣớc hình 64x64=4096 điểm ảmh.
Ta sẽ xây dựng các chƣơng trình với thuật toán hồi quy dựa trên cơ sở dữ liệu này
3.1.2. Chương trình nội suy ảnh mặt người với các thuật toán hồi quy
# Trong chương trình này chúng ta sẽ nội suy các điểm của nửa ảnh dưới (2048 điểm) từ dữ liệu của các điểm của nửa ảnh trên(2048 điểm). Tập dữ liệu là 400 ảnh từ tập Olivetty như đã nói. Tập huấn luyện gồm 300 ảnh đầu. Tập kiểm tra gồm 100 ảnh sau. Chúng ta sử dụng các mô hình của các thuật toán hồi quy ExtraTrees, KNeighbors, LinearRegression, RidgeCV (như đã tìm hiểu ở chương hai) đã được xây dựng từ thư viện Sklearn để nội suy phần nửa ảnh dưới. Ta tính toán chỉ số MSE (sử dụng hàm từ thư viện) để đánh giá độ chính xác của các mô hình và qua đó có thể chọn mô hình tốt nhất áp dụng cho bài toán dạng này.
# Nhập các thư viện
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn.utils.validation import check_random_state from sklearn.ensemble import ExtraTreesRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.linear_model import LinearRegression from sklearn.linear_model import RidgeCV
data = fetch_olivetti_faces()
# data là một đối tượng với các thuộc tính
# 'data': là mảng 400x4096 phần tử từ 0 đến 1 # 'images': là mảng 400x64x64 phần tử từ 0 đến1
# 'target': là mảng 400 phần tử từ 0-39 sắp xếp theo thứ tự tăng dần với mỗi số có 10 phần tử cũng là ID của từng người trong ảnh.
# khai báo các biến
targets = data.target
data = data.images.reshape(len(data.images),-1)
# len(data.images) = 400. Lệnh trên sắp xếp lại ma trận data.images có 400 hàng. Mỗi hàng có 4096 phần tử (tương ứng với tất cả các điểm trong hình)
# chọn tập huấn luyện với ID từ 0 dến 29
train = data[targets < 30]
# Chọn tập test từ 30-39
test = data[targets >= 30]
# khai báo biến n_faces số phần tử của tập con test đƣợc thể hiện n_faces = 5
# lấy ngẫu nhiên n_faces khuôn mặt để test
rng = check_random_state(3)
face_ids = rng.randint(test.shape[0], size=(n_faces, )) test = test[face_ids, :]
n_pixels = data.shape[1]
# Chọn nữa hình trên làm biến độc lập
X_train = train[:, :(n_pixels + 1) // 2]
# Nữa hình dưới làm biến phụ thuộc
# tương tụ đối với tập test
X_test = test[:, :(n_pixels + 1) // 2] X_test.shape[1]
y_test = test[:, n_pixels // 2:]
# định nghĩa các công cụ huấn luyện
ESTIMATORS = {
"Extra trees": ExtraTreesRegressor(n_estimators=10, max_features=32, random_state=0),
"K-nn": KNeighborsRegressor(),
"Linear regression": LinearRegression(), "Ridge": RidgeCV(),
}
n=[0.1,0.1,0.1,0.1,0.1] i=1
# biến y_test_predict có giá trị kiểu dictionary
y_test_predict = dict()
for name, estimator in ESTIMATORS.items():
estimator.fit(X_train, y_train) # huấn luyện để tạo mô hình # từ mô hình áp vào test để thu được kết quả
y_test_predict[name] = estimator.predict(X_test)
# Tính các sai số MSE từ các mô hình và xuất ra màn hình n[i]=mean_squared_error(y_test,y_test_predict[name]) print('MSE của hồi quy '+name +' là \n ',n[i])
i=i+1
# Plot the completed faces image_shape = (64, 64)
n_cols = 1 + len(ESTIMATORS)
# xác định khung tiêu đề
plt.figure(figsize=(2. * n_cols, 2.26 * n_faces))
# Viết tiêu đề
plt.suptitle("Dự đoán mặt ngƣời nhờ các công cụ học máy hồi quy", size=16)
# tạo dữ liệu hình thật for i in range(n_faces):
true_face = np.hstack((X_test[i], y_test[i])) # tạo khung để trình bày hình thật
if i:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 1) else:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 1, title="true faces")
# trình bày hình thật trong các khung này
sub.axis("off")
sub.imshow(true_face.reshape(image_shape), cmap=plt.cm.gray,
interpolation="nearest")
# trình bày các hình với dự đoán ở nữa dưới for j, est in enumerate(sorted(ESTIMATORS)):
completed_face = np.hstack((X_test[i], y_test_predict[est][i]))
if i:
else:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j, title=est) sub.axis("off") sub.imshow(completed_face.reshape(image_shape), cmap=plt.cm.gray, interpolation="nearest") plt.show()
Hình 3-1 Kết quả dự đoán mặt ngƣời nhờ các công cụ học máy hồi quy
MSE của hồi quy Extra trees là 0.02371322936395485
MSE của hồi quy K-nn là 0.031421512
MSE của hồi quy Linear regression là 0.04658664
MSE của hồi quy Ridge là 0.01857024912938409
Đánh giá độ chính xác của các thuật toán
Giá trị MSE của hồi quy Ridge là nhỏ nhất vì thế có thể nói thuật toán hồi quy Ridge trong trong bài toán này cho kết quả chính xác nhất.
3.2. Chƣơng trình nội suy ảnh mặt ngƣời với dữ liệu tự thu thập
# Dữ liệu tự thu thập là ảnh của một số nhân viên. Trong chương trình này tương tự chúng ta sẽ nội suy các điểm của nửa ảnh dưới (2048 điểm) từ dữ liệu của các điểm(2048) của nửa ảnh trên. Tập huấn luyện gồm 400 ảnh của bộ dữ liệu Olivetti. Tập kiểm tra gồm 4 ảnh nhân viên tự thu thập. Ảnh xám thu được từ các ảnh màu
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 7 12:53:20 2019 @author: Pham Duy Son
"""
import numpy as np
import matplotlib.pyplot as plt import cv2
from sklearn.datasets import fetch_olivetti_faces
from sklearn.utils.validation import check_random_state from sklearn.ensemble import ExtraTreesRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.linear_model import LinearRegression from sklearn.linear_model import RidgeCV
from sklearn.metrics import mean_squared_error
# Load tập dữ liệu hình
data = fetch_olivetti_faces() targets = data.target
data = data.images.reshape((len(data.images), -1)) train = data[targets <= 39]
# Khai báo mảng chứa các ảnh để test
img=np.zeros((5,4096),dtype=float) test=img
# nạp các ảnh nhân viên vào mảng
mau=plt.imread('thanh64m.png')
gray = cv2.cvtColor(mau, cv2.COLOR_BGR2GRAY) data=gray.reshape(1,-1)
img[0]=data[0]
mau=plt.imread('thao64m.png')
gray = cv2.cvtColor(mau, cv2.COLOR_BGR2GRAY) data=gray.reshape(1,-1)
img[1]=data[0]
mau=plt.imread('nhu64m.png')
gray = cv2.cvtColor(mau, cv2.COLOR_BGR2GRAY) data=gray.reshape(1,-1)
img[2]=data[0]
mau=plt.imread('nam64m.png')
gray = cv2.cvtColor(mau, cv2.COLOR_BGR2GRAY) data=gray.reshape(1,-1)
img[3]=data[0]
mau=plt.imread('thuan64m.png')
gray = cv2.cvtColor(mau, cv2.COLOR_BGR2GRAY) data=gray.reshape(1,-1)
img[4]=data[0] test=img
# Test trên 4 ảnh nhân viên
n_faces = 4
rng = check_random_state(1)
test = test[face_ids, :] n_pixels = data.shape[1]
# Nửa hình trên làm biến độc lập
X_train = train[:, :(n_pixels + 1) // 2] X_train.shape[1]
# Nửa hình dưới làm biến phụ thuộc
y_train = train[:, n_pixels // 2:] y_train.shape[1]
X_test = test[:, :(n_pixels + 1) // 2] X_test.shape[1]
y_test = test[:, n_pixels // 2:]
# định nghĩa một directory các công cụ nội suy hình ảnh
ESTIMATORS = {
"Extra trees": ExtraTreesRegressor(n_estimators=10, max_features=32, random_state=0),
"K-nn": KNeighborsRegressor(n_neighbors=5), "Linear regression": LinearRegression(),
"Ridge": RidgeCV(), }
# khai báo mảng chứa các giá trị đánh giá
n=[0.1,0.1,0.1,0.1,0.1] i=1
y_test_predict = dict()
for name, estimator in ESTIMATORS.items(): estimator.fit(X_train, y_train)
y_test_predict[name] = estimator.predict(X_test) y_test_predict[name]
n[i]=mean_squared_error(y_test,y_test_predict[name]) print('MSE của hồi quy '+name +' là \n ',n[i])
i=i+1
# Trình bày khuôn mặt sau dự đoán image_shape = (64, 64)
image_shape
n_cols = 1 + len(ESTIMATORS) n_cols
# định nghia các khung và trình bày các hình
plt.figure(figsize=(2. * n_cols, 2.26 * n_faces))
plt.suptitle("Dự đoán mặt ngƣời nhờ các công cụ học máy hồi quy ", size=16)
for i in range(n_faces):
true_face = np.hstack((X_test[i], y_test[i])) if i:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 1) else:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 1, title="true faces") sub.axis("off") sub.imshow(true_face.reshape(image_shape), cmap=plt.cm.gray, interpolation="nearest")
for j, est in enumerate(sorted(ESTIMATORS)):
completed_face = np.hstack((X_test[i], y_test_predict[est][i])) if i:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j) else:
sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j, title=est); sub.axis("off") sub.imshow(completed_face.reshape(image_shape), cmap=plt.cm.gray, interpolation="nearest") plt.show()
Hình 3-2 Kết quả dự đoán ảnh tự thu thập nhờ các công cụ học máy hồi quy
MSE của hồi quy Extra trees là 0.03036982655372624
MSE của hồi quy K-nn là 0.027879311604158397
MSE của hồi quy Linear regression là 0.07198885565842184
0.03023722849380927
Đánh giá độ chính xác của các thuật toán
Giá trị MSE của hồi quy K-nn là nhỏ nhất vì thế có thể nói thuật toán hồi quy K-nn trong trong bài toán này cho kết quả chính xác nhất.
3.3. Kết luận
Chƣơng 3 đã trình bày rõ nội dung chƣơng trình “Nội suy ảnh mặt ngƣời”, cài đặt các chƣơng trình và thực hiện chƣơng trình với các dữ liệu thử nghiệm: dữ liệu ảnh mặt ngƣời Olivetty, dữ liệu ảnh nhân viên tự thu thập, đánh giá đƣợc hiệu quả của các kỹ thuật hồi quy, nêu ra đƣợc phƣơng pháp có kết quả tốt nhất đối với dữ liệu đã cho.
Việc gọi các mô hình đã có từ các thƣ viện giúp cho việc giải quyết bài toán ít phức tạp hơn. Có thể cùng lúc áp dụng nhiều kỹ thuật hồi quy khác nhau để tính toán và qua đó có thể đánh giá các mô hình có độ chính xác cao nhất. Đó cũng là ƣu điểm của phƣơng pháp này so với các phƣơng pháp xử lý ảnh khác.
Một số ảnh tự thu thập và các chƣơng trình “Nội suy ảnh mặt ngƣời” trên các ảnh này đƣợc chép vào đĩa CD của luận văn.
Nội dung tiếp theo: các kết quả đạt đƣợc trong quá trình nghiên cứu luận văn, những hạn chế và hƣớng phát triển.
KẾT LUẬN VÀ KIẾN NGHỊ
Kết quả đạt đƣợc từ nghiên cứu
Qua thời gian học tập và nghiên cứu, đặc biệt là trong khoảng thời gian làm luận văn, tác giả đã hoàn thiện đƣợc đề tài với các mục tiêu đặt ra ban đầu. Cụ thể luận văn đã đạt đƣợc những kết quả sau:
- Tổng quan những kiến thức cơ bản về học máy.
- Trình bày các thuật toán hồi quy tuyến tính, hồi quy Ridge, cây quyết định, K-nn
- Cài đặt ứng dụng bằng ngôn ngữ Python và đánh giá độ chính xác của mô hình thu đƣợc. Ứng dụng đã giúp nội suy ảnh mặt ngƣời từ các ảnh đã mất 50% dữ liệu.
Ứng dụng đƣợc xây dựng có thể góp phần giải quyết một số vấn đề từ thực tiễn:
- Hiệu chỉnh lại ảnh mặt ngƣời bị hƣ hại
- Trong ngành an ninh có thể tái tạo lại ảnh ngƣời để phục vụ cho công tác nhận dạng
- Là minh họa cho việc sử dụng học máy trong công tác dự đoán dự báo dựa trên một cơ sở dữ liệu đã có.
Hạn chế của đề tài
Vì thời gian có hạn đề tài chƣa nghiên cứu sâu vào các kỹ thuật đƣợc kết hợp đi kèm với cây quyết định để minh họa rõ hơn bài toán với các biến là số thực.
Dữ liệu thu thập chƣa nhiều, chƣa bao quát đƣợc tất cả các trƣờng hợp về dữ liệu trong thực tế.
Hƣớng phát triển
Luận văn cần phát triển sâu để có thể đáp ứng cho bài toán sửa hình và xa hơn là bài toán nhận dạng mặt ngƣời.
Cần bổ sung dữ liệu cho tập huấn luyện để có thể thực hiện nội suy ảnh mặt ngƣời theo các hƣớng khác nhau
Tìm hiểu thêm các nhu cầu từ thực tế để từ đó cải tiến chƣơng trình, cài đặt lại bài toán theo các thuật toán đã nghiên cứu để làm việc tốt hơn với các cơ sở dữ liệu lớn.
DANH MỤC TÀI LIỆU THAM KHẢO
[1]. Hoàng Xuân Huấn (2015), Giáo trình Học máy, NXB Đại học quốc gia, Hà Nội.
[2]. Lê Xuân Vinh (2017), Bài giảng trí tuệ nhân tạo nâng cao, Trƣờng Đại
học Quy Nhơn.
[3]. Lê Xuân Vinh (2018), Machine Learning, Trƣờng Đại học Quy Nhơn [4]. Ông Xuân Hồng (2015), Đánh giá mô hình,
https://ongxuanhong.wordpress.com/2015/08/25/danh-gia-mo-hinh- model-evaluation/, [Truy cập ngày 1/6/2019].
[5]. Một số blog về Machine Learning: Machine Learning cơ bản
(keyword: blog machine learning Việt Nam)
[6]. Andew Ng (2018), CS229 Lecture Notes, Stanford University,USA. [7]. Andrew Fitzgibbon (2012), Computer vision: models, learning and
inference, Simon Prince; published by Cambridge University Press.
Địa chỉ: http://www.computervisionmodels.com/ [Truy cập ngày 2/6/2019]
[8]. Alvira Swalin (2018), Choosing the Right Metric for Evaluating Machine Learning Models, University of San Francisco. Địa chỉ: https://medium.com/usf-msds/choosing-the-right-metric-for-
machine-learning-models-part-1-a99d7d7414e4 [ Truy cập ngày 12/5/2019]
[9]. Aditya Singh (2019), Ridge Regression, NCSS Statistical Software,
https://www.academia.edu/24067601/NCSS_Statistical_Software_ Ridge_Regression, [Truy cập ngày 20/5/2019]
[10]. Aishwarya Singh (2018), A Practical Introduction to K-Nearest Neighbors
https://www.analyticsvidhya.com/blog/2018/08/k-nearest-neighbor- introduction-regression-python/
[11]. Christopher M. Bishop (2006), Pattern Recognition and Machine Learning, Springer Science + Business Media
http://users.isr.ist.utl.pt/wurmd/Livros/school, [Truy cập ngày 22/5/2019]
[12]. Jake VanderPlas (2016), Python data science handbook, O’Reilly Media
Inc, USA.
[13]. Một số video bài giảng của MIT, Stanford (Keyword: Patrick H. Winston MIT, Andrew Ng. Stanford machine learning)
[14]. MathWorks (2019), Ridge , The MathWorks Inc. Địa chỉ:
https://in.mathworks.com/help/stats/ridge.html, [Truy cập ngày 20/6/2019]
[15]. Putcha Vaishanavi (2017), Ridge regresion, MindMajix Technology Inc, Địa chỉ: https://mindmajix.com/ridge-regression, [Truy cập ngày 25/5/2019]
[16]. Saed Sayad (2019), Decision Tree Regression, An Introduction To Data Science. Địa chỉ: https://www.saedsayad.com/decision_
tree_reg.htm, [Truy cập 30/4/2019]
[17]. Scikit-learn developers (2019), Model evaluation: quantifying the quality of predictions. Scikit-learn. Địa chỉ: https://scikit- learn.org/stable/modules/ model_evaluation.html #regression - metrics, [Truy cập ngày 15/6/2019]
[18]. Scikit-learn developers (2019), Linear Regression Example, Scikit-learn. Địa chỉ: https://scikit-learn.org/stable/auto_examples/linear_ model/plot_ols.html #sphx-glr-auto-examples-linear-model-plot- ols-py [Truy cập ngày 25/5/2019]
[19]. Scikit-learn developers (2019), The Olivetti faces dataset, Scikit-learn. Địa chỉ: https://scikit-learn.org/0.19/datasets/olivetti_faces.html
[Truy cập ngày 15/6/2019]
[20]. Wikipedia (2019), Superviced learning, Wikipedia Foundation, Inc. Địa
chỉ: https://en.wikipedia.org/wiki/Supervised_learning, [Truy cập ngày 15/6/2019]