Hình A.6.4.1-1: Minh họa mạng lan truyền thẳng ba lớp

Một phần của tài liệu đề xuất phương pháp truy tìm ảnh mặt người trên video (Trang 141 - 150)

mẫu X =( , ,..., )x x1 2 xT (chưa biết thuộc lớp nào) và tập các lớp Ω = {ω

1, ω2, ω3,…, ωc}, mỗi Nơron đầu ra sẽ tạo ra yi thuộc một trong các lớp này bởi công thức:

1 1 ( | ) {H om ( T mi )} i i ik kj j k j P ω X y f w f w x = = = = ∑ ∑

Ở đây là trọng số giữa Nơron đầu vào thứ j và Nơron ẩn thứ k, wikom là một trọng số từ Nơron ẩn thứ k đến lớp đầu ra thứ i, và f là hàm phi tuyến Sigmoid được xác

định theo công thức: x e x f − + = 1 1 )

( . Các giá trị i, m, o trong các trọng số được dùng để

mi kj

xác định lớp đầu vào, số lớp ẩn, và số lớp đầu ra của mạng Nơron. Chọn Nơron có giá trị lớn nhất vào lớp tương ứng. Mạng này được huấn luyện bởi thuật giải lan truyền ngược với luật học tổng quát delta.

A.6.4.2 Thuật giải lan truyền ngược với luật học tổng quát delta: [25]

Cho không gian các mẫu học (x, t) là giá trị cần huấn luyện; t là giá trị kết quả đích (đầu ra mong muốn) của quá trình huấn luyện. Hệ số học η. Qui định chỉ số lớp là

tăng dần từ lớp đầu vào đến lớp đầu ra. Thuật giải lan truyền ngược được tóm tắt như sau:

(1). Tạo mạng truyền thẳng có nin Nơron đầu vào, nhiden Nơron trên mỗi lớp ẩn và h lớp ẩn trong mạng, với nout đầu ra.

(2). Khởi tạo bộ trọng cho mạng với giá trị nhỏ (3). Trong khi <điều kiện kết thúc chưa thoả> làm :

Với mỗi cặp (x, t) trong không gian mẫu huấn luyện thực hiện:

Xét lớp nhập (*): truyền x qua mạng, tại mỗi lớp xác định đầu ra của mỗi Nơron. Quá trình này được thực hiện đến lớp xuất dựa theo cấu trúc mạng cụ thể.

Xét lớp xuất: đối với đầu ra ok của Nơron k trong lớp xuất K, xác định sai số σ =k ok(1−o tk)(kok).

Chuyển sang lớp ẩn L kế nó, đặt L=K-1

Xét các lớp ẩn (**): với mỗi Nơron l trên lớp ẩn thứ L, xác định sai số 1 (1 ) l l l il i i L o o w σ σ ∈ + = − ∑ Cập nhật lại trọng số có trong mạng, wji wji = wji + Δwji với wji = ησjoji

Nếu (L>1) thì: chuyển sang lớp ẩn trên nó : L=L-1 và quay lại bước (**)

Ngược lại: chọn cặp (x, t) mới trong không gian mẫu học, quay lại bước

Tóm lại, giá trị sai số được tính đầu tiên cho các nơron ở lớp xuất, kết quả này được dùng để tính sai số của các nơron ở lớp ẩn cao nhất, và lớp ẩn kết tiếp thì tính theo kết quả của lớp ẩn cao hơn nó.Cứ thế lan truyền cho đến lớp nhập.

Sau đây là một số chú ý trong việc huấn luyện mạng lan truyền thẳng 3 lớp: Việc khởi tạo trọng số: Bởi vì quá trình huấn luyện cho mạng là một quá trình lặp lại nhiều lần việc học trên tập mẫu. Mỗi lần học, ta cho mạng thực hiện việc ánh xạ các mẫu đầu vào qua một hàm truyền, sau đó tính toán sai số và cập nhật lại trọng số với mục đích là làm sao cho sai số ngày một giảm, tức mạng thực hiện ngày một tốt hơn.Tuy nhiên bởi vì lúc đầu tiên trọng số chưa có nên ta phải tiến hành khởi tạo bộ trọng.

Hệ số học: Về nguyên tắc, hệ số học chỉ cần đủ nhỏ để đảm bảo sự hội tụ của mạng, giá trị của nó chỉ để xác định tốc độ mà mạng đạt được một cực tiểu của hàm đánh giá. Tuy nhiên, trong thực tế, bởi vì mạng hiếm khi được huấn luyện đầy đủ để đạt tới cực tiểu lỗi huấn luyện, nên hệ số học có thể ảnh hưởng khả năng của mạng. Thông thường ta chọn hệ số học là một số dương nhỏ hơn 1.

B.Một số thuật toán chính, cài đặt và hướng dẫn sử dụng

B.1 Một số thuật toán chính:

B.1.1 Thuật toán hiển thị Video lên khung hiển thị

Thuật toán này đảm nhiệm vai trò vẽ nội dung của Video lên khung hiển thị Video của màn hình giao diện.

Đầu vào: Nội dung của tập tin Video đã được giải mã. Đầu ra: Hiển thị ảnh của từng Frame lên màn hình. Mô phỏng thuật toán:

//Nếu Frame hiện hành nhỏ hơn tổng Frame của đoạn Video While (nCurrentFrame < nTotalFrame)

//Lấy Frame từ Video đã được giải mã GetNextFrame();

//Xử lý Frame nhận được để có thể hiện thị được trong khung hiển //thị cho trước.

cvResize();

//Hiển thị Frame lên khung hiển thị ShowImageEZ();

End while;

End DisplayVideo

B.1.2 Thuật toán Giải mã Video đầu vào

Thuật toán này đảm nhiệm vai trò giải mã tập tin Video đầu vào. Trong luận văn này chỉ hỗ trợ cho tập tin AVI.

Đầu vào: Tên của tập tin Video (AVI)

Đầu ra: Toàn bộ nội dung của tập tin Video được lưu dưới dạng từng BYTE. Mô phỏng thuật toán:

VideoDecoder ()

//Khởi tạo bộ giải mã AVIFileInit();

//Mở tập tin Video với đường dẫn cho trước AVIFileOpen();

//Nếu mở thành công và định dạng của tập tin Video đầu vào đúng là định //dạng được hỗ trợ thì tiến hành đọc nội dung của Video

AVIStreamGetFrameOpen();

//Còn nếu không đọc dược file hay định dạng không được hỗ trợ thì giải phóng bộ nhớ và thoát.

AVIStreamRelease(); AVIFileExit();

End VideoDecoder

B.1.3 Thuật giải lan truyền ngược:

Bước 1: Tạo mạng truyền thẳng có Nin nơron đầu vào, Nhiden nơron trên mỗi lớp ẩn và h lớp ẩn trong mạng, Nout nơron đầu ra.

Bước 2: Khởi tạo bộ trọng cho mạng với giá trị nhỏ

Bước 3 :Trong khi <điều kiện kết thúc chưa thoả> làm :

Với mỗi cặp (x, t) trong không gian mẫu huấn luyện thực hiện:

Xét lớp nhập : truyền x qua mạng, tại mỗi lớp xác định đầu ra của mỗi Nơron. Quá trình này được thực hiện đến lớp xuất dựa theo cấu trúc mạng cụ thể.

For(int i=0;i<lsize[0];i++) out[0][i]=in[i];

Gán dữ liệu cho tầng nhập :lsize[0] là kích thước tầng nhập, in[i] là giá trị nhập thứ i, out[0][i] là giá trị xuất của nơron i của tầng nhập.

For (i=1;i< numl ;i++) {

//Xét từng tầng với numl là số tầng For(int j=0;j<lsize[i];j++){

//xét mỗi nơron trong tầng hiện tại đang xét : lsize[i] là kích thước hay số phần tử trong tầng thứ i

Sum=0.0; // khởi tạo sum

For(int k=0;k<lsize[i-1];k++){ //cho ngõ nhập từ mỗi nơron ở tầng trước

sum+=out[i-1][k]*weight[i][j][k];

//weight[i][j][k] là trọng số nối kết của nơron k ở tầng (i-1) với nơron j ở tầng i

}

sum+=weight[i][j][lsize[i-1]]; out[i][j]=sigmoid(sum);

//gọi hàm sigmoid tính và gán giá trị cho ngõ xuất của nơron j trong tầng i (out[i][j])

} }

Xét lớp xuất: đối với đầu ra ok của Nơron k trong lớp xuất k, xác định sai số σ =k ok(1−o tk)(kok).

for(int i=1;i<lsize[numl-1];i++){

delta[numl-1][i]=out[numl-1][i]*(1-out[numl-1][i])*(tgt[i]-out[numl-1][i]); }

Chuyển sang lớp ẩn L kế nó, đặt L=k-1

Xét các lớp ẩn: với mỗi Nơron trên lớp ẩn thứ L, xác định sai số

k output k kh h h h o o w δ δ ← (1− )∑∈ For(i=numl-2;i>0;i--){ For(int j=0;j<lsize[i];j++){ Sum=0.0; For(int k=0;k<lsize[i+1];k++){ Sum+=delta[i+1][k]*weight[i+1][k][j]; } Delta[i][j]=out[i][j]*(1-out[i][j])*sum; } } Cập nhật lại trọng số có trong mạng :

ji ji ji ω ω ω ← + ∆ với ∆ωji =ηδjxji for(i=1;i<numl;i++){ for(int j=0;j<lsize[i];j++){ for(int k=0;k<lsize[i-1];k++){ prevDwt[i][j][k]=beta*delta[i][j]*out[i-1][k]; weight[i][j][k]+=prevDwt[i][j][k]; } prevDwt[i][j][lsize[i-1]]=beta*delta[i][j]; weight[i][j][lsize[i-1]]+=prevDwt[i][j][lsize[i-1]]; } }

Nếu (L>1) thì: chuyển sang lớp ẩn trên nó : L=L-1 và quay lại bước 3.3 Ngược lại: chọn cặp (x, t) mới trong không gian mẫu học, quay lại bước 3.1

B.1.4 Thuật toán SVM nhiều lớp:

Bước 1: Khởi tạo mảng vote gồm nr_class lớp int i;

int nr_class = model->nr_class;

double *dec_values = Malloc(double, nr_class*(nr_class-1)/2); svm_predict_values(model, x, dec_values);

int *vote = Malloc(int,nr_class); for(i=0;i<nr_class;i++)

vote[i] = 0;

Bước 2: Trong khi duyệt trên các lớp từ i=0 đến nr_class-1 Trong khi duyệt trên các lớp kế j=i+1 đến nr_class-1

Nếu mẫu X thuộc lớp i thì tăng giá trị vote[i]

Ngược lại X thuộc lớp j thì tăng giá trị vote[j] int pos=0;

for(int j=i+1;j<nr_class;j++) { if(dec_values[pos++] > 0) ++vote[i]; else ++vote[j]; }

Bước 3: Duyệt trên mảng vote, giá trị nào lớn nhất thì chỉ số của mảng sẽ là lớp mà mẫu X thuộc về . int vote_max_idx = 0; for(i=1;i<nr_class;i++) if(vote[i] > vote[vote_max_idx]) vote_max_idx = i; B.2 Cài đặt:

Chương trình thử nghiệm được cài đặt bằng ngôn ngữ C++ trên hệ điều hành Microsoft Windows XP, sử dụng môi trường lập trình Microsoft Visual C++ 6.0 IDE.

. Được thử nghiệm trên máy PC P4 3GHz. Các lớp chính của chương trình:

 CDetect: Dùng để phát hiện khuôn mặt, mắt, miệng.

 CImageProcessing: Dùng thực hiện các biến đổi xử lý ảnh.

 CcreateData: Dùng để tạo dữ liệu cho PCA và ICA, dữ liệu cho ICA là dữ liệu đã được qua PCA.

 CPCA: Dùng biến đổi PCA.

 CregICA: Dùng nhận dạng với cách rút trích đặc trưng ICA.

 VideoDecoder: Dùng để giải mã video.

 CMPEGViewer: Dùng để hiển thị Video.

Các thư viện được sử dụng trong luận văn:

 Thư viện xử lý ảnh OpenCV của Intel: dùng cài đặt PCA và dò tìm khuôn mặt.[31]

 Thư viện SVM svmlib2.8: dùng phân lớp SVM.

 Thư viện toán học MKL (Math Kernel Library) của intel dùng cho thuật toán ICA [30]

 Thư viện itpp-3.10.9 có cài đặt sẵn ICA [29]

B.3 Hướng dẫn sử dụng: B.3.1 Màn hình chính:

Hình B.3.1 – 1: Giao diện chính của chương trình

Một phần của tài liệu đề xuất phương pháp truy tìm ảnh mặt người trên video (Trang 141 - 150)