Tải bản đầy đủ (.docx) (19 trang)

Nhận diện khuôn mặt sử dụng phương pháp trích rút đặc trưng PCA và thực hiện phân lớp bằng naïve bayes

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (456.92 KB, 19 trang )

BỘ CÔNG NGHIỆP
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
======***======

Báo cáo bài tập lớn
Nhập môn lý thuyết nhận dạng
Giáo viên:
Nhóm - Lớp:
Thành viên:

Đề tài:

Nhận diện khuôn mặt sử dụng phương pháp trích
rút đặc trưng PCA và thực hiện phân lớp bằng naïve
bayes


2

Nhập môn lý thuyết nhận dạng


3

LỜI MỞ ĐẦU
Hiện nay, Cùng với sự phát triển của xã hội, vấn đề an ninh bảo mật đang được
yêu cầu khắt khe tại mọi quốc gia trên thế giới. Các hệ thống nhận dạng con người
được ra đời với độ tin cậy ngày càng cao. Một trong các bài toán nhận dạng con người
rất được quan tâm hiện nay là nhận dạng khuôn mặt. Vì nhận dạng khuôn mặt là cách
mà con người dung để phân biệt nhau. Bên cạnh đó, ngày nay việc thu thập xử lý


thông tin qua ảnh để nhận biết đối tượng đang được quan tâm và ứng dụng rộng rãi.
Với phương pháp này chúng ta có thể thu thập được nhiều thông tin từ đối tượng mà
không cần tác động nhiều đến đối tượng nghiên cứu. Sự phát triển của khoa học máy
tính tạo môi trường thuận lợi cho bài toán nhận dạng mặt người từ ảnh số.
Trong bài toán này chúng em sẽ giải quyết bài toán nhận dạng mặt người dùng phương
pháp trích chọn đặc trưng PCA(Principle Components Analysis) và phân lớp bằng
Naïve bayes. Trong đó Phương pháp PCA sẽ dùng để trích chọn đặc trưng một tập cơ
sở dữ liệu ảnh mặt người và một trong các ảnh test bất kỳ bên ngoài. Còn phương pháp
Naïve bayes sẽ dùng để phân lớp ảnh test đã được trích chọn đặc trưng PCA thuộc vào
lớp nào trong các lớp đã được học.

Nhập môn lý thuyết nhận dạng


4

MỤC LỤC
Chương 1.

Giới thiệu..............................................................................................................4

1.

Phương pháp trích chọn đặc trưng PCA(Principle Components Analysis).....................4

2.

phương pháp phân lớp bằng Naïve bayes........................................................................5

Chương 2.


Áp dụng giải quyết bài toán..................................................................................8

1.

Các bước giải quyết bài toán............................................................................................8

2.

Tiếp nhận ảnh đầu vào và thực hiện phân lớp sử dụng naïve bayes trên tập huấn luyện 8

Chương 3.

Chương trình và kết quả........................................................................................9

1.

Chương trình....................................................................................................................9

2.

Kết quả...........................................................................................................................18

Nhập môn lý thuyết nhận dạng


5

Chương 1. Giới thiệu
1. Phương pháp trích chọn đặc trưng PCA(Principle Components

Analysis)
1.1 Giới thiệu.
PCA(Principle Components Analysis) là một thuật toán được sử dụng để
tạo ra một ảnh mới từ ảnh ban đầu. Ảnh mới này có kích thước nhỏ hơn rất
nhiều so với ảnh đầu vào và vẫn mang những đặc trưng cơ bản nhất của ảnh
cần nhận dạng PCA không quan tâm đến việc tìm ra các đặc điểm cụ thể của
thực thể cần nhận dạng và mối quan hệ giữa các đặc điểm đó. Tất cả các chi
tiết đó được thể hiện ở ảnh mới được tạo ra từ PCA.
- Ưu điểm của phương pháp PCA
 Tìm được các đặc tính tiêu biểu của đối tượng cần nhận dạng mà
không cần phải xác định thành phần và mối quan hệ giữa các thành
phần đó.
 Thuật toán có thể thực hiện tốt với các ảnh có độ phân giải cao.
 PCA có thể kết hợp với các phương pháp khác như mạng noron,
Support Vector Machine… để mang lại hiệu quả cao.
- Nhược điểm của phương pháp PCA
 PCA phân loại theo chiều phân bố lớn nhất của tập vector. Tuy
nhiên chiều phân bố lớn nhất không phải lúc nào cũng mang lại
hiệu quả lớn nhất cho bài toán nhận dạng.
 PCA rất nhạy với nhiễu.

1.2 Thuật toán.
Input: Bảng Dữ liệu X cấp n p ứng với n mẫu và p thuộc tính.
Output: Bảng dữ liệu Y cấp n d ứng với n mẫu và d thuộc tính(dBước 1: Tiền xử lý dữ liệu: Chuẩn hóa X theo phương pháp Z-scores.
Z-Score là một trong những kỹ thuật phổ biến liên quan đến kỳ vọng và độ
lệch chuẩn của X =
- Giá trị kỳ vọng (còn gọi là giá trị trung bình) và độ lệch chuẩn tính :

-


Dữ liệu sau chuẩn Z-Score = (,…,), tính theo công thức: =

Bước 2: Tính ma trận hiệp phương sai C cấp p x p.

Cij it - µi)(jt -µj)
Bước 3: Tìm các giá trị riêng i và các véc tơ riêng tương ứng ui,
1

>=2 >=…>= p >= 0

Bước 4: Chọn d véc tơ đầu tiên lập thành W cấp dp
Nhập môn lý thuyết nhận dạng


6

Bước 5: Tính Yn x d

= X W’

2. phương pháp phân lớp bằng Naïve bayes
2.1 Giới thiệu.
Naive Bayes Classification (NBC) là một thuật toán dựa trên định lý Bayes
về lý thuyết xác suất để đưa ra các phán đoán cũng như phân loại dữ liệu dựa
trên các dữ liệu được quan sát và thống kê. Naive Bayes Classification là một
trong những thuật toán được ứng dụng rất nhiều trong các lĩnh vực Machine
learning dùng để đưa các dự đoán chính xác nhất dự trên một tập dữ liệu đã
được thu thập, vì nó khá dễ hiểu và độ chính xác cao. Nó thuộc vào
nhóm Supervised Machine Learning Algorithms (thuật toán học có hướng dẫn),

tức là máy học từ các ví dụ từ các mẫu dữ liệu đã có.
Định lý Bayes cho phép tính xác suất xảy ra của một sự kiện ngẫu nhiên A
khi biết sự kiện liên quan B đã xảy ra. Xác suất này được ký hiệu là P(A|B), và
đọc là “xác suất của A nếu có B”. Đại lượng này được gọi xác suất có điều kiện
hay xác suất hậu nghiệm vì nó được rút ra từ giá trị được cho của B hoặc phụ
thuộc vào giá trị đó.
Theo định lí Bayes, xác suất xảy ra A khi biết B sẽ phụ thuộc vào 3 yếu tố:
 Xác suất xảy ra A của riêng nó, không quan tâm đến B. Kí hiệu là P(A) và đọc
là xác suất của A. Đây được gọi là xác suất tiên nghiệm, nó là “tiên nghiệm”
theo nghĩa rằng nó không quan tâm đến bất kỳ thông tin nào về B.
 Xác suất xảy ra B của riêng nó, không quan tâm đến A. Kí hiệu là P(B) và đọc
là “xác suất của B”. Đại lượng này còn gọi là hằng số chuẩn hóa (normalising
constant), vì nó luôn giống nhau, không phụ thuộc vào sự kiện A đang muốn
biết.
 Xác suất xảy ra B khi biết A xảy ra. Kí hiệu là P(B|A) và đọc là “xác suất của B
nếu có A”. Đại lượng này gọi là khả năng xảy ra B khi biết A đã xảy ra.

2.2 Dữ liệu huấn luyện

-

Xét tập dữ liệu huấn luyện X gồm n mẫu có m thuộc tính(thuộc tính thực)
và một thuộc tính lớp => X R

nxm+1

-

Ký hiệu C


-

Cho một mẫu thử z Rm cần dự đoán giá trị của thuộc tính y, hay nói cách

= {c1,…,ck}là tập ký hiệu các lớp(k lớp)

Mỗi phần tử x X là một vector m+1 chiều, ký hiệu x = (x1,…,xm,y)
y C là giá trị của thuộc tính lớp



khác là cần xác định lớp c C cho mẫu z (z chỉ thuộc về một lớp duy nhất)
Nhập môn lý thuyết nhận dạng


7

2.3 Ý tưởng của thuật toán
-

Để xác định lớp của mẫu z ta tính xác xuất có điều kiện để z được phân

-

vào lớp ci , ký hiệu P(ci
Theo định lý bayes:

P(ci | z)
-


| z) với i = 1 … k.

=

Trong Naïve Bayes sử dụng giả thiết các thuộc tính của dữ liệu độc lập
nhau, nên theo lý thuyết xác suất ta có:

=
-

(1)
(2)

Thay (2) vào (1) ta có :

P(ci | z)

=

-

Mẫu z sẽ được phân vào lớp ci có P(ci | z) max

-

Trong công thức (1) do P(z) là hằng số với mọi ci nên P(ci | z) max
khi:

max


2.4 Thuật toán Naïve bayes
Bước 1: Với mỗi lớp ci C ta tính :
-

Xác suất tiên nghiệm P(ci): xác suất tiên nghiệm xấp xỉ tỷ số giữa số
lượng mẫu của X thuộc lớp ci trên tổng số lượng mẫu.

-

Đối với mỗi giá trị tính xác suất : xác suất xảy ra giá trị trong lớp ci. Giá
trị được tính xấp xi bằng tỷ lệ số mẫu có giá trị bằng trong lớp ci với số
lượng mẫu thuộc lớp ci.

Bước 2: Phân mẫu thử Z vào ci lớp thỏa mãn

max
2.5 Phương pháp Naïve Bayes trong trường hợp thuộc tính có kiểu
liên tục
 Trong trường hợp thuộc tính có kiểu liên tục. Ta có thể rời rạc hóa
trước khi áp dụng Naïve Bayes.

Nhập môn lý thuyết nhận dạng


8

 Xét thuộc tính A có kiểu liên tục, ta cần tính giá trị kỳ vọng (µ) và
phương sai() của thuộc tính A với mỗi lớp

ci


 Ký hiệu Di là gồm các mẫu huấn luyện của lớp
thuộc tính A của mẫu huấn luyện d khi đó:

ci, d(A) là giá trị tại

µ= ,
= )2
 Giá trị = gọi là phân bố xác suất của vào lớp ci tính:

exp

Chương 2. Áp dụng giải quyết bài toán
1.

Các bước giải quyết bài toán
- Bước 1: Tiếp nhận ảnh đầu vào với số lượng ảnh là 25 ảnh của 5 cầu thủ nổi
tiếng thế giới đã được chia thành 5 lớp khác nhau.
- Bước 2: Xác định khuôn mặt cầu thủ và khống chế kích thước của ảnh sao
cho các ảnh có kích thước bằng nhau 80x70
- Bước 3: Thực hiện duỗi ảnh kích thước 80x70 thành 1 mảng 5600 phần tử để
biểu diễn bức ảnh đó. Kết hợp các mảng của các ảnh ta có 1 ma trận gồm 25 cột
và 5600 dòng.
- Bước 4: Thực hiện PCA trên ma trận tập ảnh ta vừa có . Sau quá trình trích rút
đặc trưng ta thu được ma trận kích thước 25x25.

2.

Tiếp nhận ảnh đầu vào và thực hiện phân lớp sử dụng naïve bayes
trên tập huấn luyện

- Bước 1: Xác định khuôn mặt trên bức ảnh đầu vào và khống chế kích thước
ảnh bằng với kích thước ảnh tập huấn luyện .
- Bước 2: Sử dụng PCA trước đó được sử dụng để trích rút tập huấn luyện để
trích rút với bức ảnh mới ta thu được 1 mảng gồm 25 phần tử .
- Bước 3: Tính kỳ vọng và và phương sai đối của bức ảnh với từng lớp ảnh đã
được trích rút trong tập huấn luyện.
Nhập môn lý thuyết nhận dạng


9

- Bước 4: Tính giá trị phân bố xác suất của từng thuộc tính của ảnh trên thuộc
tính của từng lớp ảnh huấn luyện
- Bước 5: Lấy giá trị phân bố xác suất lớn nhất xuất hiện và phân bức ảnh vào
lớp đó.

3.

Các công cụ cần có để cài đặt chương trình.




Visual studio 2017
SQL server
Nuget package manager cần tải về:
• Accord .NET
• EmguCV

Chương 3. Chương trình và kết quả

1. Chương trình
using
using
using
using
using
using
using
using
using
using
using
using
using
using

Accord.Imaging.Converters;
Accord.MachineLearning;
Accord.MachineLearning.Bayes;
Accord.Math;
Accord.Statistics.Analysis;
Accord.Statistics.Distributions.Univariate;
Emgu.CV;
Emgu.CV.Structure;
System;
System.Collections.Generic;
System.Drawing;
System.IO;
System.Linq;
System.Windows.Forms;


namespace Nhandangmat
{
public partial class Form1 : Form
{
/// <summary>
/// Bien Private
/// </summary>
#region
double[][] features;
int[] outputs;
int NBC = 0;
MinimumMeanDistanceClassifier classifier;
NaiveBayes<NormalDistribution> bayes;
Nhập môn lý thuyết nhận dạng


10

double[][] kmean;
PrincipalComponentAnalysis pca;
private CascadeClassifier _cascadeClassifier;
#endregion
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Load anh vao form
/// </summary>

#region
private void Form1_Load(object sender, EventArgs e)
{
var path = new
DirectoryInfo(Path.Combine(Application.StartupPath, @"E:\Lab_C+++
+\Nhandangmat\Nhandangmat\Anh\"));
int currentClassLabel = 0;
// For every class folder
foreach (var classFolder in path.EnumerateDirectories())
{
string name = classFolder.Name;
// For each file in the class folder
FileInfo[] files = GetFilesByExtensions(classFolder,
".PNG").ToArray();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i];
Bitmap image = (Bitmap)Bitmap.FromFile(file.FullName);
Listbyte>>();

L1 = Dection(image);

dataGridView1.Rows.Add(name, currentClassLabel, image);
dataGridView2.Rows.Add(name, currentClassLabel,
L1[0].ToBitmap());
}
currentClassLabel++;
}
NBC = currentClassLabel;

}
private IEnumerable<FileInfo> GetFilesByExtensions(DirectoryInfo
dir, params string[] extensions)
Nhập môn lý thuyết nhận dạng


11

{
if (extensions == null)
throw new ArgumentNullException("extensions");
IEnumerable<FileInfo> files = dir.EnumerateFiles();
return files.Where(f => extensions.Contains(f.Extension));
}
#endregion
/// <summary>
/// TP ben trong Region: xu lys button1_click : xu ly PCA;
/// ----------------------------------------------------------------------------------///
Method:
///
extrac: chuyen du lieu ve ma tran ;
///
Dection: nhan dien khuon mat vowi kich
thuoc:70x70
///
-------------------------------------------------------------------------------------------/// B1: Anh datagridview 2 duoc xac dinh mat bang anh cua
datagridview 1
/// B2: PCA bang anh cua datagridview 2
/// B3: hien thi anh sau PCA len datagridview 3 va chi so Properson
/// </summary>

#region
private void button1_Click(object sender, EventArgs e)
{
dataGridView3.Rows.Clear();
#region
// Vecto ma trận ảnh
double[][] hands1 = extract();
double[][] hands = Accord.Statistics.Tools.ZScores(hands1);
// Tạo mới đối tượng Principal Component Analysis
pca = new PrincipalComponentAnalysis()
{
Method = PrincipalComponentMethod.Center,
ExplainedVariance = 0.9
//độ lợi phương sai
};
// Học chúng
pca.Learn(hands);
// Chuyển đổi các vector riêng thành hình ảnh tương ứng
ArrayToImage reverse = new ArrayToImage(80, 70);
// duyet Pca da co
for (int i = 0; i < pca.Components.Count; i++)
{
// Vector ảnh
double[] vector = pca.Components[i].Eigenvector;
reverse.Max = vector.Max();
reverse.Min = vector.Min();
// Vector và ảnh vector
Bitmap eigenHand; reverse.Convert(vector, out eigenHand);
Nhập môn lý thuyết nhận dạng



12

dataGridView3.Rows.Add(eigenHand,
pca.Components[i].Proportion);
}
ImageToArray converter = new ImageToArray(min: -1, max: +1);
int rows = dataGridView2.Rows.Count;
double[][] inputs = new double[rows][];
features = new double[rows][];
kmean = new double[rows][];
outputs = new int[rows];
int index = 0;
foreach (DataGridViewRow row in dataGridView2.Rows)
{
Bitmap image = row.Cells["ImageActor"].Value as Bitmap;
int label = (int)row.Cells["CollCorl"].Value;
double[] input;
converter.Convert(image, out input);
double[] feature = pca.Transform(input);
//ProjectPCA.Add(feature);
row.Tag = feature;
inputs[index] = input;
features[index] = feature;
kmean[index] = feature;
outputs[index] = label;
row.Cells["Projection"].Value = feature.ToString("N2");
index++;

}

classifier = new MinimumMeanDistanceClassifier(features,
outputs);
#endregion
}
double[][] extract()
{
double[][] hands = new double[dataGridView1.Rows.Count][];
ImageToArray converter = new ImageToArray(min: -1, max: +1);
int index = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
Listbyte>>();
Bitmap image = row.Cells["Image"].Value as Bitmap;
L1 = Dection(image);
converter.Convert(L1[0].ToBitmap(), out hands[index]);
Nhập môn lý thuyết nhận dạng


13

index++;
}
}

return hands;

private List{
List

Image<Bgr, byte> imageAnh = new Image<Bgr, byte>(image);
_cascadeClassifier = new CascadeClassifier("E:\\Lab_C+++
+\\Nhandangmat\\Nhandangmat\\haarcascade_frontalface_alt2.xml");
using (var imageFrame = imageAnh)
{
if (imageFrame != null)
{
var grayframe = imageFrame;
var faces = _cascadeClassifier.DetectMultiScale(grayframe,
1.1, 10, Size.Empty);
foreach (var face in faces)
{
imageFrame.ROI = new Rectangle(face.Location.X,
face.Location.Y, 80, 70);
l.Add(imageFrame.Copy());
}
}
}
return l;
}
#endregion
/// <summary>
/// Trong region gom: button2_Click: chon anh tu file Test
///
button3_Click: Hient hien anh se PCA len
Datagridview 4 va PCA no
///
Dection1 : Xac dinh khuon mat
/// ------------------------------------------------------------------------------///
/// </summary>

#region
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog file = new OpenFileDialog();
file.ShowDialog();
Bitmap Image = new Bitmap(file.FileName);
pictureBox1.Image = Image;
}
private void button3_Click(object sender, EventArgs e)
{
dataGridView4.Rows.Clear();
Nhập môn lý thuyết nhận dạng


14

Bitmap Image = new Bitmap(pictureBox1.Image);
Bitmap Face = Dection1(Image)[0].ToBitmap();
dataGridView4.Rows.Add(Face);
ImageToArray converter = new ImageToArray(min: -1, max: +1);
int index1 = 0;
double[] feature = new double[dataGridView1.Rows.Count];
foreach (DataGridViewRow row in dataGridView4.Rows)
{
Bitmap image = row.Cells["UpImage"].Value as Bitmap;
double[] input;
converter.Convert(image, out input);
feature = pca.Transform(input);
row.Cells["ProPertion"].Value = feature.ToString("N2");
index1++;

}
//double[][] Fmau = Accord.Math.Matrix.Transpose(features);
//var teacher = new
NaiveBayesLearning<NormalDistribution>();
//bayes = teacher.Learn(features, outputs);
//double[] sa = bayes.Probabilities(feature);
//lblClass.Text = bayes.Decide(feature).ToString();
#region
int nv = 0;
double[] navbay = new double[NBC];
for (int i = 0; i < NBC; i++)
{
double[][] lopi = clasfe(features, i, outputs);
double[] kvi = kyvong(lopi);
double[] psi = phuongsai(lopi);
double[] kqi = Px(psi, kvi, feature);
double kqclassi = tich(kqi);
navbay[nv] = kqclassi;
nv++;
}
#region

}

#endregion
for (int i = 0; i < navbay.Length; i++)
{
if (navbay[i] == navbay.Max())
{
lblClass.Text = i.ToString();

break;
}
}
#endregion

Nhập môn lý thuyết nhận dạng


15

public List{
ListImage<Bgr, byte> imageAnh = new Image<Bgr, byte>(image);
CascadeClassifier _cascadeClassifier = new
CascadeClassifier("E:\\Lab_C+++
+\\Nhandangmat\\Nhandangmat\\haarcascade_frontalface_alt2.xml");
using (var imageFrame = imageAnh)
{
if (imageFrame != null)
{
var grayframe = imageFrame;
var faces = _cascadeClassifier.DetectMultiScale(grayframe,
1.1, 10, Size.Empty);
foreach (var face in faces)
{
imageFrame.Draw(face, new Bgr(Color.BurlyWood), 3);
imageFrame.ROI = new Rectangle(face.Location.X,
face.Location.Y, 80, 70);
l.Add(imageFrame.Copy());

}
}
}
return l;
}
#endregion
// Phan lop KNN
#region
private double[][] clasfe(double[][] a, int classes, int[] classa)
{
double[][] b = new double[5][];
int dem = 0;
for (int i = 0; i < classa.Length; i++)
{
if (classa[i] == classes)
{
b[dem] = new double[dataGridView1.Rows.Count];
for (int j = 0; j < a[i].Length; j++)
{
b[dem][j] = double.Parse(a[i][j].ToString("N2"));
}
dem++;
}

}

}
return b;

Nhập môn lý thuyết nhận dạng



16

private double[] kyvong(double[][] a)
{
double[] kv = new double[dataGridView1.Rows.Count];
for (int i = 0; i < a[0].Length; i++)
{
double avg = double.Parse(((a[0][i] + a[1][i] + a[2][i] + a[3]
[i] + a[4][i]) / 5).ToString());
kv[i] = avg;
}
return kv;
}
private double[] phuongsai(double[][] a)
{
double[] kv = new double[dataGridView1.Rows.Count];
for (int i = 0; i < a[0].Length; i++)
{
double avg = (a[0][i] + a[1][i] + a[2][i] + a[3][i] + a[4][i]) / 5;
double sum = Math.Pow((a[0][i] - avg), 2) + Math.Pow((a[1][i]
- avg), 2) + Math.Pow((a[2][i] - avg), 2) +
Math.Pow((a[3][i] - avg), 2) + Math.Pow((a[4][i] - avg), 2);
kv[i] = sum;

}
return kv;
}


private double[] Px(double[] ps, double[] kv, double[] f)
{
double[] kq = new double[dataGridView1.Rows.Count];
for (int i = 0; i < ps.Length; i++)
{
double e1 = 1 / (Math.Sqrt(2 * Math.PI * ps[i]));
double e = Math.Pow(Math.E, -(Math.Pow(f[i] - kv[i], 2) / (2 *
ps[i])));
double re = e1 * e;

}

kq[i] = re;
}
return kq;

private double tich(double[] a)
{
double t = 1;
for (int i = 0; i < a.Length; i++)
{
if (a[i] > 0)
Nhập môn lý thuyết nhận dạng


17

t = t * a[i];
else
t = t * 0.00000001;

}
return double.Parse((t * 5 /
dataGridView1.Rows.Count).ToString());
}
#endregion
}
}

2. Kết quả.

Hình 1: Màn hình ban đầu

Nhập môn lý thuyết nhận dạng


18

Hình 2: Kết quả sau khi PCA

Hình 3: Kết quả sau khi phân lớp ảnh đầu vào bất kỳ

Nhập môn lý thuyết nhận dạng


19

Tài Liệu tham khảo
/> />
Nhập môn lý thuyết nhận dạng




×