Giới thiệu đề tài
Trong kỷ nguyên số hiện nay, máy tính đóng vai trò quan trọng trong nghiên cứu khoa học và cuộc sống hàng ngày Mặc dù có khả năng tính toán mạnh mẽ và độ chính xác cao, hệ thống máy tính vẫn dựa trên lý thuyết cổ điển với logic nhị phân và các thuật toán được lập trình sẵn, do đó chưa thể tự lập luận hay sáng tạo.
Học máy (Machine learning) là phương pháp phân tích dữ liệu tự động, giúp trích xuất đặc trưng từ bộ dữ liệu một cách hiệu quả Bằng cách sử dụng các thuật toán trừu tượng, học máy cho phép máy tính tự học từ dữ liệu, phát hiện những thông tin giá trị ẩn mà phương pháp lập trình truyền thống không thể tiếp cận Khi làm việc với dữ liệu mới, học máy có khả năng thích ứng nhanh chóng và độc lập.
Học sâu (Deep Learning) là một lĩnh vực con của học máy, sử dụng mạng nơ ron nhân tạo để giải quyết các bài toán phức tạp mà các phương pháp tính toán truyền thống không thể xử lý Công nghệ này đặc biệt hiệu quả trong việc xử lý dữ liệu trừu tượng, mờ và không rõ ràng Nhờ vào khả năng này, học sâu được ứng dụng rộng rãi trong các lĩnh vực như nhận diện hình ảnh, nhận diện giọng nói, xử lý ngôn ngữ tự nhiên, cũng như dự đoán và dự báo.
Mạng nơ ron nhân tạo (Artificial Neural Networks) là mô hình xử lý thông tin được thiết kế dựa trên cách hoạt động của não bộ, bao gồm nhiều lớp nơ ron kết nối với nhau Qua quá trình huấn luyện, mạng nơ ron có khả năng rút ra kinh nghiệm và áp dụng chúng để xử lý thông tin mới Thường được sử dụng trong các bài toán nhận dạng mẫu và dự đoán, mạng nơ ron nhân tạo đóng vai trò quan trọng trong lĩnh vực trí tuệ nhân tạo.
Mạng nơ ron Tích chập (CNN) là một trong những mô hình học sâu tiên tiến nhất hiện nay, nổi bật với độ chính xác cao và tốc độ tính toán nhanh Nhờ vào những ưu điểm này, CNN được ứng dụng rộng rãi trong các hệ thống thông minh, đặc biệt trong lĩnh vực xử lý hình ảnh và nhận dạng đối tượng trong ngành thị giác máy tính.
Ngày nay, công nghệ bán dẫn đã giúp máy tính trở nên nhỏ gọn hơn, tiêu thụ ít năng lượng hơn và mạnh mẽ hơn, dẫn đến sự xuất hiện phổ biến của nhiều thiết bị thông minh như điện thoại thông minh, máy ảnh kỹ thuật số và camera hành trình Sự bùng nổ của Internet vạn vật (IoT) mở ra khả năng xuất hiện của nhiều thiết bị thông minh mới như xe ô tô tự lái và drone giao hàng Việc ứng dụng trí thông minh nhân tạo để khai thác dữ liệu hình ảnh từ các thiết bị này đang trở thành xu hướng quan trọng Dựa trên nhận định này và gợi ý từ giảng viên, nhóm chúng tôi quyết định chọn đề tài “Xây dựng ứng dụng nhận diện sử dụng deep learning” cho đồ án nghiên cứu của mình.
Phương pháp thực hiện
- Trước tiên ta phải nêu bài toán, phân tích và thiết kế hệ thống nhận dạng.
Xây dựng hệ thống deep learning bằng Python và mạng nơ ron Tích chập (CNN) cho phép nhận diện khuôn mặt qua camera Hệ thống này thực hiện việc trích xuất và phân tích khuôn mặt từ hình ảnh hoặc mẫu đã lưu trữ, nhằm so sánh và xác định xem đối tượng có được phép hay không Lập trình được thực hiện thông qua công cụ IDLE Python.
Sau khi hoàn thành, tiến hành xây dựng cơ sở dữ liệu SQLite để thống kê và hiển thị dữ liệu Để thực hiện việc này, có thể sử dụng một số công cụ lập trình như Sublime Text, PHPStorm và Pycharm.
Mục đích nghiên cứu
Tìm hiểu về các thuật toán nhận diện khuôn mặt người.
Tìm hiểu về mạng nơ-ron tích chập (CNN).
Nâng cao kỹ năng thiết kế và lập trình bằng ngôn ngữ Python.
Rèn luyện kỹ năng nghiên cứu và tìm hiểu tài liệu.
Xây dựng mô hình có thể nhận diện được cảm xúc khuôn mặt người và đếm được số người ra vào.
Giới hạn của đề tài
Với thời gian có hạn nên nhóm chỉ thực hiện nghiên cứu các vấn đề cơ bản trong phạm vi nhất định:
- Sử dụng thư viện mở có sẵn.
- Sử dụng video quay trực tiếp từ webcam và ảnh có sẵn làm đầu vào.
- Chỉ hoạt động trong điều kiện có ánh sáng và góc quay phù hợp.
Cấu trúc đồ án
- Phân tích và thiết kế hệ thống.
- Kết luận và hướng phát triển.
Mạng nơ-ron tích chập (Convolutional Neural Network)
Mạng nơ-ron tích chập là mô hình học sâu phổ biến, nổi bật với khả năng nhận dạng và phân loại hình ảnh chính xác lên đến 98% Mô hình này đang được áp dụng rộng rãi trong các hệ thống xử lý ảnh lớn của Facebook, Google và Amazon, phục vụ cho nhiều mục đích như thuật toán gắn thẻ tự động, tìm kiếm ảnh và giao hàng bằng drone.
Mạng nơ-ron tích chập được phát triển nhằm cải tiến cách thức học thông tin trong ảnh của các mạng nơ-ron nhân tạo truyền thống Khác với mạng nơ-ron truyền thẳng, nơi mà tất cả các điểm ảnh đều liên kết với nhau, mạng nơ-ron tích chập sử dụng các liên kết cục bộ, giúp giảm tải khối lượng tính toán đáng kể khi xử lý ảnh lớn Điều này cũng giúp loại bỏ sự dư thừa thông tin, vì các điểm ảnh thường chỉ có sự phụ thuộc mạnh mẽ với những điểm xung quanh gần kề, thay vì các điểm ảnh xa Kiến trúc mới này cho phép mạng nơ-ron tích chập hoạt động hiệu quả hơn trong việc nhận diện và phân tích hình ảnh.
Trong bài viết này, nhóm nghiên cứu sẽ giới thiệu về tích chập và khái niệm của mô hình CNN, đồng thời áp dụng chúng vào bài toán nhận diện cảm xúc trên khuôn mặt.
2.2.2 Cấu trúc đơn giản của CNN [8]
Trong mạng nơ-ron tích chập, các lớp cơ bản bao gồm lớp chập, lớp gộp và lớp kết nối đầy đủ Số lượng và cách sắp xếp của các lớp này có thể được điều chỉnh để tạo ra các mô hình huấn luyện phù hợp với từng bài toán cụ thể.
Hình 9: Cấu trúc của mạng nơ-ron tích chập
Lớp chập là thành phần quan trọng nhất trong cấu trúc mạng nơ-ron tích chập, giúp trích xuất thông tin quan trọng từ dữ liệu dựa trên lý thuyết xử lý tín hiệu số Tích chập có thể được hình dung như một cửa sổ trượt áp lên một ma trận, và cơ chế hoạt động của nó được minh họa qua Hình 2.10.
Hình 10: Minh họa chập với kernel 3x3
Hình 2.10 hiển thị một ma trận bên trái, đại diện cho một bức ảnh đen trắng Mỗi giá trị trong ma trận tương ứng với một điểm ảnh, với 0 biểu thị màu đen và 1 biểu thị màu trắng Đối với ảnh xám, giá trị sẽ dao động từ 0 đến 255.
Cửa sổ trượt, hay còn gọi là kernel hoặc filter, là một ma trận 3×3 được sử dụng để thực hiện phép tích chập với từng thành phần của ma trận ảnh bên trái Giá trị đầu ra được tính bằng cách cộng lại các tích của các thành phần tương ứng Kết quả của phép tích chập là một ma trận mới, được tạo ra từ việc trượt ma trận kernel và áp dụng phép tích chập lên toàn bộ ma trận ảnh bên trái.
Bản đồ đặc trưng được tạo ra từ lớp chập có kích thước giảm không đáng kể so với đầu vào, dẫn đến khối lượng tính toán lớn và khó khăn trong việc học Lớp gộp giúp giảm kích thước và số lượng tính toán của bản đồ đặc trưng, từ đó cải thiện hiệu suất học tập.
Max-Pooling là một trong những toán tử gộp phổ biến nhất, bên cạnh các toán tử như Sum-Pooling và L_2-Pooling Max-Pooling xác định vị trí của tín hiệu mạnh nhất khi sử dụng một loại kernel, tương tự như cách mà bộ lọc phát hiện vị trí đối tượng hoạt động trong bài toán phát hiện đối tượng trong ảnh.
Theo lý thuyết, khi áp dụng toán tử gộp trên ma trận đầu vào có kích thước a*b*c với ma trận con kích thước f*f và bước nhảy pixel s, ta sẽ thu được ma trận đầu ra có kích thước a’*b’*c’.
Hình 11: Phép toán sử dụng phép gộp
Hình 2.11 minh họa việc sử dụng toán tử gộp, trong đó lớp gộp xử lý đầu vào có kích thước [224*224*64] với các tham số f = 2 và s = 2, dẫn đến đầu ra có kích thước [112*112*64] như thể hiện ở bên trái hình Phía bên phải hình mô tả chi tiết cách hoạt động của max-pooling với f = 2 và s = 2, cho ra kết quả đầu ra ma trận tương ứng.
Chập là một phép biến đổi tuyến tính quan trọng trong mạng nơ-ron Nếu tất cả các nơ-ron chỉ sử dụng các phép biến đổi tuyến tính, mạng nơ-ron sẽ chỉ có thể biểu diễn các hàm tuyến tính Vì vậy, mỗi nơ-ron cần có một hàm truyền phi tuyến để tăng khả năng biểu diễn của mạng.
Có nhiều dạng hàm phi tuyến được sử dụng trong quá trình này như sau:
Hình 12: Một số hàm phi tuyến.
Nghiên cứu gần đây chỉ ra rằng hàm ReLU mang lại hiệu quả vượt trội nhờ vào tính toán đơn giản, khả năng tạo tính thưa cho các nơ-ron ẩn (khoảng 50% nơ-ron ẩn được kích hoạt sau khi khởi tạo ngẫu nhiên trọng số) và quá trình huấn luyện nhanh chóng mà không cần trải qua bước tiền huấn luyện.
Kết nối các nơ-ron giữa hai tầng trong mạng nơ-ron là quá trình mà tầng sau liên kết đầy đủ với các nơ-ron ở tầng trước Đây là kiểu kết nối phổ biến trong mạng nơ-ron nhân tạo, đặc biệt ở các mạng nơ-ron tích chập, thường được áp dụng ở giai đoạn cuối của kiến trúc mạng.
Hiện nay có một số cấu trúc CNN đạt được kết quả khả quan như:
LeNet là mô hình CNN đầu tiên thành công, nổi bật trong việc nhận dạng chữ số và ký tự trong văn bản, được phát triển bởi Yann Lecun vào cuối những năm 90.
Tìm hiểu về Face Detector - MTCNN
MTCNN, viết tắt của Multi-task Cascaded Convolutional Networks, là một hệ thống bao gồm ba mạng CNN xếp chồng và hoạt động đồng thời để phát hiện khuôn mặt Mỗi mạng trong MTCNN có cấu trúc và vai trò riêng biệt trong quá trình nhận diện Kết quả đầu ra của MTCNN bao gồm vị trí khuôn mặt cùng với các điểm đặc trưng trên khuôn mặt như mắt, mũi và miệng.
MTCNN hoạt động theo 3 bước, mỗi bước có một mạng neural riêng lần lượt là: P-Net, R-Net và O-net
Hình 13 Kiến trúc mạng MTCNN
Với mỗi bức ảnh đầu vào, nó sẽ tạo ra nhiều bản sao của hình ảnh đó với các kích thước khác nhau.
Tại P-Net, thuật toán sử dụng 1 kernel 12x12 chạy qua mỗi bức hình để tìm kiếm khuôn mặt.
Sau lớp convolution thứ ba, mạng được chia thành hai lớp riêng biệt Lớp Convolution 4-1 xác định xác suất có một khuôn mặt trong từng bounding box, trong khi lớp Convolution 4-2 cung cấp tọa độ chính xác cho các bounding box đó.
R-Net có cấu trúc tương tự vói P-Net Tuy nhiên sử dụng nhiều layer hơn.Tại đây, network sẽ sử dụng các bounding boxes được cung cấp từ P-Net và tinh chỉnh là tọa độ.
Tương tự R-Net chia ra làm 2 layers ở bước cuối, cung cấp 2 đầu ra đó là tọa độ mới của các bounding boxes, cùng độ tin tưởng của nó.
O-Net lấy các bounding boxes từ R-Net làm đầu vào và đánh dấu các tọa độ của các mốc trên khuôn mặt.
Thuật toán O-Net trong mạng neural cung cấp ba kết quả đầu ra chính: xác suất khuôn mặt nằm trong bounding box, tọa độ của bounding box và tọa độ các mốc quan trọng trên khuôn mặt như vị trí mắt, mũi và miệng.
Tìm hiểu Pre-trained model - FaceNet
Mô hình pre-trained là một giải pháp hiệu quả, được đào tạo sẵn bởi một bên khác để giải quyết các vấn đề tương tự Thay vì xây dựng từ đầu, chúng ta có thể sử dụng mô hình này làm điểm khởi đầu cho dự án của mình Mặc dù không đạt độ chính xác 100%, mô hình pre-trained giúp tiết kiệm đáng kể thời gian và công sức trong quá trình phát triển.
FaceNet là một mạng nơ-ron sâu được phát triển để trích xuất đặc trưng từ hình ảnh khuôn mặt Được công bố vào năm 2015 bởi các nhà nghiên cứu tại Google, công nghệ này đã mang lại nhiều ứng dụng trong nhận diện khuôn mặt và bảo mật.
Hình 1 FaceNet lấy hình ảnh khuôn mặt làm đầu vào và xuất ra vector embedding
FaceNet sử dụng hình ảnh khuôn mặt làm đầu vào và chuyển đổi chúng thành một vector 128 chiều, đại diện cho các đặc điểm quan trọng của khuôn mặt Trong lĩnh vực học máy, vector này được gọi là nhúng (embeddings), giúp nén toàn bộ thông tin cần thiết từ hình ảnh vào một định dạng dễ quản lý Cụ thể, FaceNet biến một khuôn mặt thành một vector 128 số, và khuôn mặt cần được nhận diện cũng sẽ có một nhúng tương tự.
Facenet là một loại mạng siam, có khả năng biểu diễn hình ảnh trong không gian Euclidean n chiều (thường là 128 chiều) Mục tiêu của Facenet là giảm khoảng cách giữa các vector embedding, từ đó tăng cường mức độ tương đồng giữa chúng.
Hầu hết các thuật toán nhận diện khuôn mặt trước Facenet đều sử dụng một vector nhúng (embedding) để biểu diễn khuôn mặt, thông qua một layer bottleneck nhằm giảm chiều dữ liệu.
Các thuật toán hiện tại gặp hạn chế với số lượng chiều embedding lớn (thường từ 1000 trở lên), điều này ảnh hưởng đến tốc độ xử lý Để cải thiện hiệu suất, thường cần áp dụng thuật toán PCA nhằm giảm chiều dữ liệu và tối ưu hóa tốc độ tính toán.
Hàm loss function chỉ đo khoảng cách giữa hai bức ảnh, do đó trong quá trình huấn luyện, mô hình chỉ có thể học được một trong hai khả năng: sự giống nhau nếu chúng thuộc cùng một lớp hoặc sự khác nhau nếu chúng thuộc lớp khác Điều này dẫn đến việc mô hình không thể học đồng thời cả sự giống nhau và khác nhau trong cùng một lượt huấn luyện.
Facenet đã giải quyết cả 2 vấn đề trên bằng các hiệu chỉnh nhỏ nhưng mang lại hiệu quả lớn:
Mạng cơ sở sử dụng mạng nơ-ron tích chập (convolutional neural network) để giảm số chiều dữ liệu xuống chỉ còn 128 chiều, giúp tăng tốc độ suy diễn và dự báo mà vẫn đảm bảo độ chính xác cao.
Hàm triplet loss được sử dụng như một loss function, giúp học đồng thời sự tương đồng giữa hai bức ảnh trong cùng một nhóm và phân biệt các bức ảnh không thuộc nhóm đó Phương pháp này mang lại hiệu quả vượt trội so với các phương pháp trước đây.
2.4.3 Thuật toán Triplet loss trong FaceNet:
Trong FaceNet, quá trình mã hóa của mạng nơ-ron tích chập (CNN) cho phép chuyển đổi hình ảnh thành các vector 128 chiều Những vector này sau đó được sử dụng làm đầu vào cho hàm triplet loss, nhằm đánh giá khoảng cách giữa các vector.
Hình 18 Triplet loss trên hai positive faces-mặt tích cực và một negative face- mặt tiêu cực
Mục tiêu của triplet loss là đảm bảo rằng:
Hai ví dụ có cùng nhãn có các phần nhúng của chúng gần nhau trong không gian nhúng.
Để áp dụng triple loss trong học sâu, chúng ta cần chọn ba bức ảnh, trong đó một bức ảnh được xác định là anchor Trong ba ảnh này, một bức ảnh sẽ là positive, tức là của cùng một người với anchor, và bức ảnh còn lại sẽ là negative, thuộc về một người khác Việc lựa chọn này giúp cải thiện độ chính xác trong việc phân loại và nhận diện hình ảnh.
Hàm triplet loss nhằm tối thiểu hóa khoảng cách giữa hai ảnh khi chúng là negative và tối đa hóa khoảng cách khi chúng là positive Do đó, việc lựa chọn các bộ ba ảnh phù hợp là rất quan trọng để đạt được hiệu quả tốt nhất trong quá trình học.
Ảnh Anchor và Positive có sự khác biệt rõ rệt; cần phải chọn những bức ảnh sao cho khoảng cách d(A,P) lớn Điều này giống như việc bạn chọn một bức ảnh hồi nhỏ của mình so với hiện tại, điều này sẽ làm cho thuật toán học trở nên khó khăn hơn Tuy nhiên, nếu thuật toán nhận diện được điều này, nó sẽ trở nên thông minh hơn.
Ảnh Anchor và Negative cần được lựa chọn sao cho khoảng cách d(A,N) giữa chúng là nhỏ nhất Điều này tương tự như cách mà thuật toán phân biệt hình ảnh của một người anh em giống bạn.
Hàm mất mát triplet luôn sử dụng ba bức ảnh làm đầu vào, với kỳ vọng rằng khoảng cách giữa ảnh A và ảnh P (d(A,P)) sẽ nhỏ hơn khoảng cách giữa ảnh A và ảnh N (d(A,N)) Để đảm bảo điều này, chúng ta thêm vào vế trái một hệ số α không âm rất nhỏ, biến đổi điều kiện thành: d(A,P) + α ≤ d(A,N).
Như vậy hàm loss function sẽ là:
Kỹ thuật căn chỉnh khuôn mặt (Face alignment)
Căn chỉnh khuôn mặt là quá trình xác định cấu trúc hình học của khuôn mặt trong hình ảnh kỹ thuật số, nhằm đạt được sự căn chỉnh chính xác bằng cách điều chỉnh biến dạng, tỷ lệ và góc xoay.
Có nhiều phương pháp căn chỉnh khuôn mặt, trong đó một số cố gắng áp dụng mô hình 3D đã được xác định trước Các phương pháp này thực hiện biến đổi hình ảnh đầu vào để các mốc trên khuôn mặt khớp với các mốc trên mô hình 3D.
Các phương pháp đơn giản hơn chỉ dựa vào các mốc trên khuôn mặt, đặc biệt là vùng mắt, để thực hiện việc xoay, dịch chuyển và điều chỉnh tỷ lệ khuôn mặt về cùng một kích thước.
Sau khi phát hiện khuôn mặt trong ảnh, chúng có thể ở nhiều trạng thái và góc độ khác nhau, bao gồm cả tình trạng bị chéo hoặc lệch do quá trình phát hiện chưa chính xác Do đó, việc áp dụng căn chỉnh khuôn mặt là cần thiết để chuẩn hóa dữ liệu, giúp cải thiện độ chính xác của mô hình nhận diện khuôn mặt trước khi đưa vào quá trình dự đoán.
Ngôn ngữ Python
2.6.1 Giới thiệu sơ lược về ngôn ngữ Python
Python là ngôn ngữ lập trình hướng đối tượng phổ biến, được tạo ra bởi Guido van Rossum vào năm 1990 Với cấu trúc rõ ràng và cú pháp gọn gàng, Python dễ học cho người mới và thuận tiện cho việc thử nghiệm Ngôn ngữ này hỗ trợ kiểu dữ liệu động và quản lý bộ nhớ tự động, giúp tăng hiệu quả trong lập trình Python, được phát triển dưới dạng mã nguồn mở bởi Python Software Foundation, là lựa chọn lý tưởng cho việc xây dựng ứng dụng nhanh chóng trên nhiều nền tảng khác nhau.
2.6.2 Các đặc điểm của ngôn ngữ Python
Dễ học, dễ đọc: Python được thiết kế để trở thành một ngôn ngữ dễ học, mã nguồn dễ đọc, bố cục rõ ràng, dễ hiểu
Python là một ngôn ngữ lập trình nổi bật với việc tăng cường sử dụng từ khóa tiếng Anh, giúp người dùng dễ dàng hiểu và sử dụng So với các ngôn ngữ khác, Python hạn chế sử dụng các ký hiệu và cấu trúc phức tạp, tạo nên cú pháp rõ ràng và dễ tiếp cận Đặc biệt, Python là ngôn ngữ phân biệt kiểu chữ hoa và chữ thường, điều này yêu cầu lập trình viên phải chú ý đến cách viết để tránh lỗi.
Trong các ngôn ngữ lập trình, khối lệnh thường được xác định bằng cặp ký hiệu hoặc từ khóa, như trong C/C++ với cặp ngoặc nhọn {} Tuy nhiên, Python sử dụng một phương pháp đặc biệt để tạo khối lệnh, đó là thụt lề các câu lệnh bên trong khối vào sâu hơn so với khối lệnh cha Việc sử dụng dấu Tab để thụt lề giúp lập trình viên dễ dàng viết và tổ chức mã nguồn hơn.
Python có khả năng mở rộng linh hoạt, cho phép người dùng viết và tích hợp các hàm tùy chỉnh bằng ngôn ngữ C, biến chúng thành các hàm xây dựng sẵn trong Python Người dùng cũng có thể mở rộng chức năng của trình thông dịch hoặc kết nối các chương trình Python với các thư viện nhị phân, chẳng hạn như thư viện đồ họa từ nhà sản xuất thiết bị Hơn nữa, trình thông dịch Python có thể được liên kết với các ứng dụng viết bằng C, hoạt động như một mở rộng hoặc ngôn ngữ dòng lệnh hỗ trợ cho các ứng dụng đó.
Python là một ngôn ngữ lập trình thông dịch, giúp tiết kiệm thời gian phát triển ứng dụng nhờ không cần biên dịch và liên kết Trình thông dịch Python có thể chạy file script hoặc hoạt động theo cách tương tác, tương tự như shell trong các hệ điều hành Unix Chế độ tương tác cho phép người dùng nhập biểu thức và nhận kết quả ngay lập tức, rất hữu ích cho người mới học và lập trình viên trong quá trình phát triển phần mềm Ngoài ra, tính năng này cũng có thể được sử dụng để thực hiện các phép tính như máy tính bỏ túi.
Trong Python, mỗi câu lệnh được viết trên một dòng mã nguồn và không cần kết thúc bằng ký tự nào Giống như các ngôn ngữ lập trình khác, Python cũng hỗ trợ các cấu trúc điều khiển để quản lý luồng thực thi của chương trình.
Cấu trúc rẽ nhánh: Cấu trúc if (có thể sử dụng thêm elif hoặc else), dùng để thực thi có điều kiện một khối mã cụ thể
Lệnh while cho phép thực thi lặp đi lặp lại các lệnh trong vòng lặp miễn là điều kiện được đưa ra là true Khi điều kiện trở thành false, chương trình sẽ thoát khỏi vòng lặp.
Vòng lặp for cho phép lặp qua từng phần tử của một dãy, với mỗi phần tử được gán vào một biến cục bộ để sử dụng trong khối mã bên trong vòng lặp.
Python cũng có từ khóa class dùng để khai báo lớp (sử dụng trong lập trình hướng đối tượng) và lệnh def dùng để định nghĩa hàm
Python sử dụng hệ thống kiểu dữ liệu duck typing, hay còn gọi là latent typing, cho phép tự động xác định kiểu mà không kiểm tra ràng buộc kiểu dữ liệu tại thời điểm dịch Thay vào đó, việc kiểm tra diễn ra tại thời điểm thực thi; nếu một thao tác trên đối tượng không thành công, điều đó cho thấy đối tượng không thuộc kiểu thích hợp Bên cạnh đó, Python cũng được coi là một ngôn ngữ định kiểu mạnh.
Python cấm mọi thao tác không hợp lệ và không yêu cầu khai báo biến trước Một biến được coi là đã được khai báo khi nó được gán giá trị lần đầu tiên Dựa vào mỗi lần gán, Python sẽ tự động xác định kiểu dữ liệu của biến.
Python hỗ trợ chia chương trình thành các module, giúp tái sử dụng mã nguồn trong các ứng dụng khác Ngoài ra, Python cũng cung cấp một bộ các module chuẩn, cho phép lập trình viên dễ dàng tích hợp vào các chương trình của mình.
Các module trong Python cung cấp nhiều chức năng hữu ích như truy xuất tập tin, gọi hệ thống và hỗ trợ lập trình mạng Python là một ngôn ngữ lập trình đơn giản nhưng rất hiệu quả, mang lại sự đa năng cho người dùng.
- So với Unix shell, Python hỗ trợ các chương trình lớn hơn và cung cấp nhiều cấu trúc hơn
So với C, Python có nhiều cơ chế kiểm tra lỗi và cung cấp các kiểu dữ liệu cấp cao như mảng linh hoạt và từ điển, giúp lập trình viên tiết kiệm thời gian Python là ngôn ngữ lập trình cấp cao, đáp ứng hầu hết các yêu cầu của lập trình viên.
Python thích hợp với các chương trình lớn hơn cả AWK và Perl
Python được sử dụng để lập trình Web Nó có thể được sử dụng như một ngôn ngữ kịch bản
Python tích hợp nhiều công cụ và thư viện chuẩn phong phú, giúp người dùng dễ dàng phát triển dịch vụ Web và sử dụng các thành phần như COM hay CORBA Nó hỗ trợ nhiều định dạng dữ liệu Internet, bao gồm email, HTML, XML và các ngôn ngữ đánh dấu khác Ngoài ra, Python còn cung cấp thư viện xử lý các giao thức Internet phổ biến như HTTP và FTP.
Python có khả năng giao tiếp với hầu hết các loại cơ sở dữ liệu, xử lý văn bản và tài liệu một cách hiệu quả, đồng thời tương thích tốt với các công nghệ Web khác.
Python đặc biệt hiệu quả trong lập trình tính toán khoa học nhờ các công cụ Python Imaging Library, pyVTK, MayaVi 3D Visualization Toolkits,
Một số thư viện quan trọng
OpenCV (OpenSource Computer Vision) là một thư viện mã nguồn mở được phát hành theo giấy phép BSD, hoàn toàn miễn phí cho cả mục đích học thuật và thương mại Thư viện hỗ trợ nhiều ngôn ngữ lập trình như C++, C, Python, Java và tương thích với các hệ điều hành Windows, Linux, Mac OS, iOS và Android Được tối ưu hóa cho hiệu suất tính toán và ứng dụng thời gian thực, OpenCV tận dụng khả năng xử lý đa lõi nhờ vào việc viết bằng C/C++ Với hơn 47 nghìn người dùng trên toàn cầu và hơn 6 triệu lượt tải xuống, OpenCV được ứng dụng rộng rãi trong nhiều lĩnh vực, từ nghệ thuật tương tác đến khai thác mỏ, bản đồ web và công nghệ robot.
Một số module mà chúng ta có thể làm việc thường xuyên nếu chúng ta sử dụng thư viện này:
Module Core của OpenCV chứa các cấu trúc và lớp cơ bản như Mat, Scale, Point, Vec, cùng với các phương thức thiết yếu phục vụ cho việc lưu trữ và xử lý hình ảnh, hỗ trợ cho các module khác trong thư viện.
Imgproc is an image processing module in OpenCV that includes both linear and non-linear filters, as well as geometric transformations such as resizing and affine transformations It also encompasses machine coordinate conversions and algorithms related to image histograms.
- Highgui: Đây là một module cho phép tương tác với người dùng trên UI
(User Interface) như hiển thị hình ảnh, video capturing.
- Features2d: Module tìm các đặc trưng (feature) của hình ảnh Trong module có implement các thuật toán rút trích đặc trưng như PCA…
- Calib3d: Hiệu chuẩn máy ảnh và xây dựng lại 3D.
Module Objdetect chuyên phát hiện các đối tượng như khuôn mặt, đôi mắt, cốc, người và xe hơi trong hình ảnh Thuật toán chính được sử dụng trong module này là Haar-like Features.
The ml module encompasses algorithms for Machine Learning, specifically designed for classification and clustering tasks Notable algorithms included are Support Vector Machine (SVM) and Artificial Neural Networks (ANN).
- Video: Module phân tích video gồm ước lượng chuyển động, trừ nền, và các thuật toán theo dõi đối tượng (object tracking).
OpenCV đang được sử dụng rộng rãi trong các ứng dụng bao gồm:
Kiểm tra và giám sát tự động
Robot và xe hơi tự lái
Phân tích hình ảnh y tế
Tìm kiếm và phục hồi hình ảnh/video
Phim - cấu trúc 3D từ chuyển động
Nghệ thuật sắp đặt tương tác cho sinh viên ngành điện tử viễn thông có thể được nâng cao thông qua việc ứng dụng thư viện mã nguồn mở OpenCV Thư viện này cho phép thực hiện nhiều bài toán thú vị trên các bo mạch phát triển như Raspberry Pi và Arduino, mở ra cơ hội sáng tạo và học hỏi cho sinh viên.
NumPy là một từ viết tắt của "Numeric Python" hoặc "Numerical Python".
NumPy là một mô-đun mã nguồn mở cho Python, cung cấp chức năng biên dịch nhanh cho các thao tác toán học và số Nó làm phong phú ngôn ngữ lập trình Python với các cấu trúc dữ liệu mạnh mẽ, cho phép tính toán hiệu quả trên các mảng và ma trận đa chiều, bao gồm cả các ma trận và mảng khổng lồ Ngoài ra, NumPy còn cung cấp một thư viện lớn các chức năng toán học cấp cao để thao tác trên các ma trận và mảng.
Keras là thư viện mã nguồn mở cho mạng nơ-ron, được phát triển bởi François Chollet vào năm 2015, hiện đang được sử dụng rộng rãi trong lĩnh vực deep learning Được viết bằng ngôn ngữ Python, Keras cung cấp API bậc cao, tương thích với các thư viện deep learning nổi tiếng như TensorFlow, CNTK và Theano Những ưu điểm nổi bật của Keras bao gồm tính dễ sử dụng, khả năng mở rộng và hỗ trợ cộng đồng mạnh mẽ.
Dễ sử dụng, xây dựng model nhanh.
Có thể chạy trên cả CPU và GPU
Hỗ trợ xây dựng CNN, RNN và có thể kết hợp cả hai
Thư viện TensorFlow là thư viện mã nguồn mở dùng cho tính toán số học sử dụng đồ thị luồng dữ liệu.
TensorFlow được phát triển bởi nhóm Google Brain tại Google, nhằm phục vụ cho việc nghiên cứu học máy và mạng nơ-ron sâu.
Hệ thống có thể áp dụng trong nhiều lĩnh vực khác nhau. Ưu điểm của TensorFlow:
Tích hợp sẵn rất nhiều các thư viện machine learning.
Có khả năng tương thích và mở rộng tốt Được Google phát triển cho machine learning phục vụ nghiên cứu lẫn xây dựng các ứng dụng thực tế.
Dlib, được phát triển từ năm 2002 bởi tác giả Davis King, là một thư viện mã nguồn mở viết bằng ngôn ngữ lập trình C++ Khác với OpenCV, Dlib tập trung vào các ứng dụng máy học và trí tuệ nhân tạo, cung cấp các thư viện con chuyên dụng để hỗ trợ phát triển các thuật toán trong lĩnh vực này.
- Classification: các kỹ thuật phân lớp chủ yếu dựa trên hai phương pháp cơ sở là kNN và SVM.
Biến đổi dữ liệu là quá trình sử dụng các thuật toán để giảm số chiều của dữ liệu, loại bỏ thông tin dư thừa và tăng cường tính khác biệt của các đặc điểm được giữ lại.
- Clustering: các kỹ thuật phân cụm
- Regression: các kỹ thuật hồi qui
- Structure prediction: các thuật toán dự đoán có cấu trúc
- Markov Random Fields: các thuật toán dựa trên các trường Markov ngẫu nhiên.
Phân tích – thiết kế hệ thống phát hiện mặt người
Chương trình chủ yếu có nhiệm vụ nhận diện khuôn mặt từ ảnh, video hoặc webcam, sau đó lưu trữ khuôn mặt vào cơ sở dữ liệu để phục vụ cho các mục đích phát triển trong tương lai.
Hình 22: Biểu đồ ngữ cảnh của hệ thống
Như vậy các chức năng chương trình bao gồm:
Thu thập bộ dữ liệu khuôn mặt (dataset)
Trích chọn đặc trưng từng khuôn mặt và gắn nhãn tương ứng (pre- train)
Phát hiện khuôn mặt trên ảnh đầu vào (face detection)
Căn chỉnh khuôn mặt (face alignment)
Trích xuất các vector đặc trưng của khuôn mặt (extract feature)
Nhận dạng khuôn mặt (face recognition)
Xử lý thông tin khuôn mặt vừa nhận dạng và tiến hành điểm danh
Hình 23 Sơ đồ thực hiện 3.1.2 Thiết kế hệ thống:
Với các chức năng ở trên, chương trình được chia thành thành 3 phần chính: Phần xử lý đầu vào, phần phát hiện khuôn mặt và phần xử lý đầu ra.
Lấy các đặc trưng và huấn luyện nhận dạng
Hình 24: Sơ đồ hệ thống
Chương trình nhận đầu vào từ file ảnh, video hoặc webcam, nhưng việc phát hiện khuôn mặt chỉ thực hiện trên ảnh tĩnh Do đó, khi sử dụng webcam hoặc video, cần chuyển đổi chúng thành các bức ảnh tĩnh để xử lý Sau khi có ảnh đầu vào, bước tiếp theo là phát hiện các khuôn mặt có trong ảnh đó.
3.1.4 Trích chọn đặc trưng và gán nhãn
Hệ thống sẽ xử lý nghiệp vụ chính bằng cách nhận diện khuôn mặt trong ảnh được truyền vào Sau khi tiếp nhận ảnh, chức năng phát hiện khuôn mặt sẽ được thực hiện để xác định sự hiện diện của các khuôn mặt trong hình ảnh.
Trong dự án này, chúng tôi sẽ trích xuất đặc trưng từ bộ dữ liệu và huấn luyện bằng mô hình Keras FaceNet đã được huấn luyện trước, do Hiroki Taniai cung cấp Mô hình này được đào tạo trên bộ dữ liệu MS-Celeb-1M của Microsoft, sử dụng ảnh màu đầu vào Các giá trị pixel sẽ được chuẩn hóa trên cả ba kênh và hình ảnh sẽ có kích thước vuông 160 × 160 pixel.
MS-Celeb-1M là bộ dữ liệu gồm hơn 10 triệu hình ảnh của gần 100.000 người nổi tiếng toàn cầu, bao gồm cả Việt Nam, được thu thập từ internet từ năm.
2016, hiện nay nó đã bị Microsoft dừng phát hành
3.1.4.1 Phát hiện khuôn mặt Để trích chọn đặc trưng cho mỗi khuôn mặt, trước tiên ta cần tìm ra vị trí khuôn mặt trong bức hình Vì bộ dữ liệu sẽ bao gồm nhiều ảnh có điều kiện ánh sáng cũng như các góc độ của khuôn mặt khác nhau, chính vì vậy việc lựa chọn face detector cũng rất quan trọng để đảm hiệu quả cao nhất cho hệ thống. Đầu tiên, tôi sẽ thử với phương pháp sử dụng haar cascade xml:
Hình 25 Phát hiện khuôn mặt với Haar cascade
Kết quả cho thấy rằng haar cascade hoạt động hiệu quả trên các khuôn mặt thẳng và không bị che khuất, như trong trường hợp của bạn nữ Tuy nhiên, với các góc nghiêng mạnh, như ở bạn nam, haar cascade đã nhận nhầm vùng tai, điều này cho thấy hạn chế của phương pháp này khi sử dụng cho việc pre-train.
Tiếp theo tôi sẽ thử với MTCNN:
Hình 26 Phát hiện khuôn mặt với MTCNN
Với MTCNN, tất cả các khuôn mặt có trong hình đều được phát hiện ra, ngay cả khuôn mặt nghiêng hay có vật cản.
Như vậy, trong dự án này tôi sẽ sử dụng MTCNN làm công cụ phát hiện khuôn mặt.
3.1.4.2 Trích chọn đặc trưng và gắn nhãn (pre-train):
Trong dự án này tôi sử dụng pre-trained model có sẵn đó là FaceNet.
Bộ dữ liệu khuôn mặt sẽ được tổ chức theo từng thư mục tương ứng với hình ảnh của từng sinh viên Hệ thống sẽ quét toàn bộ ảnh trong các thư mục, sử dụng Face detector để tìm kiếm và cắt lấy khuôn mặt, với kích thước tiêu chuẩn là 160x160 pixel Tiếp theo, FaceNet sẽ trích xuất đặc trưng của mỗi khuôn mặt, áp dụng mô hình học với thuật toán Triplet Loss và gán nhãn cho từng khuôn mặt dựa trên tên thư mục chứa ảnh.
3.1.5 Phát hiện khuôn mặt trong ảnh đầu vào:
Hình ảnh đầu vào có thể chứa nhiều khuôn mặt với sự không đồng nhất về ánh sáng, góc độ và biểu cảm Do đó, tôi quyết định sử dụng MTCNN làm công cụ phát hiện khuôn mặt nhờ vào sức mạnh và độ chính xác của nó.
3.1.6 Căn chỉnh khuôn mặt trước khi nhận dạng:
Căn chỉnh khuôn mặt là khá quan trọng, việc này giúp cải thiện phần nào độ chính xác khi đưa vào nhận dạng.
Trong dự án này, tôi áp dụng phương pháp căn chỉnh 2D, tập trung vào các điểm mốc trên khuôn mặt, đặc biệt là khu vực mắt Phương pháp này cho phép tôi thực hiện việc xoay, dịch chuyển và điều chỉnh tỷ lệ của khuôn mặt để đạt được kích thước đồng nhất.
Thuật toán MTCNN xác định vị trí của mắt trái và mắt phải, sau đó tính toán điểm giữa để xoay khuôn mặt, đảm bảo rằng hai mắt nằm trên cùng một hàng ngang.
Hình 27 Trước và sau khi căn chỉnh khuôn mặt
3.1.7 Trích rút đặc trưng khuôn mặt từ ảnh đầu vào:
Sau khi nhận diện và căn chỉnh khuôn mặt, hệ thống sẽ sử dụng FaceNet để trích xuất các đặc trưng của khuôn mặt Những đặc trưng này sau đó sẽ được đưa vào
“không gian embeddings” để so sánh với bộ dữ liệu các đặc trưng đã có.
Trong không gian embeddings, các khuôn mặt được biểu diễn dưới dạng vector 128 chiều sẽ được so sánh với bộ dữ liệu nhằm xác định khuôn mặt tương đồng nhất và gán nhãn cho chúng.
Trong dự án này, tôi áp dụng phương pháp đo cosine similarity để thực hiện so sánh Cosine similarity được sử dụng khi chúng ta chỉ quan tâm đến góc giữa hai vector mà không chú ý đến khoảng cách giữa chúng.
Dựa vào cosine similarity, khoảng cách cosine được tính bằng công thức cosine_distance = 1 – cosine_similarity Hàm cosine nhận đầu vào là mảng chứa vector 128 chiều của khuôn mặt trong ảnh cần nhận dạng, cùng với bộ dữ liệu chứa các vector 128 chiều của các khuôn mặt đã được huấn luyện Cosine distance sẽ so sánh lần lượt khoảng cách giữa vector đầu vào và các vector trong bộ dữ liệu để xác định vector có giá trị thấp nhất, tương ứng với độ tương tự cao nhất.
3.1.9 Xác định các khuôn mặt “unknown”
Giao diện chương trình
- Sử dụng thư viện mở có sẵn.
- Sử dụng video quay trực tiếp từ webcam và ảnh có sẵn làm đầu vào.
- Chỉ hoạt động trong điều kiện có ánh sáng và góc quay phù hợp.
- Phân tích và thiết kế hệ thống.