Chƣơng trình nội suy ảnh mặt ngƣời

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu kỹ thuật hồi quy trong học máy và ứng dụng nội suy trên ảnh mặt người (Trang 59)

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á 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]

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu kỹ thuật hồi quy trong học máy và ứng dụng nội suy trên ảnh mặt người (Trang 59)