Đề tài Dò tìm và cắt ảnh mặt người dùng PCA

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 sử dụng để 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 nhận đượ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 khuôn mặt người từ ảnh số. Các hệ thống nhận dạng offline đã ra đời và có độ tin cậy cao, tuy nhiên các hệ thống nhận dạng online lại chưa đáp ứng được nhiều. Bài toán nhận dạng khuôn mặt người là một bài toán hấp dẫn, không giới hạn giải pháp sử dụng, vận dụng linh hoạt kiến thức trong nhiều lĩnh vực, đã thách thức nhiều người nghiên cứu vì tính ứng dụng to lớn trong thực tế. Đây là một chủ đề có thể nói còn tương đối mới với những ứng dụng mang tính công nghệ cao như: robot, các thiết bị camera,các hệ thống bảo mật, nhận dạng, đã và đang được các hãng, công ty áp dụng vào nhằm nâng cao các tính năng sản phẩm của mình trong quá trình cạnh tranh trên thị trường hiện nay Với mong muốn tiếp cận các công nghệ mới, đồng thời bổ sung kiến thức về khoa học kỹ thuật hiện đại, cũng như tổng kết lại những kỹ năng, kiến thức trong suốt quá trình học tập tại trường, chúng em xin chọn đề tài “ Dò tìm và cắt ảnh mặt người dùng PCA”. Đây có thể là một bài toán nhỏ, nhưng nó cũng giúp chúng em có một cái nhìn khái quát về bài toán, tạo cơ sở tiền đề cho sự tìm tòi và phát triển các hướng cao hơn trong sự nghiên cứu các công nghệ mới . Bài luận này được trình bày bao gồm có 5 chương: ã Chương 1: Giới thiệu Matlab và khái quát về ảnh. ã Chương 2: Các phương pháp xác định khuôn mặt. ã Chương 3: Phân tích thành phần chính PCA. ã Chương 4: Chương trình mô phỏng. ã Chương 5: Kết luận. Nội dung của đề tài: - Tìm hiểu phương pháp nhận diện ảnh. - Nghiên cứu PCA. - Dò tìm ảnh mặt người có không gian (1=>4). - Cắt ảnh mặt và lưu vào 1 file. - Xử lý ảnh động qua webcam. Trong bài luận này chúng em xin đề cập tới vấn đề dò tìm và nhận dạng mặt người qua một ảnh tĩnh cho trước, đồng thời mở rộng hơn là xử lý ảnh thu được qua một thiết bị thu ảnh, ví dụ như: camera, webcam, MỤC LỤC Trang Chương 1: GIỚI THIỆU MATLAB VÀ KHÁI QUÁT VỀ ẢNH 1 1.1 Giới thiệu chung về phần mềm Matlab . .2 1.1.1 Khái niệm về Matlab . .2 1.1.2 Tổng quan về cấu trúc dữ liệu Matlab, các ứng dụng . 2 1.1.2.1 Dữ liệu . .3 1.1.2.2 Ứng dụng . 3 1.1.2.3 Toolbox là một công cụ quan trọng trong Matlab . 3 1.1.3 Hệ thống Matlab . 3 1.1.4 Làm quen với Matlab . .4 1.1.5 Các cửa sổ làm việc của Matlab . 5 1.2 Giới thiệu khái quát về ảnh số . .7 1.2.1 Các khái niệm cơ bản về ảnh . .7 1.2.2 Các cách phân loại ảnh . .8 1.3 Xử lý ảnh với Matlab . 9 1.3.1 Xử lý ảnh . .9 1.3.2 Các giai đoạn xử lý ảnh . .10 1.3.3 Xử lý ảnh với Matlab . 11 1.3.3.1 Các kiểu ảnh trong Matlab . .11 1.3.3.2 Các hàm xử lý ảnh cơ bản trong Matlab . .13 1.3.3.3 Biến đổi không gian ảnh . .20 Chương 2: CÁC PHƯƠNG PHÁP XÁC ĐỊNH KHUÔN MẶT .36 2.1 Định nghĩa bài toán xác định khuôn mặt người . .37 2.2 Ứng dụng của phương pháp xác định khuôn mặt . .37 2.3 Phương pháp xác định khuôn mặt . .39 2.3.1 Hướng tiếp cận dựa trên tri thức . .40 2.3.2 Hướng tiếp cận dựa trên đặc trưng không thay đổi . .41 2.3.2.1 Các đặc trưng khuôn mặt . 42 2.3.2.2 Kết cấu . .45 2.3.2.3 Sắc màu của da . .45 2.3.2.4 Đa đặc trưng . .45 2.3.3 Hướng tiếp cận dựa trên so khớp mẫu . .45 2.3.4 Hướng tiếp cận dựa trên diện mạo . 46 2.4 Khó khăn và thử thách trong bài toán xác định khuôn mặt người . 47 Chương 3: PHÂN TÍCH THÀNH PHẦN CHÍNH PCA (PRINCIPAL COMPONENT ANALYSIS) .48 3.1 Sơ lược về phân tích thành phần chính PCA . .49 3.2 Thuật toán PCA và ứng dụng trong nhận dạng khuôn mặt người . 50 3.2.1 Thuật toán . .50 3.2.2 Phân tích thành phần chính PCA . .50 3.2.3 Hình ảnh minh họa . 53 3.3 Ứng dụng Eigenfaces trong việc nhận dạng mặt người . .56 3.3.1 Tính toán Eigenfaces . 59 3.3.2 Dùng Eigenfaces để phân loại ảnh mặt người . .61 3.3.3 Ứng dụng Eigenfaces để phát hiện gương mặt . 62 3.3.3.1 Xem xét lại không gian mặt . .63 3.3.3.2 Nhận dạng theo thời gian thực . .64 3.4 Nhận xét . .65 3.4.1 Ưu điểm của phương pháp PCA . .65 3.4.2 Nhược điểm của PCA . .65 Chương 4: CHƯƠNG TRÌNH MÔ PHỎNG .67 4.1 Chương trình mô phỏng . .68 4.1.1 Cơ sở dữ liệu ảnh . 68 41.1.1 Tập ảnh huấn luyện . 68 4.1.1.2 Tập ảnh mẫu . .69 4.1.2 Các bước thực hiện chương trình . .70 4.1.3 Lưu đồ giải thuật . .72 4.1.3.1 Lưu đồ giải thuật chính . 72 4.1.3.2 Lưu đồ giải thuật chi tiết . .72 4.1.4 Kết quả mô phỏng . .77 4.1.5 Tốc độ thực hiện . .80 4.2 Nhận xét kết quả đạt được . .81 Chương 5: KẾT LUẬN . 85 5.1 Kết luận . .85 5.2 Hướng phát triển đề tài . 85 PHỤ LỤC . TÀI LIỆU THAM KHẢO .

pdf115 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2997 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Dò tìm và cắt ảnh mặt người dùng PCA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trê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ả tốt nhất cho bài toán nhận dạng. Đây là nhược điểm cơ bản của PCA. • PCA rất nhạy với nhiễu. Có rất nhiều thuật toán nhận dạng mặt người dựa trên những chi tiết của khuôn mặt như đôi mắt, lông mày, cấu trúc của khuôn mặt, hay màu da… Khác hoàn toàn với những thuật toán trên, PCA nhận dạng dựa trên những nét tổng thể của khuôn mặt. Còn hơn một thuật toán, PCA đã cung cấp một cơ sở rất rõ ràng cho việc mô tả đặc trưng của khuôn mặt, để từ đó có thể phát triển những thuật toán nhận dạng khác. Vì vậy có thể PCA không là thuật toán tốt nhất, nhưng là thuật toán phổ biến nhất được áp dụng trong bài toán nhận diện mặt người. Chương 4: Chương trình mô phỏng 67 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Chương 4 CHƯƠNG TRÌNH MÔ PHỎNG 4.1 Chương trình mô phỏng 4.2 Nhận xét kết quả đạt được Chương 4: Chương trình mô phỏng 68 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Chương 4 CHƯƠNG TRÌNH MÔ PHỎNG 4.1 Chương trình mô phỏng 4.1.1 Cơ sở dữ liệu ảnh Cơ sở dữ liệu ảnh bao gồm có 3 tập ảnh: ảnh face, ảnh nface, ảnh mẫu. Trong đó 2 tập là ảnh face và ảnh nface được dùng trong chương trình dò tìm và cắt ảnh mặt người, còn chương trình nhận dạng mặt người dùng 2 tập ảnh là ảnh face và ảnh mẫu. 4.1.1.1 Tập ảnh huấn luyện a) Ảnh face Tập ảnh face bao gồm những tập ảnh khuôn mặt người, dùng trong thuật toán PCA, để xác định các thành phần đặc trưng của khuôn mặt người, dùng để dò tìm, xác định khuôn mặt người và nhận dạng mặt người. Hình 4.1 Tập ảnh Face Chương 4: Chương trình mô phỏng 69 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm b) Ảnh nface Tập ảnh nface bao gồm những tập ảnh không phải là khuôn mặt người, dùng trong thuật toán PCA, để xác định các thành phần đặc trưng không phải là của khuôn mặt người, đó là không gian ảnh môi trường bên ngoài: cây cối, không gian ngoại cảnh, … giúp cho việc dò tìm khuôn mặt người chính xác hơn, bằng cách loại bỏ các điểm đánh dấu không phải khuôn mặt người, từ đó chúng ta sẽ đễ dàng dò tìm khuôn mặt người trong một bức ảnh cần xác định. Hình 4.2 Tập ảnh nface 4.1.1.2 Tập ảnh mẫu Tập ảnh mẫu bao gồm các ảnh đưa vào tập ảnh cơ sở dữ liệu, khi ta dò tìm và cắt ảnh khuôn mặt, từ đó sẽ xác định các thành phần đặc trưng, dò tìm trong ảnh cơ sở dữ liệu, xác định tọa độ khoảng cách sai lệch giữa các thông số điểm ảnh, tìm ra những ảnh tương đồng, gần với ảnh được xác định, từ đó truy xuất ra thông tin dữ liệu của ảnh cần nhận dạng. Chương 4: Chương trình mô phỏng 70 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Hình 4.3 Tập ảnh mẫu 4.1.2 Các bước thực hiện chương trình Khi chạy chương trình “Dò tìm và cắt ảnh mặt người dùng PCA” ta thao tác theo trình tự các bước sau: Bước 1: Đưa ảnh vào để xử lý Ở bước này chúng ta có hai cách để chọn ảnh nguồn để xử lý là từ một nguồn có sẵn và từ một nguồn đưa ảnh trực tiếp ở ngoài vào thông qua webcam. - Cách thứ nhất: Đưa ảnh vào từ một nguồn có sẵn. Ta chọn nút chọn ảnh để tìm nguồn ảnh gốc đưa ảnh vào xử lý cụ thể là tập ảnh trong thư mục ảnh test. Sau khi chọn ảnh cần kiểm tra ta chọn nút open để chọn ảnh đã chọn. - Cách thứ hai: Đưa ảnh trực tiếp thu từ ngoài vào nhờ thiết bị thu hình đó là webcam. Ta nhấn nút camera để mở chương trình chạy webcam, sau khi đã điều chỉnh khoảng cách và kích thước ảnh đầu vào hợp lý ta nhấn vào nút chụp ảnh để đưa ảnh chụp vào xử lý các công đoạn tiếp theo. Bước 2: Dò tìm ảnh mặt người. Để thực hiện bước này ta cần điều kiện là phải có ảnh kiểm tra mới chạy được chương trình dò tìm ảnh mặt người. Khi đã có đủ điều kiện ta nhấn nút nhận dạng thì chương trình sẽ bắt đầu thực hiện: lấy ảnh chọn làm ảnh ban đầu đưa vào chương trình Chương 4: Chương trình mô phỏng 71 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm nhận dạng ảnh tìm và xác định vị trí của những khuôn mặt có trong tấm ảnh. Đây là đoạn chương trình chính của bài toán, đoạn chương trình sử dụng thuật toán PCA và là giai đoạn chiếm thời gian nhiều nhất của bài toán “Dò tìm và cắt ảnh mặt người dùng PCA”. Bước 3: Cắt ảnh mặt người. Là quá trình tách những khuôn mặt có trong tấm ảnh đầu vào chia thành những tấm ảnh nhỏ riêng lẻ để giúp ta có thể lưu lại từng khuôn mặt một cách dể dàng hay để dùng những tấm ảnh đó vào những công việc khác một cách nhanh chóng và chính xác hơn. Bước 4: Lưu ảnh khuôn mặt. Sau tất cả các quá trình thực hiện phương pháp tìm và tách ảnh mặt người thì cuối cùng kết quả cũng đạt được dù không chuẩn xác nhưng mục đích cuối cùng là ta phải lưu trữ lại những gì mà ta đã làm được, khi ta nhấn vào nút save thì sẽ hiện lên thư mục để lưu ảnh và thực hiện thao tác lưu ảnh. Bước 5: Nhận dạng khuôn mặt. Quá trình nhận dạng khuôn mặt cũng được thực hiện dựa vào thuật toán PCA, sau khi cắt ảnh mặt người, từ ảnh đó ta đặt làm ảnh test, ảnh test này sẽ được xử lý bằng cách xác định khoảng cách của ảnh test đến ảnh cơ sở dữ liệu. Nếu ảnh test có nằm trong cơ sở dữ liệu ảnh, thì ảnh test sẽ được nhận dạng bằng một bức ảnh khác nằm trong cơ sở dữ liệu ảnh, còn nếu ảnh test không nằm trong cơ sở dữ liệu ảnh, thì sẽ không nhận dạng được. Chương 4: Chương trình mô phỏng 72 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm 4.1.3 Lưu đồ giải thuật 4.1.3.1 Lưu đồ giải thuật chính Hình 4.4 Lưu đồ giải thuật chính 4.1.3.2 Lưu đồ giải thuật chi tiết a) Lưu đồ giải thuật chọn ảnh Chọn ảnh có hai cách: • Cách 1: Chọn ảnh tĩnh (ảnh có sẵn). • Cách 2: Chọn ảnh động (nhận ảnh từ webcam). Chọn ảnh Chương trình dò tìm và cắt ảnh mặt người Chương trình nhận dạng ảnh mặt người Bắt đầu Kết thúc Chương 4: Chương trình mô phỏng 73 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Hình 4.5 Lưu đồ giải thuật chọn ảnh Chọn ảnh động Bắt đầu Chạy chương trình mở webcam Chọn và chụp ảnh Chọn thư mục chứa ảnh cần kiểm tra Chọn ảnh Hiển thị ảnh đã chọn Kết thúc Chọn ảnh tĩnh Chương 4: Chương trình mô phỏng 74 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm b) Lưu đồ giải thuật chương trình dò tìm ảnh mặt người Hình 4.6 Lưu đồ giải thuật chương trình dò tìm ảnh mặt người S Bắt đầu Kết thúc Đánh dấu Tập ảnh huấn luyện Face và Nface Ảnh dò tìm Dò tìm ảnh mặt người bằng PCA Mặt người Đóng khung Tách mặt Lưu Đ Không đánh dấu Không đóng khung Chương 4: Chương trình mô phỏng 75 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm c) Lưu đồ giải thuật chương trình nhận dạng Hình 4.7 Lưu đồ giải thuật chương trình nhận dạng Thuật toán nhận dạng PCA Ảnh mẫu để so sánh nhận dạng Ảnh có trong tập dữ liệu Truy xuất thông tin ảnh nhận dạng Hiển thị thông tin và ảnh nhận dạng Chọn ảnh nhận dạng Dò tìm thông tin từ file Excel “hoso1.xls” Có Không có Bắt đầu Kết thúc Chương 4: Chương trình mô phỏng 76 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm d) Lưu đồ thuật toán PCA Hình 4.8 Lưu đồ giải thuật PCA Thuật toán PCA Tạo cơ sở dữ liệu Chuyển ảnh thành vector Tạo ma trận ảnh Tính giá trị ảnh trung bình Tính các giá trị Eigenface Xác định Eigenface của ảnh chọn ban đầu Bắt đầu Kết thúc Chương 4: Chương trình mô phỏng 77 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm 4.1.4 Kết quả mô phỏng a) Giao diện của chương trình Hình 4.9 Giao diện chính Hình 4.10 Giao diện chương trình 1 (ảnh tĩnh) Chương 4: Chương trình mô phỏng 78 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Hình 4.11 Giao diện chương trình 2 (ảnh động) b) Giao diện của kết quả dò tìm và nhận dạng Ảnh 1 khuôn mặt: Hình 4.12 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 1 khuôn mặt Chương 4: Chương trình mô phỏng 79 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Hình 4.13 Giao diện kết quả chương trình 2 (ảnh động)với 1 khuôn mặt Ảnh 2 khuôn mặt: Hình 4.14 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 2 khuôn mặt Ảnh 4 khuôn mặt: Chương 4: Chương trình mô phỏng 80 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Hình 4.15 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 4 khuôn mặt nữ Hình 4.16 Giao diện kết quả chương trình 1 (ảnh tĩnh) với 4 khuôn mặt nam 4.1.5 Tốc độ thực hiện Tốc độ thực hiện chương trình thể hiện thời gian mà chương trình tính toán trong quá trình xử lý, tùy theo giá trị kích thước ảnh đưa vào lớn hay nhỏ mà tốc độ Chương 4: Chương trình mô phỏng 81 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm thực hiện nhanh hay chậm. Nếu ảnh đầu vào có kích thước nhỏ, quá trình xử lý của chương trình sẽ thực hiện nhanh chóng, nếu ảnh đầu vào có kích thước lớn, quá trình xử lý của chương trình sẽ thực hiện chậm, mặc khác tốc độ thực hiện cũng tùy thuộc vào tốc độ xử lý của máy tính, vì vậy, yêu cầu cần có một cấu hình thích hợp để thực hiện chương trình một cách nhanh chóng, tạo điều kiện thuận lợi cho việc dò tìm và nhận dạng khuôn mặt. Tốc độ thực hiện là quá trình đo đạc thời gian xử lý chương trình, đó là chương trình dò tìm ảnh mặt người và chương trình nhận dạng ảnh mặt người. 4.2 Nhận xét kết quả đạt được Qua quá trình tìm hiểu và nghiên cứu, chúng em đã xây dựng được một cái nhìn khái quát về bài toán nhận dạng, đặc biệt là nhận dạng mặt người. Đồng thời, nắm bắt được một số vấn đề về xử lý ảnh: các dạng ảnh, tính chất ảnh, không gian, tọa độ ảnh, ma trận ảnh,… và vận dụng nó kết hợp với các công cụ xử lý ảnh trong Matlab (Image Processing Toolbox). Từ kết quả thu được, ta nhận thấy: ta có thể dò tìm được 1 khuôn mặt, 2 khuôn mặt, 3 khuôn mặt và tối đa là 4 khuôn mặt trong 1 bức ảnh, nguyên nhân do sự hạn chế về kích thước của khuôn mặt và bức ảnh, và những khuôn mặt này có thể có hoặc không có trong tập ảnh huấn luyện, đây chính là ưu điểm của bài toán. Tuy chưa có sự chuẩn xác trong quá trình dò tìm và nhận dạng mặt người, nhưng bài toán phần nào đã được giải quyết. Trong quá trình thao tác, có thể có những ưu và khuyết điểm, nhưng bài luận văn này của chúng em cũng đã hoàn thành tương đối có thể chấp nhận được, sau đây là một số ưu điểm và khuyết điểm của bài toán cũng như trong quá trình thực hiện luận văn. ¾ Ưu điểm - Ta có thể nhận dạng được một bức ảnh với 1 khuôn mặt, 2 khuôn mặt, 3 khuôn mặt và 4 khuôn mặt. - Khuôn mặt người được dò tìm và cắt ra rất rõ nét, có thể nhận dạng được. Chương 4: Chương trình mô phỏng 82 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm - Đối với thuật toán PCA, đây là một thuật toán được sử dụng trong rất nhiều lĩnh vực, đối với lĩnh vực chuyên ngành điện tử, thuật toán được vận dụng trong Matlab với nhiều công cụ xử lý, tạo điều kiện thuận lợi cho việc thực hiện đề tài. ¾ Khuyết điểm - Nội dung của bài toán là dò tìm và nhận dạng mặt người, nên sử dụng rất nhiều khuôn mặt của nhiều đối tượng với các trạng thái khác nhau, nên khuyết điểm của bài toán này là cần một số lượng lớn nguồn tài nguyên của khuôn mặt của nhiều đối tượng, từ đó mới có thể tạo ra được một khối lượng cơ sở dữ liệu phong phú. Cho nên có những trường hợp chúng ta sẽ không dò tìm được một vài khuôn mặt trong bức ảnh, vì không tìm được những nét đặc trưng cơ bản của khuôn mặt. - Chương trình được thực hiện nhờ vào hoạt động của máy tính, nên cần có một cấu hình cần thiết để xử lý và tính toán, từ đó mới có thể áp dụng trong công nghệ hiện đại, điều này ảnh hưởng đến tốc độ thực hiện của chương trình. Ví dụ như nhận dạng khuôn mặt người qua một thiết bị quan sát, nếu tốc độ xử lý nhanh ta có thể có một kết quả mỹ mãn và hài lòng hơn. - Về nội dung của bài toán, việc chọn lọc đưa ảnh vào để xử lý, thì có hai cách: sử dụng một ảnh tĩnh có sẵn và sử dụng nguồn dữ liệu đưa vào từ webcam. Đối với webcam, hay một thiết bị thu hình nào, thì điều đầu tiên là cần phải có độ phân giải tốt để ảnh đưa vào rõ nét, như vậy khả năng xử lý sẽ cao hơn và chính xác hơn. - Đồng thời khó khăn về cách xác định khoảng cách và tọa độ khuôn mặt người trong quá trình đưa ảnh vào xử lý, cụ thể là kích thước ảnh mặt người so với kích thước của ảnh huấn luyện (quá lớn hoặc quá bé). Vì phương pháp nhận dạng PCA là phương pháp dò quét ảnh nhận dạng theo khối cho nên vấn đề khoảng cách và kích thước của khuôn mặt ảnh đưa vào so với kích thước của tập ảnh huấn luyện (tập ảnh face) là rất quan trọng. Cho nên thuật toán thường gặp khó khăn nhiều về vấn đề này. - Khó khăn trong việc xử lý dò tìm và nhận dạng, điều kiện ảnh đưa vào xử lý phải phù hợp: độ sáng, góc lệch, cảm xúc, biến dạng,… Chính vì điều này, đôi khi có những khuôn mặt mà không đủ điều kiện về ánh sáng (ảnh bị tối) hoặc khuôn mặt bị sai khác quá nhiều so với ảnh dữ liệu (méo dạng, khuôn mặt nhăn nhó, nhiều cảm xúc,…) Chương 4: Chương trình mô phỏng 83 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm Như vậy, dựa vào xác suất thống kê trong quá trình làm việc, có một vài trường ảnh không nhận dạng được, với nhiều lí do khách quan. Một số trường hợp bị lỗi, không dò tìm được khuôn mặt, do nhiều nguyên nhân khác nhau: - Ảnh có nhiều điểm đặc trưng khác: râu quai nón… Hình 4.17 Ảnh lỗi do quá nhiều chi tiết không phân biệt được Chương 4: Chương trình mô phỏng 84 GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm - Ảnh không phải là ảnh ảnh thật: tranh vẽ…, làm cho độ sắc nét của ảnh không cao. Hình 4.18 Lỗi do ảnh không được sắc nét Chương 5: Kết luận GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm 85 Chương 5 KẾT LUẬN 5.1 Kết luận Trong quá trình thực hiện đồ án tốt nghiệp gặp rất nhiều khó khăn và thử thách, đòi hỏi sự cố gắng và tập trung cao độ trong quá trình thực hiện, nhưng chúng em cũng đã cố gắng hoàn thành đúng tiến độ làm việc theo yêu cầu đề ra, tuy nhiên bài luận này cũng chỉ đạt được một số kết quả tương đối, và còn nhiều sai sót trong vấn đề dò tìm cũng như nhận dạng mặt người. Kết quả đạt được của chúng em là đã dò tìm và nhận dạng được một số ảnh đã có trong cơ sở dữ liệu và một số ảnh nằm ngoài cơ sở dữ liệu, đó là những bức ảnh có độ sắc nét và tương phản cao, còn những ảnh không có độ sắc nét cao thì vẫn chưa xử lý được, đó chính là khuyết điểm của đề tài cũng như thuật toán PCA. Đối với ảnh động, việc xử lý ảnh đưa vào đã gây ra rất nhiều khó khăn, nó không chỉ đòi hỏi sự sắc nét của bức ảnh, mà còn yêu cầu về khoảng cách… 5.2 Hướng phát triển đề tài - Nhận diện mặt người qua tập dữ liệu có sẵn từ camera. - Nhận diện danh tính của người phạm tội qua ảnh chụp. - Có thể kết hợp với nhiều thuật toán khác như: ICA, Neural,… để xử lý một cách chính xác hơn. - Dò tìm và nhận dạng đối tượng vi phạm kỷ luật từ xa qua một thiết bị quan sát. - Bảo mật hệ thống bằng cách nhận dạng khuôn mặt khi một hay nhiều đối tượng muốn ra vào một công ty, xí nghiệp, hay một cơ quan nào đó. - Quản lý thời gian làm việc của các nhân viên của một xí nghiệp mà chỉ cần một camera quan sát. Tài Liệu Tham Khảo [1]. Ngô Hoàng Khắc Tiến, Trần Xuân Bách, Đồ án tốt nghiệp Dò tìm ảnh mặt người dùng PCA, Khoa Công nghệ điện tử, trường Đại học Công Nghiệp TP HCM, 2009. [2]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập Môn Xử lý ảnh số, Nxb Khoa học và Kỹ thuật, 2002. [3]. Võ Đức Khánh, Hoàng Văn Kiếm. Giáo trình xử lý ảnh số, Nhà xuất bản Đại học Quốc gia Thành phố Hồ Chi Minh, 2003. [4]. Phạm Thế Bảo, Tổng quan các phương pháp xác định khuôn mặt người, Tạp chí bưu chính viễn thông. [5]. Ngô Quốc Tạo, Ngô Phương Đông, Nguyễn Thanh Hòa, Phạm Việt Bình (2003), Báo cáo “Nhận dạng mặt người trong môi trường độ sáng không đồng nhất”, Hội thảo Công nghệ thông tin quốc gia lần thứ VIII, Thái Nguyên, 29- 31/8/2003. [6]. Nguyễn Hoài Sơn, Giáo trình Matlab căn bản, Khoa Xây dựng và Cơ học ứng dụng, trường ĐHSPKT. [7]. Burce A. Draper, Kyungim Baek, Marian Stewart Bartlett, J. Ross Beveridge, “Recognizing Faces with PCA and ICA”. [8]. Stan Z. Li , Anil K. Jain, “Handbook of Face Recognition”, 2006. [9]. IEEE Computer Society, “Automatic face and gesture recognition”, 2004 [10]. Các Wedsite: www. diendandientu. com www. dientuvienthong. net Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm PHỤ LỤC ************ Chương trình chính*************** function varargout = luanvantotnghiep(varargin) % LUANVANTOTNGHIEP M-file for luanvantotnghiep.fig gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @luanvantotnghiep_OpeningFcn, ... 'gui_OutputFcn', @luanvantotnghiep_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % Executes just before luanvantotnghiep is made visible. function luanvantotnghiep_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; % Update handles structure guidata(hObject, handles); function varargout = luanvantotnghiep_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function THOAT_Callback(hObject, eventdata, handles) close1; % --- Executes on button press in pushbutton6. function pushbutton6_Callback(hObject, eventdata, handles) chuongtrinh1; delete(handles.figure1); % --- Executes during object creation, after setting all properties. function axes1_CreateFcn(hObject, eventdata, handles) imshow('anhnen.jpg'); % --- Executes during object creation, after setting all properties. function axes3_CreateFcn(hObject, eventdata, handles) imshow('vo.jpg'); % --- Executes during object creation, after setting all properties. function sxes2_CreateFcn(hObject, eventdata, handles) Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm imshow('logo.bmp'); **************************************************** **************Chương trình cắt ảnh tĩnh********* function varargout = chuongtrinh1(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @chuongtrinh1_OpeningFcn, ... 'gui_OutputFcn', @chuongtrinh1_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % --- Executes just before chuongtrinh1 is made visible. function chuongtrinh1_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; % Update handles structure guidata(hObject, handles); % --- Outputs from this function are returned to the command line. function varargout = chuongtrinh1_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- Executes on button press in CHONANH. function CHONANH_Callback(hObject, eventdata, handles) xoaanh; chonanh; % --- Executes on button press in TACHMAT. function TACHMAT_Callback(hObject, eventdata, handles) axes(handles.axes4); imshow('anhluu/anh1.jpg'); axes(handles.axes5); imshow('anhluu/anh2.jpg'); axes(handles.axes6); imshow('anhluu/anh3.jpg'); axes(handles.axes7); imshow('anhluu/anh4.jpg'); % --- Executes on button press in Timmat. function Timmat_Callback(hObject, eventdata, handles) tic % tic là hàm đếm thời gian bắt đầu đếm thuchien; % gọi hàm thuchien.m axes(handles.axes2); imshow('anhluu/anh_kq.jpg'); %hiện ảnh kết quả set(handles.times,'string',toc); %kết thúc đếm thời gian và cho nó hiện Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm % --- Executes on button press in NHANDANG. function NHANDANG_Callback(hObject, eventdata, handles) tic nhandang; set(handles.times,'string',toc); % --- Executes on button press in save1. function save1_Callback(hObject, eventdata, handles) s=imread('anhluu/anh1.jpg'); save1; % --- Executes on button press in save2. function save2_Callback(hObject, eventdata, handles) s=imread('anhluu/anh2.jpg'); save1; % --- Executes on button press in save3. function save3_Callback(hObject, eventdata, handles) s=imread('anhluu/anh3.jpg'); save1; % --- Executes on button press in save4. function save4_Callback(hObject, eventdata, handles) s=imread('anhluu/anh4.jpg'); save1; % --- Executes on button press in chon1. function chon1_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh1.jpg'); a = strcat('anhluu/anhtest.jpg'); imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in chon2. function chon2_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh2.jpg'); a = strcat('anhluu/anhtest.jpg'); imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in chon3. function chon3_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh3.jpg'); a = strcat('anhluu/anhtest.jpg'); Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in chon4. function chon4_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh4.jpg'); a = strcat('anhluu/anhtest.jpg'); imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in back. function back_Callback(hObject, eventdata, handles) xoaanh; luanvantotnghiep; delete(handles.figure1); % --- Executes on button press in close. function close_Callback(hObject, eventdata, handles) xoaanh; luanvantotnghiep; delete(handles.figure1); % --- Executes on button press in next. function next_Callback(hObject, eventdata, handles) xoaanh; chuongtrinh2; delete(handles.figure1); **************************************************** **********Chương trình cắt ảnh động**************** function varargout = chuongtrinh2(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @chuongtrinh2_OpeningFcn, ... 'gui_OutputFcn', @chuongtrinh2_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm end % End initialization code - DO NOT EDIT % --- Executes just before chuongtrinh2 is made visible. function chuongtrinh2_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; % Update handles structure guidata(hObject, handles); % --- Outputs from this function are returned to the command line. function varargout = chuongtrinh2_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- Executes on button press in chupanh. function chupanh_Callback(hObject, eventdata, handles) xoaanh; global vid photo a photo = getsnapshot(vid); selection = questdlg(['Ban muon chup anh gan hay xa?'],... ['Chuong trinh chup anh!'],... 'Gan','Xa','Yes'); if strcmp(selection,'Gan') axes(handles.axes1); photo=imresize(photo,0.5); imshow(photo); a = strcat('anhluu/anh_goc.jpg'); imwrite(photo,a); elseif strcmp(selection,'Xa') axes(handles.axes1); imshow(photo); a = strcat('anhluu/anh_goc.jpg'); imwrite(photo,a); end % --- Executes on button press in CAMERA. function CAMERA_Callback(hObject, eventdata, handles) global vid info = imaqhwinfo; info = imaqhwinfo('winvideo'); info.DeviceInfo; info.DeviceInfo.SupportedFormats; vid = videoinput('winvideo',1,'YUY2_640x480'); set(vid,'ReturnedColorSpace','RGB'); preview(vid); % --- Executes on button press in TACHMAT. function TACHMAT_Callback(hObject, eventdata, handles) axes(handles.axes4); imshow('anhluu/anh1.jpg'); axes(handles.axes5); imshow('anhluu/anh2.jpg'); axes(handles.axes6); imshow('anhluu/anh3.jpg'); axes(handles.axes7); imshow('anhluu/anh4.jpg'); % --- Executes on button press in Timmat. Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm function Timmat_Callback(hObject, eventdata, handles) tic thuchien; axes(handles.axes2); imshow('anhluu/anh_kq.jpg'); set(handles.times,'string',toc); % --- Executes on button press in NHANDANG. function NHANDANG_Callback(hObject, eventdata, handles) tic nhandang; set(handles.times,'string',toc); % --- Executes on button press in save1. function save1_Callback(hObject, eventdata, handles) s=imread('anhluu/anh1.jpg'); save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in save2. function save2_Callback(hObject, eventdata, handles) s=imread('anhluu/anh2.jpg'); save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in save3. function save3_Callback(hObject, eventdata, handles) s=imread('anhluu/anh3.jpg'); save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in save4. function save4_Callback(hObject, eventdata, handles) s=imread('anhluu/anh4.jpg'); save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in chon1. function chon1_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” photo=imread('anhluu\anh1.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng a = strcat('anhluu/anhtest.jpg'); % con nếu không thì thôi không là gì hết imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in chon2. function chon2_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” photo=imread('anhluu\anh2.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng a = strcat('anhluu/anhtest.jpg'); % còn nếu không thì thôi không là gì hết imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in chon3. function chon3_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm photo=imread('anhluu\anh3.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng a = strcat('anhluu/anhtest.jpg'); % con nếu không thì thôi không là gì hết imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in chon4. function chon4_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max” photo=imread('anhluu\anh4.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng a = strcat('anhluu/anhtest.jpg'); % còn nếu không thì thôi không là gì hết imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end % --- Executes on button press in back. function back_Callback(hObject, eventdata, handles) xoaanh; % thực hiện xóa những tấm ảnh cũ trước khi thực chuongtrinh1; %hiện chương trình xử lý ảnh mới delete(handles.figure1); % --- Executes on button press in close. function close_Callback(hObject, eventdata, handles) xoaanh; % thực hiện xóa những tấm ảnh cũ trước khi thực luanvantotnghiep; %hiện chương trình xử lý ảnh mới delete(handles.figure1); ********* Đoạn code thực hiện chương trình dò tìm và cắt ảnh************* face='face'; nface='nface'; %********************** TAO MATRAN CSDL************ [T1,T2] = taoCSDL(face,nface); %******************* TAO EF ************ [m1,m2,E1,E2] = taoEF(T1,T2); %******************LOAD ANH DE XU LY********** im1=imread('anhluu/anh_goc.jpg'); im= imresize(im1,0.2); % nén ảnh lại chỉ còn 20% im =rgb2gray(im); % chuyển về ảnh xám chỉ mang giá trị 0 và 1 %***************** XAC DINH ************** [dong cot] = size(im); anh1=im*255; % nhận toàn bộ ảnh với gí trị 255 anh2=im*255; for i=1:1:dong for j=1:1:cot tam=subim(im,i,j); tam1=tam-m1; % m1 là giá trị trung bình của ảnh face tam2=tam-m2; % m2 là giá trị trung bình của ảnh nace sochieu1=size(E1,2); sochieu2=size(E2,2); Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm hinhchieu1=tam*0; hinhchieu2=hinhchieu1; for k=1:sochieu1 toado=(E1(:,k))'*tam1; hinhchieu1=hinhchieu1+toado*E1(:,k); end for k=1:sochieu2 toado=(E2(:,k))'*tam2; hinhchieu2=hinhchieu2+toado*E2(:,k); end kc1=norm(tam1-hinhchieu1)/20; kc2=norm(tam2-hinhchieu2)/20; anh1(i,j)=kc1; anh2(i,j)=kc2; end end b=strcat('anhluu/anh_face.jpg'); imwrite(anh1,b); %******************* DANH DAU ANH *********** %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ xacdinh(im1,im1,anh1,anh2); anh1=im1; anh=im1; face=anh1; nface=anh2; ******* Đoạn code tạo cơ sở dữ liệu cho chương trình dò tìm ảnh mặt********** function [T1,T2] = taoCSDL(face,nface) csdl1 = dir(face); csdl2=dir(nface); soanh1 = 0; soanh2=0; % đếm tất cả các file ảnh có trong thư mục face và nface for i = 1:size(csdl1,1) if not(strcmp(csdl1(i).name,'.')|strcmp(csdl1(i).name,'..')|strcmp(csdl1(i).name,'Thumbs.db')) soanh1 = soanh1 + 1; end end for i = 1:size(csdl2,1) if not(strcmp(csdl2(i).name,'.')|strcmp(csdl2(i).name,'..')|strcmp(csdl2(i).name,'Thumbs.db')) soanh2 = soanh2 + 1 ; end end T1 = []; % Tạo ma trận ảnh T1 chứa tập ảnh face for i = 1 : soanh1 str = int2str(i); % hàm strcat nhằm liên kết các giá trị thành chuỗi str = strcat('\',str,'.png'); % tiện cho quá trình truy xuất hay lưu lại giá trị mới str = strcat(face,str); img = imread(str); try img = rgb2gray(img); % chuyển tất cả về ảnh xám 0 1 catch Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm end [dong cot] = size(img); % mỗi tấm ảnh huấn luyện có kích thước 18*27 tam = reshape(img',dong*cot,1); % biến 1 ảnh thành 1 vecto có 1cột và 18*27 hàng T1 = [T1 tam]; % tăng dần kích thước ma trận T1 End % kết thúc ma trận T1 có kích thước 18*27x P với P là số cột của ma trận củng chính là số ảnh trong thư mục ảnh %huấn luyện face 18*27=486 chính là số dòng của ma trận ảnh T1 và tương tự ma trận T2 cũng vậy T2 = []; % Bước này làm tương tự như tạo ma trận T1 for i = 1 : soanh2 % nhưng đối với ma trận ảnh nface str = int2str(i); str = strcat('\',str,'.png'); str = strcat(nface,str); img = imread(str); try img = rgb2gray(img); catch end [dong cot] = size(img); %dong 27 cot 18 tam = reshape(img',dong*cot,1); T2 = [T2 tam]; end *********Đoạn code tạo enginface ************** function [m1,m2,E1,E2] = taoEF(T1,T2) m1 = mean(T1,2); % Tính toán giá trị ảnh trung bình soanh1 = size(T1,2); m2 = mean(T2,2); soanh2=size(T2,2); %Tính độ lệch giửa các bước ảnh huấn luyện với giá trị ảnh trung bình sau đó trừ đi giá trị trung bình của ảnh trung bình và lưu các sai khác đó lại làm một ma trận ảnh mới ma trận đó là ma trận vecto riêng của ảnh huấn luyện, nhân ma trận vector riêng với ma trận nghịch đảo của nó và dùng hàm “eig” để tìm các vector riêng cho tập ảnh huấn luyện A1 = []; for i = 1 : soanh1 temp = double(T1(:,i)) - m1; % T(:,i): vector cột thứ i chính là một bức ảnh A1 = [A1 temp]; end A2 = []; for i = 1 : soanh2 temp = double(T2(:,i)) - m2; A2 = [A2 temp]; end L1 = A1'*A1; [V1 D1] = eig(L1); %tìm vector riêng và trị riêng L2 = A2'*A2; [V2 D2] = eig(L2); %V chứa ma trận những vecto riêng, còn D chứa những trị riêng của các vector riêng đó, vector riêng V(:,i) ứng với trị riêng là D(i,i) D=diag(D1); D=sort(D); % sắp sếp theo chiều tăng dần s=size(D); s=s(1); D=D(s-20); % chỉ giữ lại 20 trị riêng lớn nhất LeigV1 = []; % và 20 vector riêng lớn nhất của tập ảnh huấn luyện for i = 1 : size(V1,2) if( D1(i,i)>D ) LeigV1 = [LeigV1 V1(:,i)]; % tạo một ma trận mới chỉ gồm 20 vecto riêng End %tại các vị trí của chính nó còn các vị trí khác Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm End %đều cho giá trị bằng 0 D=diag(D2); D=sort(D); s=size(D);s=s(1); D=D(s-30); LeigV2 = []; for i = 1 : size(V2,2) if( D2(i,i)>D ) LeigV2 = [LeigV2 V2(:,i)]; end end E1 = A1 * LeigV1; E2 = A2 * LeigV2; sovector=size(E1,2); for i=1:sovector dodai=norm(E1(:,i)); E1(:,i)=E1(:,i)/dodai; end sovector=size(E2,2); % sovector chính là số cột của ma trận for i=1:sovector dodai=norm(E2(:,i)); % “norm” la tính giá trị bình phương trung bình E2(:,i)=E2(:,i)/dodai; End ****** doan code xac dinh va cat anh khuon mat******** function xacdinh(anh1,anh,face,nface) [dong,cot]=size(face); % vì phương pháp PCA là phương pháp xử lý ảnh theo khối for i=15:1:dong-13; % do vậy khi xử lý ảnh ta thường cắt ảnh lớn ra thành từng for j=8:1:cot-8; % tấm ảnh con để xử lý mà tấm ảnh xử lý phải có kích thước s1=0.001; % bằng kích thước tấm ảnh trong tập ảnh huấn luyện s2=0.001; % do vậy khi xử lý ta phải tính giá trị từ tâm của tấm ảnh for i1=i-13:i+13 % để quét cho nên khi truy xuất ra hình Eigenface thường for j1=j-7:j+7 % mất đi các đường viền xung quanh là vậy if abs(i1-i)<3 && abs(j1-j)<2 s1=s1+double(face(i1,j1)); else s2=s2+double(face(i1,j1)); end end end if s2/s1>21.8 && (nface(i,j)+nface(i-1,j)+nface(i+1,j))>89 && face(i,j)<31 && face(i-1,j)<31 && face(i+1,j)<31 && face(i-2,j)<31 && face(i+2,j)<31 kq(i,j)=255; % gán tại điểm ảnh phù hợp với các thông số else % của khuôn mặt là 255 và các vị trí khác kq(i,j)=0; % mang giá trị bằng 0 end end end %----------------------------- d=strcat('anhluu/anh_danhdau.jpg'); imwrite(kq,d); I=kq; anhkq=anh; anhkq1=anh1; [d,c]=size(I); % d là số dòng còn c là số cột của ma trận ảnh I i1=1; i2=1; i3=1; i4=1; j1=1; j2=1; j3=1; j4=1; % khi tính toán ở hàm này thì i là cột và j là dòng if d>50 Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm d1=d*2/3; else d1=d-5; end for i=1:c-5 % trong thuật toán này ta dùng vòng lặp for để for j=1:d1 % tìm giá trị tại đó là 255 sau đó lưu nó lại if I(j,i)>200 && i>10 % để tiện bề cho tính toán tách mặt sau này i1=i; % vòng lặp for có một khuyết điểm là nó j1=j; % chỉ dừng lại tại điểm cuối cho nên vấn đề end % tìm kiếm được nhiều khuôn mặt gặp nhiều end % khó khăn vòng lệnh lặp lại nhiều lẩn end % tốn kém thời gian khi chạy chương trình if i1-30>0 for i=1:i1-30 for j=1:d*2/3 if I(j,i)==255 && i>10 i2=i; j2=j; end end end end if i2-30>0 for i=1:i2-30 for j=1:d/2 if I(j,i)==255 && i>10 i3=i; j3=j; end end end end if i3-30>0 for i=1:i3-20 for j=1:d/2 if I(j,i)==255 && i>10 i4=i; j4=j; end end end end [d,c]=size(anhkq); if j1>1 &&i1>1 [j12,i12]=do(I,j1,i1); % gọi đến chương trình dò tìm tâm ảnh khuôn mặt i1=i12-16; j1=j12-20; if i1<1 % điều kiện này nhằm tránh lỗi khi cắt ảnh i1=1; % mà cắt ảnh lấn ra ngoài khung ảnh end if j1<1 j1=1; end i1=i1*5; j1=j1*5; i11=i1+149; j11=j1+199; if i11>c Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm i11=c; end if j11>d j11=d; end anh1=imcrop(anhkq1,[i1 j1 i11-i1 j11-j1]); a1=strcat('anhluu/anh1.jpg'); imwrite(anh1,a1); for c1=i1:i11 anhkq(j1,c1)=255; anhkq(j11,c1)=255; anhkq(j1-1,c1)=255; anhkq(j11-1,c1)=255; anhkq(j1-2,c1)=255; anhkq(j11-2,c1)=255; anhkq(j1-3,c1)=255; anhkq(j11-3,c1)=255; end for d1=j1:j11 anhkq(d1,i1)=255; anhkq(d1,i11)=255; anhkq(d1,i1-1)=255; anhkq(d1,i11-1)=255; anhkq(d1,i1-2)=255; anhkq(d1,i11-2)=255; anhkq(d1,i1-3)=255; anhkq(d1,i11-3)=255; end end if j2>1 &&i2>1 [j22,i22]=do(I,j2,i2); i2=i22-16; j2=j22-20; if i2<1 i2=1; end if j2<1 j2=1; end i2=i2*5; j2=j2*5; i21=i2+149; j21=j2+199; if i21>c i21=c; end if j21>d j21=d; end anh1=imcrop(anhkq1,[i2 j2 i21-i2 j21-j2]); a1=strcat('anhluu/anh2.jpg'); imwrite(anh1,a1); for c1=i2:i21 anhkq(j2,c1)=255; anhkq(j21,c1)=255; anhkq(j2-1,c1)=255; anhkq(j21-1,c1)=255; anhkq(j2-2,c1)=255; anhkq(j21-2,c1)=255; anhkq(j2-3,c1)=255; anhkq(j21-3,c1)=255; end for d1=j2:j21 anhkq(d1,i2)=255; anhkq(d1,i21)=255; anhkq(d1,i2-1)=255; anhkq(d1,i21-1)=255; anhkq(d1,i2-2)=255; anhkq(d1,i21-2)=255; anhkq(d1,i2-3)=255; anhkq(d1,i21-3)=255; end end if j3>1 &&i3>1 [j32,i32]=do(I,j3,i3); i3=i32-16; j3=j32-20; if i3<1 i3=1; end if j3<1 j3=1; end i3=i3*5; j3=j3*5; i31=i3+149; j31=j3+199; if i31>c i31=c; end if j31>d j31=d; end Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm anh1=imcrop(anhkq1,[i3 j3 i31-i3 j31-j3]); a1=strcat('anhluu/anh3.jpg'); imwrite(anh1,a1); for c1=i3:i31 anhkq(j3,c1)=255; anhkq(j31,c1)=255; anhkq(j3-1,c1)=255; anhkq(j31-1,c1)=255; anhkq(j3-2,c1)=255; anhkq(j31-2,c1)=255; anhkq(j3-3,c1)=255; anhkq(j31-3,c1)=255; end for d1=j3:j31 anhkq(d1,i3)=255; anhkq(d1,i31)=255; anhkq(d1,i3-1)=255; anhkq(d1,i31-1)=255; anhkq(d1,i3-2)=255; anhkq(d1,i31-2)=255; anhkq(d1,i3-3)=255; anhkq(d1,i31-3)=255; end end if j4>1 &&i4>1 [j42,i42]=do(I,j4,i4); i4=i42-16; j4=j42-20; if i4<1 i4=1; end if j4<1 j4=1; end i4=i4*5; j4=j4*5; i41=i4+149; j41=j4+199; if i41>c i41=c; end if j41>d j41=d; end anh1=imcrop(anhkq1,[i4 j4 i41-i4 j41-j4]); a1=strcat('anhluu/anh4.jpg'); imwrite(anh1,a1); for c1=i4:i41 anhkq(j4,c1)=255; anhkq(j41,c1)=255; anhkq(j4-1,c1)=255; anhkq(j41-1,c1)=255; anhkq(j4-2,c1)=255; anhkq(j41-2,c1)=255; anhkq(j4-3,c1)=255; anhkq(j41-3,c1)=255; end for d1=j4:j41 anhkq(d1,i4)=255; anhkq(d1,i41)=255; anhkq(d1,i4-1)=255; anhkq(d1,i41-1)=255; anhkq(d1,i4-2)=255; anhkq(d1,i41-2)=255; anhkq(d1,i4-3)=255; anhkq(d1,i41-3)=255; end end e=strcat('anhluu/anh_kq.jpg'); imwrite(anhkq,e); ****Đoạn code xác định vị trí trung tâm khuôn mặt******* function [a1,b1]= do(anh,a,b) % b la gia tri cot a la gia tri dong mini=b; minj=a; maxj=a; [d,c]=size(anh); b1=b-20; a1=a-15; a2=a+15; if b1<1 b1=1; end if a1<1 a1=1; end if a2>d a2=d; end for i1=b1:b for j1=a1:a2 if anh(j1,i1)>200 Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm if i1<mini mini=i1; end if j1<minj minj=j1; end if j1>maxj maxj=j1; end end end end a1=round((minj+maxj)/2); b1=round((mini+b)/2); ******Đoạn code nhận dạng Enginface*********** function kq=subim(anh,y,x) [dong,cot]=size(anh); % hàm này có hai mục đích d=27;c=18; % thứ 1: xóa bỏ các ảnh lỗi i1=y-13;i2=y+13; % thứ hai biến đổi ảnh thành vector và làm tròn số if i1<1 % trong thuật toán PCA xử lý ảnh theo khối do đó khi i1=1; % cắt ảnh thì củng sẽ có những tấm ảnh bị lỗi end % nên hàm này sẽ xóa tất cả các ảnh lỗi về giá trị if i2>dong % chỉ giữ lại các ảnh có kích thước đúng với ảnh mẫu i2=dong; end j1=x-8;j2=x+9; if j1<1 j1=1; end if j2>cot j2=cot; end im=anh(i1:i2,j1:j2); kt=(i2-i1+1)*(j2-j1+1); if kt==486 im=reshape(im',486,1); kq=double(im); else im=reshape(im,kt,1); kq=zeros(486,1); for i=1:kt kq(i,1)=im(i,1); end kq=double(kq); end *******Đoạn code nhận dạng và truy xuất thông tin cá nhân ảnh nhận dạng******** ******Đoạn code chương trình chính********** anhtest=imread('anhluu/anhtest.jpg'); %đọc ảnh chọn để nhận dạng if anhtest==255 % kiểm tra có phải là ảnh trắng hay không axes(handles.axes3); % nếu là ảnh trắng thông tin nhận dạng sẽ là imshow('hoso/0.jpg'); % tấm hình không nhận dạng được set(handles.ten,'string','Khoâng bieát'); % và các thông tin khác đều “không biết” set(handles.ns,'string','Khoâng bieát'); set(handles.mssv,'string','Khoâng bieát'); set(handles.lop,'string','Khoâng bieát'); set(handles.quequan,'string','Khoâng bieát'); Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm else % nếu có tấm ảnh nhận dạng thì chương trình sẽ anhtest=imresize(anhtest,[200 150]); % resize ảnh về đúng kích thước của ảnh mẫu mau='anhmau'; %tạo cơ sở dữ liệu ảnh mẫu T = taoCSDL1(mau); % tính giá trị eigenface của tập ảnh mẫu [m, A, E] = taoEF1(T); anhtim = nhandien1(anhtest, m, A, E); %gọi đến chương trình nhandien1 để nhận diện ảnh anhtim1=anhtim+1; % ******* Đọc và truy xuất dữ liệu của tấm ảnh nhận dạng được từ file Excel ************ file = [pwd '\hoso1.xls']; % khởi động chương trình Excel đọc file hoso1.xls range = 'A2:E100'; h = actxserver('Excel.Application'); % chỉ khởi động nhưng không cho hiện lên bản Excel h.Visible = 0; % Visible = 0 là ẩn Visible = 1 là cho nó hiện lên workbook = h.Workbooks.Open( file ); Sheets = h.ActiveWorkBook.Sheets; Sheets.Item(1).Activate; s1=strcat('A',num2str(anhtim1)); % gọi ô nhớ chứa thông tin trong file EXCEL s2=strcat('B',num2str(anhtim1)); s3=strcat('C',num2str(anhtim1)); s4=strcat('D',num2str(anhtim1)); s5=strcat('E',num2str(anhtim1)); h.Range(s1).Select; % Truy xuất thông tin cá nhân của tấm ảnh nhận t1 = h.get('Selection').Value; % dạng trong flie Excel(hoso1. xls) theo đúng tên của h.Range(s2).Select; % bức ảnh mẫu nhận dạng t2 = h.get('Selection').Value; h.Range(s3).Select; t3 = h.get('Selection').Value; h.Range(s4).Select; t4 = h.get('Selection').Value; h.Range(s5).Select; t5 = h.get('Selection').Value; set(handles.ten,'string',t1); %hiện thông tin cá nhân của tấm ảnh nhận dạng set(handles.ns,'string',t2); set(handles.mssv,'string',t3); set(handles.lop,'string',t4); set(handles.quequan,'string',t5); axes(handles.axes3); % Hiện ảnh vừa nhận diện imshow(strcat('hoso\',t3,'.jpg')); workbook.Close(false); % Đóng và thoát chương trình Excel h.Quit; delete(h); end *******Đoạn code tạo cơ sở dữ liệu của chương trình nhận dạng***** function T = taoCSDL1(mau) csdl = dir(mau); soanh = 0; for i = 1:size(csdl,1) if not(strcmp(csdl(i).name,'.')|strcmp(csdl(i).name,'..')|strcmp(csdl(i).name,'Thumbs.db')) soanh = soanh + 1; end end T = []; % tạo ma trận ảnh trong thư mục ảnh mẫu for i = 1 : soanh str = int2str(i); str = strcat('\',str,'.jpg'); str = strcat(mau,str); % Lấy đầy đủ tên của bức ảnh img = imread(str); Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm img = rgb2gray(img); [dong cot] = size(img); tam = reshape(img',dong*cot,1); % Biến ảnh thành vector T = [T tam]; % Tăng dần kích thước ma trận ảnh T end *********Đoạn code tính Eigenface trung bình************ function [m, A, E] = taoEF1(T) m = mean(T,2); %Tính toán giá trị ảnh trung bình soanh = size(T,2); %%%%%%%%%%%%%% Tính độ lệch của bức ảnh với gí trị trung bình của ảnh trung bình A = []; for i = 1 : soanh temp = double(T(:,i)) - m; % T(:,i): vector cột thứ i chính là 1 bức A = [A temp]; end L = A'*A; % Tính ma trận A*A’ [V D] = eig(L); % tim các vector riêng và trị riêng %V chứa những vector riêng, còn D chứa những trị riêng trong đó vector riêng V(:,i) ứng với trị riêng D(i,i) D1=diag(D); D1=sort(D1); s=size(D1);s=s(1); D1=D1(s-10); LeigV = []; for i = 1 : size(V,2) if( D(i,i)>D1 ) LeigV = [LeigV V(:,i)]; end end E = A * LeigV; sovector=size(E,2); for i=1:sovector dodai=norm(E(:,i)); E(:,i)=E(:,i)/dodai; end *****Đoạn code nhandien1 của chuong trình nhận dạng khuôn mặt************* function anhtim = nhandien1(anhtest, m, A, E) toado = []; %Tập tọa độ hình chiếu của các bức ảnh trong csdl sovector = size(E,2); %số vector riêng trong E là số for i = 1 : sovector tam = E'*A(:,i); %tọa đô hình chiếu của bức ảnh Ai toado = [toado tam]; end tam = rgb2gray(anhtest); % chuyển ảnh màu thành ảnh trắng đen [dong cot] = size(tam); InImage = reshape(tam',dong*cot,1); dolech = double(InImage)-m; toadoKT = E'*dolech; khoangcach = []; % tính khoảng cách của tấm ảnh so với các ảnh mẫu for i = 1 : sovector % xác định khoảng cách ngắn nhất q = toado(:,i); tam = ( norm( toadoKT - q ) )^2; khoangcach = [khoangcach tam]; Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm end [minKC , vitri] = min(khoangcach); if minKC<50000000 anhtim=vitri; elseif minKC>50000000 anhtim =100; end %%********Đoạn code liên quan*******%% ******* Đoạn code lưu ảnh********* if s==255 % kiểm tra ảnh chọn lưu có phải là ảnh hay không selection = questdlg(['No la anh trang do ban co luu khong?'],... ['Luu ' 'anh da chon!'],... 'Yes','No','Yes'); %Đưa ra bản thông báo nếu nó lá ảnh trắng if strcmp(selection,'No') % chọn “No” để quay lại chương trình return; elseif strcmp(selection,'Yes') [filename,pathname]=uiputfile({'*.jpg','JPEG Files(*.jpg)';... '*.bmp','Bitmap Files(*.bmp)';'*.gif','GIF Files(*.gif)';... '*.tif','TIFF Files(*.tif)';... '*.*','all image file'},'Luu anh da chon!','anhkq/'); imwrite(s,[pathname,filename]); end else % nếu ảnh lưu không phải là ảnh trắng [filename,pathname]=uiputfile({'*.jpg','JPEG Files(*.jpg)';... '*.bmp','Bitmap Files(*.bmp)';'*.gif','GIF Files(*.gif)';... '*.tif','TIFF Files(*.tif)';... %đặt tên và chọn loại ảnh muốn lưu '*.*','all image file'},'Luu anh da chon!','anhkq/'); %thực hiện lưu ảnh imwrite(s,[pathname,filename]); end ********* Đoạn code chọn ảnh ******* [filename,pathname]=uigetfile({'*.jpeg;*.jpg;*.gif;*.tif;*.tiff;*.bmp;*.png',... 'all image file';'*.jpg;*.jpeg','JPEG Files(*.jpg,*.jpeg)';... % chọn đường dẫn nơi chứa ảnh test '*.gif','GIF Files(*.gif)';'*.tif;*.tiff','TIFF Files(*.tif,*.tiff)';... '*.bmp','Bitmap Files(*.bmp)';'*.png','PNG Files(*.png)'},'Chon anh kiem tra! ','anhtest/1.png'); anhchon=imread([pathname,filename]); % đọc ảnh đã chọn axes(handles.axes1); imshow(anhchon); % hiện ảnh chọn a=strcat('anhluu/anh_goc.jpg'); imwrite(anhchon,a); **********Đoạn code xóa ảnh ******** a=255; % tạo ra ảnh trắng a1=strcat('anhluu/anh_goc.jpg'); imwrite(a,a1); % biến tát cả các ảnh đang hiện thành ảnh trắng a1=strcat('anhluu/anh1.jpg'); imwrite(a,a1); a1=strcat('anhluu/anh2.jpg'); imwrite(a,a1); a1=strcat('anhluu/anh3.jpg'); imwrite(a,a1); a1=strcat('anhluu/anh4.jpg'); imwrite(a,a1); a1=strcat('anhluu/anh_face.jpg'); imwrite(a,a1); a1=strcat('anhluu/anh_kq.jpg'); imwrite(a,a1); a1=strcat('anhluu/anhtest.jpg'); imwrite(a,a1); a1=255; axes(handles.axes1); imshow(a1); % hiện ảnh trắng lên các ô ảnh axes(handles.axes2); imshow(a1); axes(handles.axes3); imshow(a1); axes(handles.axes4); imshow(a1); axes(handles.axes5); imshow(a1); Phụ lục GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu Bùi Ngọc Liêm axes(handles.axes6); imshow(a1); axes(handles.axes7); imshow(a1); set(handles.ten,'string',' '); % xóa các dòng dữ liệu thông tin nhận dạng set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); ******* Đoạn code thoát******** selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],... % Đưa ra câu hỏi ['Close ' get(handles.figure1,'Name') '...'],... 'Yes','No','Yes'); % tạo bản lựu chọn có hai nút hỏi “Yes”, “No” if strcmp(selection,'No') % nếu chọn “No” quay laị chương trình return; end % Nếu chọn Yes thoát khỏi chương trình delete(handles.figure1)

Các file đính kèm theo tài liệu này:

  • pdfDò tìm và cắt ảnh mặt người dùng PCA.pdf