S Ự CẦN THIẾT CỦA VẤN ĐỀ NGHIÊN CỨU
Việc nhận diện khuôn mặt của nam và nữ có thể rất phức tạp, phụ thuộc vào góc độ quan sát và cách nhìn của người quan sát Các góc nhìn khác nhau có thể dẫn đến kết quả nhận diện giới tính không đồng nhất của một người.
Với sự tiến bộ của các thuật toán trí tuệ nhân tạo, tôi đã chọn đề tài "Phân biệt giới tính dựa trên ảnh khuôn mặt sử dụng thuật toán Kernel Support Vector Machine" để phát triển một hệ thống giúp máy tính tự động phân loại giới tính từ ảnh khuôn mặt.
M ỤC TIÊU NGHIÊN CỨU
Đề tài tập trung vào các mục tiêu chính sau:
- Nghiên cứu tổng quan về bài toán phân biệt giới tính
- Nghiên cứu trích chọn đặc trƣng của khuôn mặt
- Nghiên cứu và cài đặt thuật toán Kernel Support Vector để phân biệt giới tính dựa trên ảnh khuôn mặt.
Đ ỐI TƢỢNG VÀ PHẠM VI NGHIÊN CỨU
- Nghiên cứu các tài liệu về bài toán phân biệt giới tính đã công bố ở trong và ngoài nước
- Nghiên cứu chung về bài toán nhận dạng mẫu
- Nghiên cứu tài liệu về trích chọn đặc trƣng khuôn mặt cho hệ thống nhận dạng
- Nghiên cứu thuật toán Kernel Support Vector Machine để xây dựng hệ thống nhận dạng
- Tìm hiểu và sử dụng cơ sở dữ liệu ảnh khuôn mặt
- Nghiên cứu ngôn lập trình Python và cài đặt thuật toán Kernel Support Vector Machine cho bài toán nhận dạng giới tính trên ảnh khuôn mặt
- Đánh giá hiệu quả của thuật toán Kernel Support Vector Machine
Trong phạm vi luận văn này, tôi tập trung giải quyết bài toán nhận dạng giới tính sử dụng thuật toán Kernel Support Vector Machine.
N ỘI DUNG NGHIÊN CỨU
- Nghiên cứu tổng quan về các hệ thống nhận dạng giới tính trên ảnh khuôn mặt đã đƣợc công bố
- Tìm hiểu các thuật toán tiền xử lý để nâng cao chất lƣợng ảnh
- Tìm hiểu các phương pháp để trích chọn đặc trưng của khuôn mặt
- Nghiên cứu thuật toán Kernel Support Vector Machine
- Nghiên cứu ngôn ngữ lập trình Python để cài hệ thống nhận dạng
- Lập trình thuật toán trên máy tính và đánh giá hiệu quả của thuật toán
T ỔNG QUAN VỀ NHẬN DẠNG MẪU
Học máy, một lĩnh vực quan trọng của trí tuệ nhân tạo, đang phát triển mạnh mẽ Các kỹ thuật học máy giúp máy tính tự động học hỏi và cải thiện hiệu suất mà không cần lập trình cụ thể.
Học máy là một phương pháp quan trọng trong trí tuệ nhân tạo, cho phép các chương trình máy tính cải thiện hiệu suất dựa trên kinh nghiệm, quan sát và dữ liệu từ quá khứ Nó đã chứng minh được nhiều ứng dụng thành công trong thực tế.
- Xử lý ngôn ngữ tự nhiên
- Phát hiện và nhận dạng mặt người
- Lọc thƣ rác, phân loại văn bản, phân biệt giới tính nam/nữ,…
Pattern recognition is a subfield of machine learning that encompasses a range of supervised learning methods A notable example of these methods is the Support Vector Machine algorithm.
Trong những năm gần đây, bộ phân loại máy hỗ trợ vector (SVM) đã trở thành một công cụ quan trọng trong lĩnh vực nhận dạng và phân loại Phương pháp SVM đặc biệt hiệu quả trong việc nhận dạng giới tính, cho thấy khả năng nhận diện tốt và ứng dụng rộng rãi trong nhiều lĩnh vực khác.
1.1.2 Phân lớp bài toán nhận dạng
Phân lớp là quá trình xử lý nhằm phân loại các mẫu dữ liệu hoặc đối tượng vào các lớp đã được xác định trước Việc phân loại này dựa trên giá trị của các thuộc tính của từng mẫu dữ liệu hoặc đối tượng Sau khi hoàn tất, tất cả các đối tượng đã biết sẽ được xếp vào các lớp tương ứng.
9 vào các lớp tương ứng, khi đó mỗi lớp được đặc trưng bởi tập các thuộc tính của các đối tƣợng chứa trong lớp đó
Bài toán phân lớp có khả năng xử lý thông tin từ nhiều lĩnh vực của con người và thế giới tự nhiên, được biểu diễn dưới dạng bảng Bảng này bao gồm các đối tượng và thuộc tính, trong đó các phần tử xác định giá trị của các thuộc tính (attributes hay features) của đối tượng Số cột trong bảng tương ứng với số thuộc tính, trong khi số dòng đại diện cho số đối tượng trong dữ liệu Các dạng dữ liệu khác cũng có thể được chuyển đổi thành dạng bảng để thực hiện quá trình phân lớp.
1.1.3 Chu trình thiết kế hệ thống nhận dạng mẫu
Bước này nhằm xây dựng một mô hình để xác định các lớp dữ liệu thông qua việc phân tích các bộ dữ liệu trong cơ sở dữ liệu, mỗi bộ dữ liệu được xác định bởi giá trị của các thuộc tính Giả sử mỗi bộ dữ liệu thuộc về một lớp đã được định nghĩa trước, điều này được xác định bởi một thuộc tính phân loại Trong bài toán phân loại, mỗi bộ dữ liệu được xem như một mẫu, ví dụ, hay đối tượng Các bộ dữ liệu được phân tích để xây dựng mô hình phân loại được lấy từ tập dữ liệu huấn luyện (training data set), trong đó các bộ dữ liệu riêng lẻ tạo thành tập dữ liệu huấn luyện còn được gọi là mẫu huấn luyện (training samples) và được chọn ngẫu nhiên từ một kho các mẫu.
Bước 2: Kiểm tra và đánh giá, bước này sử dụng mô hình phân lớp đã được xây dựng ở bước 1 vào việc phân lớp
Để đánh giá độ chính xác của mô hình phân lớp, trước tiên cần sử dụng một bộ thử (test set) gồm các mẫu đã được phân lớp Những mẫu này được chọn ngẫu nhiên và độc lập với các mẫu đã được học ở bước trước, gọi là mẫu thử (test sample) Độ chính xác của mô hình được xác định dựa trên tỷ lệ thành công khi áp dụng bộ thử này.
Mô hình phân lớp sẽ so sánh lớp đúng của mỗi mẫu thử với lớp mà nó dự đoán, nhằm đánh giá độ chính xác của việc phân loại Việc này giúp xác định mức độ hiệu quả của mô hình trong việc phân loại các mẫu thử.
Chu trình thiết kế chung đƣợc khái quát:
Hình 1.1 Chu trình thiết kế
1.1.4 Các thuật toán cơ bản của nhận dạng mẫu
Các thuật toán phân lớp tiêu biểu như Nạve Bayes (Alberto Tellaeche et al., 2008), cây quyết định (John et al., 1996), mạng nơron (Liao et al., 1994) và máy vector hỗ trợ SVM (Neeraj Kumar et al., 2012) đều có khả năng phân loại một mẫu mới chưa biết dựa trên những mẫu tương tự đã được học.
B ÀI TOÁN NHẬN DẠNG GIỚI TÍNH DỰA TRÊN ẢNH KHUÔN MẶT
Phân tích và trích xuất thông tin từ ảnh mặt người đã được nghiên cứu từ đầu những năm 90, nhờ vào khả năng khai thác nhiều thông tin hữu ích như danh tính, giới tính, cảm xúc, cử chỉ tương tác, dân tộc và tình trạng sức khỏe Trong số đó, giới tính là thuộc tính quan trọng với nhiều ứng dụng thực tiễn, bao gồm tương tác người máy, quảng cáo có định hướng và thống kê dân số.
Một hệ thống nhận dạng giới tính (gender recognition) từ ảnh mặt người, còn đƣợc gọi là một hệ thống phân lớp giới tính (gender classification), về bản
Hệ thống nhận dạng giới tính là một bài toán phân lớp nhị phân gồm nhiều bước, mỗi bước có chức năng riêng và kết quả của bước này là dữ liệu đầu vào cho bước tiếp theo Đầu tiên, kỹ thuật phát hiện mặt người sẽ xác định vị trí khuôn mặt trong ảnh Sau đó, thuật toán căn chỉnh sẽ điều chỉnh các ảnh mặt về cùng một góc nhìn thẳng để cải thiện độ chính xác Tiếp theo, thuật toán chuẩn hóa ánh sáng được áp dụng để đảm bảo các ảnh có cùng điều kiện ánh sáng, vì sự thay đổi này ảnh hưởng đến kết quả nhận dạng Trong bước trích chọn đặc trưng, thuật toán sẽ trích xuất các đặc điểm phân biệt nhất của khuôn mặt, tạo ra một vector đặc trưng có số chiều lớn Cuối cùng, bộ phân lớp sẽ xác định giới tính của ảnh đầu vào ban đầu.
Hình 1.2 Sơ đồ tổng quan của một hệ thống nhận dạng giới tính
Hiện nay, hai phương pháp phổ biến nhất để phát hiện khuôn mặt trong ảnh là đặc trưng Haar và đặc trưng HOG Phương pháp sử dụng đặc trưng Haar có tốc độ nhanh hơn nhưng độ chính xác kém hơn so với đặc trưng HOG Cả hai phương pháp này đều đã được tích hợp trong thư viện mã nguồn mở OpenCV.
To standardize the lighting of facial images, techniques such as histogram equalization and retinal filters can be effectively applied.
Phương pháp trích chọn đặc điểm từ ảnh mặt là bước quan trọng nhất trong hệ thống nhận dạng giới tính, cho phép biểu diễn khuôn mặt thành các cấu trúc có thể so sánh Trong bài viết này, tôi áp dụng phương pháp PCA để trích chọn các đặc trưng và sử dụng SVM để nhận dạng giới tính hiệu quả.
Hệ thống nhận dạng giới tính hiện tại chủ yếu là bán tự động, dựa vào tọa độ mắt để căn chỉnh ảnh mặt Trong luận văn này, chúng tôi giới thiệu một hệ thống hoàn toàn tự động sử dụng phương pháp trích chọn đặc trưng PCA Bước phân lớp sẽ áp dụng kỹ thuật phân lớp nhị phân SVM trên các vector PCA để xác định giới tính của bức ảnh mặt cần nhận dạng.
Phương pháp phân loại máy vector hỗ trợ (SVM) là một kỹ thuật phân loại dựa trên các hàm nhân (kernel) nhằm tối thiểu hóa rủi ro ước lượng Được phát triển từ lý thuyết học thống kê bởi Vapnik và Chervonenkis vào năm 1974, SVM đã chứng minh tiềm năng lớn cả về lý thuyết lẫn ứng dụng thực tiễn Các thử nghiệm cho thấy SVM có khả năng phân loại hiệu quả trong nhiều lĩnh vực như phân loại văn bản, phân biệt giới tính, nhận dạng chữ viết tay, phát hiện khuôn mặt trong ảnh và ước lượng hồi quy So với các phương pháp phân loại khác, SVM cho thấy hiệu suất phân loại vượt trội hơn hẳn.
Trong nghiên cứu này, tôi đã chọn phương pháp phân lớp SVM để xây dựng mô hình phân loại giới tính dựa trên ảnh chụp khuôn mặt Đồng thời, tôi cũng thực hiện cài đặt thử nghiệm trên tập dữ liệu được tự thu thập.
1.2.2 Hướng tiếp cận xây dựng hệ thống
Xây dựng hệ thống theo sơ đồ sau:
Hình 1.3 Hệ thống nhận dạng
Tiền xử lý ảnh là bước quan trọng nhằm chuẩn hóa hình ảnh trước khi thực hiện tìm kiếm, giúp nâng cao hiệu quả của quá trình này Các công việc trong giai đoạn tiền xử lý bao gồm chuẩn hóa kích thước giữa ảnh trong cơ sở dữ liệu và ảnh cần tìm, điều chỉnh độ sáng và tối, lọc nhiễu, cũng như chuẩn hóa vị trí và tư thế của ảnh mặt.
Tách khuôn mặt là chức năng xác định vị trí và kích cỡ của một hoặc nhiều khuôn mặt trong ảnh, từ đó tách riêng phần mặt ra Phần ảnh khuôn mặt thường nhỏ hơn so với ảnh gốc và sẽ được sử dụng để tìm kiếm các khuôn mặt cần thiết Chức năng trích chọn đặc trưng sẽ áp dụng cho các ảnh đã được tách ra, bao gồm cả ảnh mẫu và việc vector hóa ảnh mẫu, cùng với phân tích thành phần chính.
Sai lệch vec tơ ảnh mẫu với vec tơ trung bình
Sai lệch vec tơ ảnh nhận dạng với vec tơ trung bình
Huấn luyện SVM Ảnh cần nhận dạng Vec tơ hóa ảnh Ánh xạ vào không gian đặc trƣng
1.2.3.2 Trích chọn đặc trƣng của khuôn mặt Để có thể thực hiện việc nhận dạng giới tính, ta cần dựa vào các đặc trƣng của rất nhiều bức ảnh mẫu đã được sưu tập Như vậy ta cần thực hiện trích chọn các đặc trƣng của ảnh khuôn mặt, để phục vụ cho thuật toán phân lớp a) Chiến lƣợc phát hiện khuôn mặt
Phương pháp tiếp cận dựa trên đặc trưng cơ bản tập trung vào những hiểu biết của con người về khuôn mặt, bao gồm các bộ phận như mắt, mũi, miệng và các yếu tố như hình dạng, đường nét, cấu tạo Trong phương pháp này, có hai chiến lược tiếp cận khác nhau để phân tích và nhận diện khuôn mặt.
Phương pháp từ dưới lên (Bottom-up) tập trung vào việc xác định các đặc trưng riêng biệt và sau đó nhóm chúng lại để kiểm tra Ưu điểm của phương pháp này là không bị ảnh hưởng bởi hướng xoay hay di chuyển của khuôn mặt Tuy nhiên, nó cũng có một số giới hạn cần lưu ý.
- Thứ nhất, các đặc trưng dễ bị ảnh hưởng bởi các yếu tố như độ sáng tối, hay nhiễu trong ảnh
Các bước thực hiện trong cách tiếp cận này tốn quá nhiều thời gian, do đó không đáp ứng được yêu cầu về thời gian thực.
Phương pháp từ trên xuống (Top-down) trong việc tạo mẫu khuôn mặt chuẩn có thể là 2 chiều hoặc 3 chiều, sau đó ghép mẫu vào bức ảnh Phương pháp này tập trung vào việc xây dựng một mô hình khuôn mặt chính xác và áp dụng nó để cải thiện chất lượng hình ảnh.
- Tìm kiếm trên toàn bộ ảnh để ghép mẫu với những thực thể trên ảnh đềtìm ra b) Các hướng tiếp cận
G IỚI THIỆU
Hiện nay, hai nhóm thuật toán phân lớp phổ biến nhất là Neural Network và Support Vector Machine, có nhiều điểm tương đồng Chúng được áp dụng từ bài toán phân lớp với hai lớp có thể phân tách tuyến tính, đến các lớp gần như phân tách tuyến tính, sau đó là bài toán với nhiều lớp và cuối cùng là các bài toán có biên không tuyến tính.
PLA Hard Margin SVM Hai classes là linearly separable
Logistic Regression Soft Margin SVM Hai classes là gần linearly separable
Soft max Regression Multi-class SVM Bài toán phân loại nhiều classes (biên là tuyến tính)
Perceptron Kernel SVM Bài toán với dữ liệu không linearly separable
Việc áp dụng SVM cho bài toán dữ liệu không phân biệt tuyến tính giữa hai lớp là một thách thức Ý tưởng cốt lõi của Kernel SVM và các phương pháp kernel là thực hiện một phép biến đổi để chuyển đổi dữ liệu không phân biệt tuyến tính sang một không gian mới Trong không gian này, dữ liệu trở nên phân biệt tuyến tính, giúp cải thiện khả năng phân loại.
Bằng cách thêm một chiều mới vào không gian hai chiều, chúng ta có thể biến dữ liệu không phân biệt tuyến tính thành phân biệt tuyến tính trong không gian ba chiều Ví dụ, việc này cho phép chúng ta dễ dàng phân loại các điểm dữ liệu mà trước đây không thể phân biệt được Sự chuyển đổi này giúp cải thiện khả năng phân tích và trực quan hóa dữ liệu, mở ra cơ hội mới trong việc áp dụng các thuật toán học máy.
Dữ liệu của hai lớp không phân biệt tuyến tính trong không gian hai chiều, nhưng khi thêm chiều thứ ba với hàm số z = x² + y², các điểm dữ liệu sẽ phân bố trên một parabol, trở nên phân biệt tuyến tính Mặt phẳng màu vàng đại diện cho mặt phân chia, có thể xác định thông qua Hard/Soft Margin SVM Giao điểm giữa mặt phẳng và parabol tạo thành một đường ellipse; khi chiếu dữ liệu và đường ellipse này xuống không gian hai chiều ban đầu, chúng ta có thể xác định đường phân chia hai lớp.
Hình 2.1: Ví dụ về Kernel SVM
Kernel SVM là phương pháp chuyển đổi dữ liệu x từ không gian feature ban đầu sang không gian mới thông qua hàm Φ(x) Trong ví dụ này, hàm Φ() bổ sung một chiều dữ liệu mới, tạo ra một feature mới dựa trên các features đã biết Mục tiêu là đảm bảo rằng trong không gian mới, dữ liệu giữa hai lớp (classes) có thể phân biệt tuyến tính hoặc gần như phân biệt tuyến tính Khi đạt được điều này, chúng ta có thể áp dụng các bộ phân lớp tuyến tính như PLA, Logistic Regression, hoặc Hard/Soft Margin SVM.
Hàm biến đổi Φ() có sự tương đồng với các activation functions trong Neural Networks, nhưng điểm khác biệt chính là nhiệm vụ của activation function là làm phá vỡ tính tuyến tính của mô hình.
Hàm biến đổi Φ() giúp chuyển đổi dữ liệu không phân biệt tuyến tính thành dữ liệu phân biệt tuyến tính Để đạt được mục tiêu chung, có hai phương pháp giải quyết khả thi.
Các hàm Φ() thường tạo ra dữ liệu mới với số chiều cao hơn so với dữ liệu ban đầu, thậm chí có thể lên đến vô hạn chiều Việc tính toán trực tiếp các hàm này có thể gây ra vấn đề về bộ nhớ và hiệu suất Một giải pháp hiệu quả là sử dụng các hàm kernel để mô tả mối quan hệ giữa hai điểm dữ liệu trong không gian mới, thay vì tính toán từng điểm một Kỹ thuật này được phát triển dựa trên quan sát về bài toán đối ngẫu trong SVM.
C Ơ SỞ TOÁN HỌC
Bài toán đối ngẫu trong Soft Margin SVM cho dữ liệu gần phân biệt tuyến tính:
N: số cặp điểm dữ liệu trong tập training
Xn: feature vector của dữ liệu thứ n trong tập training
Yn: nhãn của dữ liệu thứ n, bằng 1 hoặc -1
λn: nhân tử Lagrange ứng với điểm dữ liệu thứ n
Hằng số dương C đóng vai trò quan trọng trong việc cân bằng giữa độ lớn của margin và sự hy sinh của các điểm dữ liệu trong vùng không an toàn Khi giá trị C tiến gần đến vô cực hoặc rất lớn, Soft Margin SVM sẽ chuyển đổi thành Hard Margin SVM.
Sau khi giải đƣợc λ cho bài toán (1), nhãn của một điểm dữ liệu mới sẽ đƣợc xác định bởi dấu của biểu thức:
{ } là tập hợp những điểm nằm trên margin
{ } là tập hợp các điểm support
là số phần tử của M
Dữ liệu thực tế thường không phân biệt tuyến tính, làm cho nghiệm của bài toán (1) có thể không tạo ra một bộ phân lớp hiệu quả Tuy nhiên, nếu chúng ta tìm ra hàm số Φ() để biến đổi dữ liệu x thành Φ(x), thì trong không gian mới này, dữ liệu có thể trở nên gần phân biệt tuyến tính Điều này mở ra hy vọng rằng nghiệm của bài toán sẽ cải thiện khả năng phân loại.
Soft Margin SVM sẽ cho chúng ta một bộ phân lớp tốt hơn
Trong không gian mới, bài toán (1) trở thành: và nhãn của một điểm dữ liệu mới đƣợc xác định bởi dấu của biểu thức:
Việc tính toán trực tiếp Φ(x) cho từng điểm dữ liệu có thể tiêu tốn nhiều bộ nhớ và thời gian, do số chiều của Φ(x) thường rất lớn, thậm chí có thể đạt đến vô hạn.
Để xác định nhãn cho một điểm dữ liệu mới x, cần tìm biến đổi Φ(x) trong không gian mới và tính tích vô hướng với tất cả các Φ(Xm) trong tập hợp support Để đơn giản hóa quá trình này, chúng ta nhận thấy một điều thú vị.
Trong bài toán (3) và biểu thức (4), chúng ta không cần tính trực tiếp Φ(x) cho mọi điểm dữ liệu, mà chỉ cần tính Φ(x)TΦ(z) cho hai điểm dữ liệu x và z bất kỳ Kỹ thuật này được gọi là kernel trick, cho phép chúng ta thay vì tính tọa độ của một điểm trong không gian mới, chỉ cần tính tích vô hướng giữa hai điểm trong không gian mới, được gọi chung là phương pháp kernel.
Lúc này, bằng cách định nghĩa hàm kernel k(x,z)=Φ(x)TΦ(z), ta có thể viết lại bài toán (3) và biểu thức (4) nhƣ sau:
Ví dụ: Xét phép biến đổi 1 điểm dữ liệu trong không gian hai chiều x=[x1,x2] T thành một điểm trong không gian 5 chiều Φ(x)=[ √ √ √ ] Ta có: Φ(x) T Φ(z)[ √ √ √ ] [ √ √ √ ]
Trong ví dụ này, việc tính toán hàm kernel k() cho hai điểm dữ liệu dễ dàng hơn việc tính từng Φ() rồi nhân chúng với nhau
Vậy những hàm số kernel cần có những tính chất gì, và những hàm nhƣ thế nào đƣợc sử dụng trong thực tế nhƣ thế nào?
H ÀM SỐ KERNEL
2.3.1 Tính chất của các hàm kerrnel
Không phải hàm k() bất kỳ nào cũng đƣợc sử dụng Các hàm kernel cần có các tính chất:
- Đối xứng: k(x,z)=k(x,z) Điều này dễ nhận ra vì tích vô hướng của hai vector có tính đối xứng
- Về lý thuyết, hàm kernel cần thỏa mãn điều kiện Mercer:
Tính chất này để đảm bảo cho việc hàm mục tiêu của bài toán đối ngẫu (5) là lồi
Một số hàm số kernel k() không đáp ứng điều kiện Mercer nhưng vẫn mang lại kết quả tương đối Những hàm này vẫn được coi là kernel, vì vậy tôi sẽ tập trung vào các hàm kernel phổ biến và có sẵn trong các thư viện.
Nếu một hàm kernel thỏa mãn điều kiện (7), xét Cn = Ynλn, ta sẽ có:
Với K là một ma trận đối xứng mà phần tử ở hàng thứ n cột thứ m của nó đƣợc định nghĩa bởi: Knm=YnYmK(Xn,Xm)
Từ (8), ta kết luận rằng K là ma trận nửa xác định dương, điều này dẫn đến việc bài toán tối ưu (5) có ràng buộc lồi và hàm mục tiêu là một hàm lồi (hình thức bậc hai) Do đó, bài toán này có thể được giải quyết một cách hiệu quả.
2.3.2 Một số hàm kernel thông dụng
2.3.2.1 Linear Đây là trường hợp đơn giản với kernel chính tích vô hướng của hai vector: K(x,z)=xTz
Khi sử dụng hàm sklearn.svm.SVC, kernel này đƣợc chọn bằng cách đặt kernel = 'linear'
Đối với một số d dương, nó chỉ định bậc của đa thức, nhưng d không nhất thiết phải là số tự nhiên Mục tiêu chính của chúng ta không phải là xác định bậc của đa thức mà là cách tính kernel Kernel đa thức có khả năng mô tả hầu hết các đa thức có bậc không vượt quá d, nếu d được coi là số tự nhiên.
Khi sử dụng thƣ viện sklearn, kernel này đƣợc chọn bằng cách đặt kernel
Radial Basic Function (RBF) kernel hay Gaussian kernel đƣợc sử dụng nhiều nhất trong thực tế, và là lựa chọn mặc định trong sklearn Nó đƣợc định nghĩa bởi:
Sigmoid function cũng đƣợc sử dụng làm kernel: k(x,z)=tanh(γxTz+r) kernel = 'sigmoid'
2.3.2.5 Bảng tóm tắt các kernel thông dụng
Dưới đây là bảng tóm tắt các kernel thông dụng và cách sử dụng trong sklearn
Chúng ta có thể sử dụng các thƣ viện cho C/C++tại LIBSVM và
Ngoài các hàm kernel thông dụng nhƣ trên, chúng ta cũng có thể tự định nghĩa các kernel.
V Í DỤ
“Ứng dụng Support Vector Machine trong bài toán phân loại hoa”
Support Vector Machine (SVM) là một phương pháp hiệu quả trong phân lớp dữ liệu Bài viết này sẽ khám phá ứng dụng của SVM trong phân loại hoa, với mục tiêu xây dựng một mô hình cho phép xác định loài hoa dựa trên đầu vào là hình ảnh của bông hoa.
2.4.1 Cơ sở của bài toán phân loại hoa
Để phân biệt các loại hoa, chúng ta cần xem xét các đặc điểm nổi bật như màu sắc, hình dạng cánh hoa, kích thước và hương thơm của từng loại Việc nhận diện hoa dựa trên những yếu tố này sẽ giúp chúng ta dễ dàng phân loại và hiểu rõ hơn về các giống hoa khác nhau.
Con người tích lũy những đặc điểm riêng của các loài hoa qua quá trình lớn lên, như hoa loa kèn có hình dạng giống cái kèn, hoa huệ trắng có mùi thơm đặc trưng và hoa hồng đỏ có gai Điều này cho thấy chúng ta đã xây dựng một tập dữ liệu về các loài hoa để nhận diện chúng Tương tự, máy tính cũng cần một tập dữ liệu để học hỏi và dự đoán loại hoa mới Do đó, việc cung cấp một tập dữ liệu huấn luyện là rất quan trọng, và tập dữ liệu Iris là một ví dụ điển hình cho việc này.
2.4.2 Tập dữ liệu Iris Flowers
The dataset, commonly known as **Fisher's Iris**, was compiled by Ronald Fisher and includes 50 samples from three different species of the Iris family: Iris setosa, Iris virginica, and Iris versicolor.
Mỗi mẫu hoa được thu thập bốn thuộc tính, bao gồm chiều dài và chiều rộng của đài hoa và cánh hoa, được đo bằng centimet Để sử dụng tập dữ liệu này, chúng ta sẽ áp dụng thư viện datasets trong sklearn.
# import iris flowers dataset iris = datasets.load_iris()
Sau khi thu thập dữ liệu, chúng ta có thể ngay lập tức áp dụng thuật toán SVM để thực hiện phân loại Tuy nhiên, để có cái nhìn trực quan hơn về tập dữ liệu, việc sử dụng biểu đồ là cách hiệu quả nhất để hiển thị thông tin.
28 đồ với thƣ viện matplotlib Chúng ta cùng thử biểu diễn trên đồ thị xem tập dữ liệu mà chúng ta đƣa vào máy tính nó là cái gì
2.4.3 Biểu diễn tập dữ liệu bằng đồ thị 2D
Tập dữ liệu hoa là một tập hợp của 150 điểm dữ liệu tương ứng với 150 bông hoa Chúng ta sẽ lấy chúng ra từ datasets bằng hàm sau: defgetData():
# Get iris data from datasets iris = datasets.load_iris() return iris
Để biểu diễn tập hợp các điểm dữ liệu trong đồ thị hai chiều, chúng ta cần giảm bớt số thuộc tính Trong trường hợp này, hai thuộc tính được chọn là độ rộng và chiều cao của đài hoa Chúng ta có hàm xử lý để vẽ đồ thị 2D như sau: def get2DPlot(iris):
X = iris.data[:,:2]# Lấy hai thuộc tính đầu tiên
Y_min, Y_max = X[:,1].min()-.5, X[:,1].max()+.5 plt.figure(2, figsize=(8,6)) plt.clf()
# Biểu diễn tập dữ liệu huấn luyện bằng đồ plt.scatter(X[:,0], X[:,1], c=Y, cmap=plt.cm.Paired) plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.xlim(X_min, X_max)
29 plt.ylim(Y_min, Y_max) plt.xticks(()) plt.yticks(()) plt.show()
Trên đồ thị hai chiều, các điểm dữ liệu với hai thuộc tính được phân biệt bằng ba màu sắc khác nhau Để máy tính có thể nhận diện các điểm này giống như con người, chúng ta cần tìm hiểu thêm về các phương pháp phân loại và nhận diện màu sắc.
2.4.4 Phân lớp sử dụng SVM với các Kernel khác nhau
Tập dữ liệu Iris được sử dụng để phân loại hoa thành ba loại khác nhau Việc áp dụng SVM với các phương pháp khác nhau sẽ mang lại hiệu quả phân lớp khác nhau Trong nghiên cứu này, chúng ta chỉ tập trung vào hai thuộc tính đầu tiên của tập dữ liệu, tức là phân lớp trong không gian hai chiều Chúng ta sẽ sử dụng các Kernel khác nhau để thực hiện phân tích.
‐ SVC with polynomial (degree 3) kernel Đầu tiên chúng ta cần huấn luyện dữ liệu:
Để trực quan hóa dữ liệu, chúng ta sử dụng hai thuộc tính đầu tiên từ tập dữ liệu iris (X = iris.data[:,:2]) và nhãn mục tiêu (y = iris.target) Để điều chỉnh độ mỏng của lưới tọa độ trên đồ thị, ta sử dụng h = 0.02, với giá trị nhỏ hơn sẽ tạo ra hình ảnh sắc nét hơn.
# we create an instance of SVM and fit out data We do not scale our
# data since we want to plot the support vectors
In machine learning, the Support Vector Machine (SVM) is a powerful classification technique that utilizes a regularization parameter, denoted as C, to control the trade-off between achieving a low training error and a low testing error For instance, when setting C to 1.0, various SVM models can be instantiated, including a linear kernel SVC, a radial basis function (RBF) SVC with a gamma value of 0.7, and a polynomial kernel SVC with a degree of 3 Additionally, the LinearSVC model can also be employed with the same regularization parameter Each of these models is fitted to the dataset represented by X and y, allowing for effective classification across different kernel functions.
Tiếp theo là việc đẩy các mô hình thu đƣợc vào đồ thị
# title for the plots titles =['SVC with linear kernel',
'SVC with polynomial (degree 3) kernel'] for i, clf inenumerate((svc, lin_svc, rbf_svc, poly_svc)):
# Plot the decision boundary For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max] plt.subplot(2,2, i +1) plt.subplots_adjust(wspace=0.4, hspace=0.4)
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
# Put the result into a color plot
Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
To visualize the training points, use plt.scatter to plot the data with sepal length on the x-axis and sepal width on the y-axis, coloring the points according to their class labels with a coolwarm colormap Set the x-axis and y-axis labels to 'Sepal length' and 'Sepal width', respectively, and adjust the limits of both axes using xx.min(), xx.max(), yy.min(), and yy.max() Remove the tick marks from both axes and add a title from the titles list for clarity Finally, display the plot with plt.show().
Bây giờ sau khi vẽ các đồ thị trên là chúng ta có thể so sánh hiệu quả phân lớp của các Kernel khác nhau Kết quả nhƣ sau:
Bằng cách phân lớp, chúng ta có thể chia mặt phẳng tọa độ thành nhiều phần khác nhau Khi xuất hiện một điểm dữ liệu mới, chúng ta có thể dựa vào tọa độ của nó để xác định lớp mà nó thuộc về.
D Ữ LIỆU THỬ NGHIỆM
Sau khi hoàn thành giai đoạn trích chọn đặc trưng ảnh, bước tiếp theo là lựa chọn thuật toán huấn luyện và phân lớp dữ liệu ảnh Trong phần cài đặt thực nghiệm, thuật toán SVM được chọn để huấn luyện và nhận dạng dữ liệu (Cortes và Vapnik, 1995) Để phát triển ứng dụng phân biệt giới tính Nam/Nữ, chúng tôi sử dụng thư viện mã nguồn mở LibSVM (Chang và Lin, 2011) Với thư viện LibSVM, quá trình huấn luyện dữ liệu được thực hiện bằng lệnh svmtrain model = svmtrain(training_label_vector, training_instance_matrix, 'libsvm_options').
Trong đó libsvm_options có các lựa chọn:
- s svm_type: thiết lập kiểu của SVM (mặc định là 0–C-SVC (multi-class classification);
- t kernel_type: thiết lập kiểu cho hàm (mặc định là 2-RBF)
- c cost: thiết lập tham số C của C-SVC, epsilon-SVR, và nu-SVR (mặc định là 1);
- g gamma: thiết lập giá trị gama cho hàm nhân (mặc định là 1/số thuộc tính)
Và để thực hiện phân lớp dữ liệu sử dụng lệnh svmpredict
[predicted_label, accuracy, decision_values/prob_estimates] svmpredict(testing_label_vector, testing_instance_matrix, model,
- model là cấu trúc mô hình của svmtrain libsvm_options với:
- bước_lượng_xác_suất: dự đoán ước tính xác suất ra 0 hoặc 1 (mặc định là 0);
- q: cách thức tĩnh (không đầu ra); - predicted_label: vector dự đoán đầu ra;
- accuracy: vector với độ chính xác, tổng bình phương lỗi, hệ số tương quan bình phương;
- prob_estimates: nếu đƣợc chọn thì có vector ƣớc lƣợng xác suất.
T HỬ NGHIỆM VỚI THUẬT TOÁN K ERNEL S UPPORT V ECTOR M ACHINE
Bộ cơ sở dữ liệu này chứa hơn 4000 ảnh màu của 126 người (70 nam, 56 nữ), với 26 bức ảnh cho mỗi người được chụp dưới các điều kiện ánh sáng và biểu cảm khác nhau, cùng với việc che mắt hoặc miệng Các bức ảnh được ghi lại cách nhau 2 tuần Để đơn giản hóa, tôi sử dụng bộ cơ sở dữ liệu AR Face thu gọn, bao gồm 2600 bức ảnh từ 50 nam và 50 nữ Các khuôn mặt trong ảnh đã được xác định chính xác và cropped với kích thước 165 x 120 pixel, theo phương pháp được mô tả trong bài báo PCA veus LDA Tôi sẽ sử dụng những ảnh đã cropped này làm ví dụ trong phần dưới đây.
Mỗi bức ảnh trong AR Face được đặt tên theo định dạng G-xxx-yy.bmp, trong đó G có thể là M (nam) hoặc W (nữ), xxx là ID của người từ 001 đến 050, và yy đại diện cho điều kiện chụp ảnh.
Trong nghiên cứu này, tôi xem xét 35 điều kiện từ 01 đến 26, trong đó các điều kiện từ 01 đến 07 và từ 14 đến 20 đại diện cho các khuôn mặt không bị che bởi kính hoặc khăn, được gọi là view Để minh họa cho thuật toán kernel SVM, tôi sử dụng 25 nam và 25 nữ đầu tiên làm tập huấn luyện, trong khi 25 nam và 25 nữ còn lại được sử dụng làm tập kiểm tra Chỉ những khuôn mặt không bị che bởi kính và khăn của mỗi người được chọn để phân tích.
Việc trích xuất đặc trưng (Feature Extraction) từ mỗi bức ảnh có kích thước 3x165x120 (3 kênh, chiều cao 165, chiều rộng 120) là một quá trình quan trọng, do kích thước lớn của ảnh Để thực hiện điều này, chúng ta sẽ tiến hành qua hai bước đơn giản.
Chuyển ảnh màu về ảnh xám theo công thức Y' = 0.299 R + 0.587 G + 0.114 B (Xem thêm tại Grayscale - wiki)
Ảnh xám được kéo dài thành một vector có kích thước 165x120, sau đó áp dụng ma trận chiếu ngẫu nhiên để giảm số chiều xuống còn 500 Bạn có thể điều chỉnh giá trị này thành các số nhỏ hơn 1000.
To utilize the SVC class from the sklearn.svm library, begin by importing necessary modules such as numpy for numerical operations, linear_model for logistic regression, accuracy_score for model evaluation, and misc from scipy for image loading Additionally, set a fixed random seed using np.random.seed(1) to ensure reproducibility of results.
The dataset is divided into training and testing sets, with training IDs ranging from 1 to 25 and testing IDs from 26 to 49 The views are selected from the specified path ' /data/AR/', incorporating view IDs that include values from 1 to 7 and 14 to 20.
Xây dựng danh sách các tên files def build_list_fn(pre, img_ids, view_ids):
INPUT: pre = 'M-' or 'W-' img_ids: indexes of images view_ids: indexes of views
To generate a list of file names, iterate through the image IDs and view IDs, constructing each file name using a specified path and prefix Each file name is formatted to include zero-padded image and view identifiers, followed by a '.bmp' extension The complete list of file names is then returned.
Feature Extraction: Xây dựng dữ liệu cho training set và test set def rgb2gray(rgb):
# feature extraction def vectorize_img(filename):
# load image rgb = misc.imread(filename)
# convert to gray scale gray = rgb2gray(rgb)
# vectorization each row is a data point im_vec = gray.reshape(1, D) return im_vec def build_data_matrix(img_ids, view_ids): total_imgs = img_ids.shape[0]*view_ids.shape[0]*2
The code initializes an array `X_full` with zeros, sized by the total number of images and a specified dimension `D` It creates a label array `y` that contains half zeros and half ones, representing two classes The function `build_list_fn` is called twice to generate two lists of filenames, one for male images prefixed with 'M-' and another for female images prefixed with 'W-', using provided `img_ids` and `view_ids` Finally, it combines both lists into a single list `list_fn` for further processing.
X_full[i, :] = vectorize_img(list_fn[i])
X = np.dot(X_full, ProjectionMatrix) return (X, y)
(X_train_full, y_train) = build_data_matrix(train_ids, view_ids) x_mean = X_train_full.mean(axis = 0) x_var = X_train_full.var(axis = 0) def feature_extraction(X): return (X - x_mean)/x_var
X_train = feature_extraction(X_train_full)
X_train_full = None ## free this variable
(X_test_full, y_test) = build_data_matrix(test_ids, view_ids)
X_test = feature_extraction(X_test_full)
In the provided code, the Standardization method is utilized for data normalization, where x_mean and x_var represent the mean vector and variance of the entire training dataset The matrices X_train_full and X_test_full contain dimensionality-reduced data that has not yet been normalized The feature_extraction function standardizes the data using x_mean and x_var from X_train_full The subsequent code implements the Kernel SVM algorithm to predict the output for the test data and evaluate the results.
N = 700 y_train = A['label_train'].reshape(N) y_test = A['label_test'].reshape(N) clf = SVC(kernel='poly', degree = 3, gamma=1, C = 100) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print("Accuracy: %.2f %%" %(100*accuracy_score(y_test, y_pred)))
Độ chính xác của mô hình đạt 92.86% Để xác định nhãn cho một bức ảnh, đầu ra của hàm sigmoid được so sánh với ngưỡng 0.5; nếu giá trị lớn hơn 0.5, bức ảnh được phân loại là nam, ngược lại là nữ Để xem xác suất của bức ảnh là nam, chúng ta sử dụng hàm predict_proba với định nghĩa như sau: def feature_extraction_fn(fn):.
# vectorize im = vectorize_img(fn)
# project im1 = np.dot(im, ProjectionMatrix)
In the process of standardization, the feature extraction function is applied to various image files, including 'M-036-18.bmp', 'W-045-01.bmp', 'M-048-01.bmp', and 'W-027-02.bmp' The extracted features from each image, represented as x1, x2, and x3, are then utilized to predict probabilities using a logistic regression model The predicted probabilities for the first two images, fn1 and fn2, are printed for analysis.
40 p3 = logreg.predict_proba(x3) print(p3) x4 = feature_extraction_fn(fn4) p4 = logreg.predict_proba(x4) print(p4)
Kết quả thu được thể hiện xác suất bức ảnh thuộc về nam (cột thứ nhất) và nữ (cột thứ hai) Dưới đây là hình minh họa cho các xác suất này.
Hình 3.1 Kết quả tìm đƣợc