Phát hiện cảm xúc khuôn mặt là bước phát triển tiếp sau của việc phát hiện khuôn mặt, phân chia cảm xúc khuôn mặt thành 7 nhóm thể hiện chính: Vui vẻ, Ngạc nhiên, Hài lòng, Buồn bực, Cáu giận, Phẫn nộ và Sợ hãi
Cảm xúc và biểu hiện khuôn mặt
Hạnh phúc - Happy
Hạnh phúc là một cảm xúc mạnh mẽ, thể hiện qua nét mặt rạng rỡ và nụ cười, phản ánh sự hài lòng và thỏa mãn trong tâm trí Đây là một trong những cảm xúc phổ biến nhất, đã được nghiên cứu qua nhiều phương pháp triết học, tín ngưỡng và sinh học nhằm tìm ra nguồn gốc của nó Các nhà triết học và thần học đã định nghĩa hạnh phúc không chỉ là một cảm xúc đơn thuần mà còn là kết quả của việc sống một cuộc sống tốt đẹp và sự nảy nở của tâm hồn Ngày nay, hạnh phúc thường được liên kết với sự thỏa mãn, thể hiện rõ ràng qua biểu cảm trên khuôn mặt.
Hình 1: Biểu hiện/cảm xúc trên khuôn mặt: Hạnh phúc
Buồn bã - Sad
Cảm xúc buồn bã thể hiện rõ qua nét mặt với vùng trán nhăn lại, đôi mắt trùng xuống và thiếu sức sống Vẻ mặt này toát lên sự sầu não, buồn khổ, kèm theo những tiếng thở dài, tạo nên một không gian lặng lẽ và trầm buồn.
Hình 2: Biểu hiện/cảm xúc trên khuôn mặt: Buồn bã
Sự buồn bã là một cảm xúc thường gắn liền với thất vọng, mất mát và cảm giác không được hỗ trợ Con người thường thể hiện nỗi buồn qua sự im lặng, thiếu năng lượng và mong muốn tránh xa những vấn đề tiêu cực Nỗi buồn được coi là đối lập với hạnh phúc, có thể được mô tả bằng nhiều từ như nỗi buồn, đau khổ và u sầu Nó có thể dẫn đến hai hệ quả: một tâm trạng chùng xuống tạm thời hoặc sự buồn bã mãn tính, thường liên quan đến trầm cảm Biểu hiện của nỗi buồn thường thấy qua việc hạ thấp khóe miệng và nâng phần trong của chân mày.
Ngạc nhiên
Cảm giác ngạc nhiên thường được thể hiện qua lông mày nhô cao, mắt mở to, hàm dưới trề xuống và miệng mở tròn Đây là một trạng thái cảm xúc liên quan đến những sự kiện bất ngờ và không mong đợi Mặc dù ngạc nhiên thường gắn liền với sự đột ngột, nhưng nó không nhất thiết phải mang lại cảm xúc tiêu cực hay đau thương.
Hình 3: Biểu hiện/cảm xúc trên khuôn mặt: Ngạc nhiên
Ngạc nhiên được phân loại thành hóa trị, trải dài từ cảm xúc trung tính đến dễ chịu và khó chịu Cảm xúc ngạc nhiên thường thể hiện rõ ràng trên khuôn mặt, với các biểu hiện như cong lông mày, mở to mắt và hất hàm.
Nỗi sợ
Nỗi sợ là một cảm xúc gắn liền với mối đe dọa hoặc tình huống nguy hiểm, đóng vai trò như một cơ chế sinh tồn cơ bản Nó xuất hiện để phản ứng với những thực tế đau thương, như cơn đau hoặc nguy cơ sắp xảy ra Nỗi sợ thường liên quan đến hành vi trốn thoát hoặc lảng tránh, nhưng không nên nhầm lẫn với lo âu, một cảm xúc thể chất phản ứng với những đe dọa mà con người cảm thấy không thể tránh khỏi Khi trải qua nỗi sợ, con người thường thể hiện trên gương mặt với các biểu hiện như nhướn mày, hé miệng và mở mắt rộng hơn bình thường.
Hình 4: Biểu hiện/cảm xúc trên khuôn mặt: Nỗi sợ
Giận dữ
Là một cảm xúc thường liên quan đến sự bực dọc nhỏ đến sự bùng nổ lớn.
Khi tức giận, cơ thể một số người có thể trải qua hiện tượng tăng nhịp tim, huyết áp cao và sự gia tăng mức độ adrenaline và noradrenaline.
Hình 5: Biểu hiện/cảm xúc trên khuôn mặt: Giận dữ
Sự giận dữ thường liên quan đến phản ứng của não bộ khi con người đối diện với những trải nghiệm gây đe dọa hoặc đau đớn Khi một người quyết định chống lại mối đe dọa, sự tức giận trở thành phản ứng chủ đạo, thể hiện qua cả nhận thức và sinh lý Biểu hiện của sự giận dữ trên khuôn mặt bao gồm việc hạ thấp lông mày, ấn chặt môi và phồng mắt.
Chán ghét
Chán ghét là một cảm xúc thường gắn liền với những yếu tố như mất vệ sinh, thực phẩm không ăn được, hoặc những điều gây xúc phạm Cảm xúc này có thể xuất phát từ những tổn thương mà người khác gây ra cho chúng ta hoặc từ những hành vi không được chấp nhận Nói chung, chán ghét liên quan đến những trải nghiệm khó chịu, chủ yếu để phản ứng lại cảm giác vị giác và cũng như để phản ứng lại những kích thích tương tự qua các giác quan khác Biểu hiện của chán ghét thường thấy trên khuôn mặt, với các dấu hiệu như nâng môi trên, nhăn mũi và nâng má Đáng chú ý, chán ghét là một trong sáu cảm xúc có khả năng làm giảm nhịp tim.
Hình 6: Biểu hiện/cảm xúc trên khuôn mặt: Chán ghét
Nhận dạng cảm xúc qua khuôn mặt có ứng dụng trong các lĩnh vực khác nhau:
Giáo dục: Phản ứng của người học trong thời gian thực và sự tham gia vào nội dung học tập là những chỉ số quan trọng để đánh giá hiệu quả của bài giảng.
Tiếp thị là một công cụ hiệu quả giúp các công ty phân tích phản hồi của khách hàng đối với quảng cáo, sản phẩm, bao bì và thiết kế cửa hàng.
Việc phát hiện cảm xúc của người tiêu dùng giúp doanh nghiệp hiểu rõ mức độ quan tâm và phản ứng đối với sản phẩm, từ đó xây dựng các chiến lược điều chỉnh hợp lý Ứng dụng tính năng nhận biết cảm xúc sẽ là chìa khóa vàng cho sự thành công trong marketing và bán hàng, giúp doanh nghiệp nắm bắt tâm lý khách hàng để đưa ra sản phẩm và gợi ý phù hợp với từng đối tượng và hoàn cảnh.
Nhận dạng cảm xúc trong lĩnh vực y tế giúp các chuyên gia hiểu rõ hơn về tình trạng của bệnh nhân, đặc biệt là những người gặp khó khăn hoặc mất khả năng nói, từ đó cung cấp sự hỗ trợ hiệu quả hơn.
Game thực tế ảo đã mang đến trải nghiệm gần gũi với thực tế, và việc nhận dạng cảm xúc khuôn mặt đóng vai trò quan trọng trong việc nâng cao trải nghiệm chơi game.
Bảo mật bằng AI có khả năng nhận diện hành vi đáng ngờ trong đám đông, giúp ngăn chặn tội phạm và khủng bố tiềm năng Công nghệ phát hiện cảm xúc từ AI có thể trở thành công cụ hữu hiệu hỗ trợ lực lượng thực thi pháp luật trong việc phát hiện những cá nhân có hành động nghi vấn nơi công cộng.
Học máy
Môt số khái niệm cơ bản
Dataset, hay còn gọi là tập dữ liệu, là một tập hợp các dữ liệu nguyên thủy chưa được xử lý mà bạn đã thu thập trong quá trình thu thập dữ liệu Một dataset thường bao gồm nhiều điểm dữ liệu khác nhau.
Data point là một đơn vị dữ liệu đại diện cho một quan sát cụ thể, với nhiều đặc trưng khác nhau Các đặc trưng này được phân loại thành hai loại chính: dữ liệu số (numerical) và dữ liệu không phải số (non-numerical/categorical), chẳng hạn như chuỗi Mỗi data point được thể hiện dưới dạng dòng tương ứng, trong đó mỗi dòng có thể chứa một hoặc nhiều dữ liệu, tức là các đặc trưng liên quan.
Trong quá trình xây dựng mô hình, dữ liệu thường được chia thành hai tập: tập huấn luyện (training data) và tập kiểm tra (test data) Tập huấn luyện được sử dụng để đào tạo mô hình, trong khi tập kiểm tra dùng để dự đoán kết quả và đánh giá hiệu suất của mô hình Đối với một số bài toán, hai tập dữ liệu này có thể đã được cung cấp sẵn, nhưng nếu chỉ có một tập dữ liệu duy nhất, bạn cần phải chia nó ra Tỷ lệ phổ biến giữa tập huấn luyện và tập kiểm tra thường là 80/20.
Vector đặc trưng là đại diện cho mỗi điểm dữ liệu trong tập dữ liệu, với mỗi vector có n chiều thể hiện các đặc trưng số của điểm dữ liệu Để mô hình có thể huấn luyện hiệu quả, tập dữ liệu cần được chuyển đổi thành một tập hợp các vector đặc trưng.
Mô hình là các cấu trúc được sử dụng để huấn luyện trên tập dữ liệu theo thuật toán cụ thể Sau quá trình huấn luyện, mô hình có khả năng dự đoán hoặc đưa ra quyết định dựa trên kiến thức đã học được từ dữ liệu.
Học sâu - Deep learning
Deep Learning là một nhánh của Machine Learning, cho phép đào tạo AI dự đoán đầu ra từ một tập hợp đầu vào Nó sử dụng mạng neuron để mô phỏng trí thông minh của con người, bao gồm ba loại lớp: lớp đầu vào, lớp ẩn và lớp đầu ra Các kết nối giữa các neuron được gán trọng số, xác định tầm quan trọng của giá trị đầu vào, và mỗi neuron sử dụng một hàm kích hoạt để chuẩn hóa đầu ra Để đào tạo mạng neuron, cần một bộ dữ liệu lớn; việc lặp lại và so sánh đầu ra sẽ tạo ra hàm chi phí, giúp đánh giá độ chính xác của mô hình.
AI tạo ra các đầu ra khác nhau so với thực tế Sau mỗi lần lặp, trọng số giữa các neuron được điều chỉnh thông qua phương pháp Gradient Descent nhằm giảm giá trị hàm chi phí.
Nguyên nhân lý giải sự trỗi dậy của deep learning
• BigData đang rất phát triển:các bộ dữ liệu để training không quá khó để tìm kiếm.
• Hardware: phần cứng như Ram, CPU, GPU đã mạnh và rẻ hơn rất nhiều
Cộng đồng trực tuyến như Stack Overflow và Facebook đã giúp người dùng tìm thấy câu hỏi liên quan đến vấn đề của mình Mô hình CNN có lịch sử từ năm 1980 khi được giới thiệu bởi một nhà khoa học Nhật Bản Năm 1998, Yan LeCun lần đầu tiên huấn luyện CNN với thuật toán backpropagation cho nhận dạng chữ viết tay Tuy nhiên, chỉ đến năm 2012, Alex Krizhevsky (cùng với Geoffrey Hinton) đã phát triển mô hình CNN AlexNet, sử dụng GPU để tăng tốc quá trình huấn luyện deep nets, đạt được vị trí top 1 trong cuộc thi ImageNet với độ lỗi phân lớp top 5 giảm hơn 10% so với các mô hình trước đó, từ đó thúc đẩy sự phát triển mạnh mẽ của deep CNN trong lĩnh vực Computer Vision.
Trong những năm gần đây, học sâu đã cho thấy độ chính xác vượt trội so với các phương pháp truyền thống nhờ vào việc loại bỏ bước trích xuất đặc trưng tường minh và kết hợp với các phương pháp phân loại Mô hình Convolutional Neural Networks (CNN) nổi bật là một trong những mô hình deep learning phổ biến nhất trong cộng đồng Computer Vision CNN được ứng dụng rộng rãi trong nhiều lĩnh vực như nhận dạng ảnh, phân tích video, hình ảnh MRI, và cả trong xử lý ngôn ngữ tự nhiên, với khả năng giải quyết hiệu quả các bài toán này.
Thị giác máy tính (Computer Vision) là một lĩnh vực nghiên cứu tập trung vào các phương pháp xử lý ảnh kỹ thuật số, phân tích và nhận diện hình ảnh Lĩnh vực này phát triển dựa trên ý tưởng mô phỏng khả năng thị giác của con người, với mục tiêu nhận diện và hiểu biết hình ảnh thông qua các thuật toán số học.
Học sâu, hay deep learning, là một thuật toán mô phỏng cách mà não bộ con người học hỏi, sử dụng nhiều tầng mạng nơ ron để trích xuất và phân loại đặc trưng Phương pháp này được ứng dụng rộng rãi trong nhận diện hình ảnh, giọng nói và xử lý ngôn ngữ tự nhiên Với nguồn dữ liệu khổng lồ và sự phát triển mạnh mẽ của phần cứng cho phép thực hiện hàng tỉ phép tính song song, deep learning đã chứng tỏ được hiệu quả vượt trội so với các phương pháp lập trình truyền thống.
Mạng nơ ron tích chập (Convolutional Neural Network - CNN) là mô hình deep learning quan trọng, hỗ trợ phát triển thuật toán thông minh trong lĩnh vực thị giác máy tính Phương pháp này là trọng tâm của khoá luận này.
Mô hình mạng neural tích chập (CNN) là một trong những công nghệ tiên tiến được sử dụng để nhận dạng và phân loại hình ảnh CNN đặc biệt hiệu quả trong việc xác định đối tượng và nhận dạng khuôn mặt, làm cho nó trở thành lựa chọn phổ biến trong nhiều ứng dụng liên quan đến hình ảnh.
CNN phân loại hình ảnh bằng cách nhận diện và phân loại hình ảnh đầu vào thành các hạng mục như Chó, Mèo, Hổ, và nhiều hơn nữa Máy tính xử lý hình ảnh dưới dạng mảng pixel, với việc phân loại phụ thuộc vào độ phân giải của hình ảnh Độ phân giải này được xác định bởi các thông số H x W x D, trong đó H là chiều cao, W là chiều rộng và D là độ dày của hình ảnh.
Ví dụ: Hình ảnh là mảng ma trận RGB 6x6x3 (3 ở đây là giá trị RGB).
Dữ liệu đầu vào của bài toán phân loại hình ảnh là một bức ảnh, được biểu diễn dưới dạng ma trận các giá trị điểm ảnh Mô hình phân lớp sẽ dự đoán lớp của ảnh dựa trên ma trận này, chẳng hạn như xác định ảnh đó là con mèo, chó hay chim.
Để biểu diễn một bức ảnh 256x256 pixel trong máy tính, cần sử dụng ma trận kích thước 256x256 Tùy thuộc vào loại ảnh, nếu là ảnh màu RGB, ma trận sẽ có kích thước 256x256x3, trong khi ảnh xám chỉ cần ma trận 256x256.
Mối liên kết giữ CNN và thị giác
CNN có mối liên hệ chặt chẽ với sinh học, đặc biệt là trong lĩnh vực võ não thị giác, nơi tiếp nhận và xử lý thông tin hình ảnh từ các tế bào cảm thụ ánh sáng trong mắt Năm 1962, hai nhà thần kinh học người Mỹ, Hubel và Wiesel, đã tiến hành thí nghiệm để khám phá cách tổ chức của các tế bào não trong việc xử lý thông tin thị giác và vai trò của các tổ chức này.
Hình 11: Nô tả hình ảnh với ma trận RGB
Con người có khả năng nghe âm thanh, phản ánh sự hoạt động của các tế bào não khi phản ứng với hình ảnh, góc cạnh và hướng của các đường thẳng trong video theo một trật tự nhất định Mỗi neuron được cấu tạo để đáp ứng với những đặc điểm nhất định, cho thấy sự liên kết giữa âm thanh và hình ảnh trong quá trình nhận thức.
Cấu trúc mạng CNN bao gồm các lớp cơ bản như lớp tích chập (convolution layer), lớp phi tuyến (nonlinear layer), lớp gộp (pooling layer) và lớp kết nối đầy đủ (fully connected layer) Các lớp này được liên kết theo một thứ tự nhất định, trong đó hình ảnh đầu tiên sẽ được truyền qua lớp tích chập và lớp phi tuyến Sau đó, các giá trị tính toán sẽ được chuyển tiếp qua lớp gộp Bộ ba lớp tích chập, lớp phi tuyến và lớp gộp có thể được lặp lại nhiều lần trong mạng.
Và sau đó được lan truyền qua tầng fully connected layer và softmax để tính sác xuất ảnh đó chứa vật thế gì.
Lớp tích chập (Convolution Layer) là lớp quan trọng nhất trong mô hình CNN, có chức năng phát hiện các đặc trưng không gian hiệu quả Lớp này bao gồm bốn thành phần chính: ma trận đầu vào, bộ filters, receptive field và feature map Conv layer nhận đầu vào là ma trận 3 chiều cùng bộ filters cần học, mà sẽ trượt qua từng vị trí trên bức ảnh để thực hiện quá trình tích chập Vùng tương ứng trên bức ảnh mà bộ filters quét gọi là receptive field, và kết quả thu được từ quá trình này là feature map Hình dung bộ filters như các tháp canh trong nhà tù, quét qua không gian để tìm kiếm tên tù nhân bỏ trốn; khi phát hiện ra đặc trưng nhất định, tích chập sẽ cho giá trị lớn, giống như chuông báo động reo lên khi có nguy cơ.
Dữ liệu đầu vào là ma trận kích thước 8x8x1, với bộ filter kích thước 2x2x1, tạo ra feature map kích thước 7x7x1 Mỗi giá trị trong feature map được tính bằng tổng tích các phần tử tương ứng của bộ filter với receptive field trên ảnh Để tính toàn bộ giá trị cho feature map, cần trượt filter từ trái sang phải và từ trên xuống dưới Phép convolution bảo toàn thứ tự không gian của các điểm ảnh, ví dụ, điểm góc trái của dữ liệu đầu vào sẽ tương ứng với một điểm ở góc trái của feature map.
Hình 13: Cấu trúc Covolution layer
Tầng convolution đóng vai trò là bộ phát hiện đặc trưng trong hình ảnh, giúp nhận diện các yếu tố cơ bản như góc, cạnh, màu sắc, cũng như các đặc trưng phức tạp hơn như kết cấu Bộ lọc quét qua toàn bộ bức ảnh, cho phép phát hiện các đặc trưng này ở bất kỳ vị trí nào, ngay cả khi bức ảnh bị xoay trái hoặc phải Ví dụ, một bộ lọc 5x5 có thể được sử dụng để phát hiện góc và cạnh, với giá trị một tại các điểm tương ứng với các góc cong.
Hình 14: Cấu trúc High level feature
Sử dụng bộ lọc trên hình ảnh của nhân vật Olaf trong bộ phim Frozen cho thấy rằng chỉ những vị trí có dạng góc đặc trưng mới tạo ra giá trị cao trên bản đồ đặc trưng, trong khi các vị trí khác cho giá trị thấp hơn Điều này chứng tỏ bộ lọc đã phát hiện thành công các góc và cạnh trong dữ liệu đầu vào Việc áp dụng nhiều bộ lọc khác nhau sẽ giúp phát hiện nhiều loại đặc trưng khác nhau, từ đó hỗ trợ trong việc nhận diện đối tượng.
Kích thước bộ filter, stride và padding là những tham số quan trọng của tầng convolution Kích thước bộ filter ảnh hưởng trực tiếp đến số lượng tham số cần học và quyết định receptive field của tầng Bộ filter phổ biến nhất trong các ứng dụng là 3x3.
Kích thước filter nhỏ được ưu tiên lựa chọn thay kích thước lớn vì những lý do sau đây.
Hình 15: Cấu trúc High level feature ex
Kích thước nhỏ thì mỗi lần nhìn được một vùng nhỏ các pixel
Rút trích được đặc trưng có tính cục bộ cao
Các đặc trưng có tính tổng quát hơn
Phát hiện được các đặc trưng nhỏ hơn
Bắt được những phần cơ bản của bức ảnh Đặc trưng rút trích được sẽ đa dạng, hữu ích hơn ở tầng sau
Thông ít rút trích được ít đa dạng
Giảm kích thước ảnh chậm hơn, do đó cho phép mạng sâu hơn
Giảm kích thước ảnh nhanh, do đó chỉ cho phép mạng nông Ít trọng số hơn, chia sẻ trọng số tốt hơn
Chia sẽ trọng số ít ý nghĩa hơn
Kích thước filter trong tầng convolution thường là số lẻ, như 3x3 hoặc 5x5, giúp xác định tâm điểm cho các giá trị của feature map ở tầng trước Việc sử dụng filter có kích thước chẵn như 2x2 hay 4x4 sẽ gây khó khăn trong việc tìm vị trí tương ứng của các giá trị trên không gian ảnh Đặc biệt, filter kích thước 1x1 hoặc bằng kích thước ma trận đầu vào mang lại ý nghĩa thú vị cho tầng convolution.
Cấu trúc của bộ lọc CNN với kích thước 1x1 cho phép tầng convolution xem mỗi điểm như một đặc trưng riêng biệt, giúp giảm hoặc tăng chiều khi số lượng feature map ở tầng sau khác biệt so với tầng trước Bộ lọc 1x1 đã được áp dụng trong các kiến trúc mạng nổi bật như Inception networks Đồng thời, bộ lọc có kích thước bằng ảnh đầu vào thực hiện chức năng tương tự như một lớp fully connected.
Khi sử dụng tham số stride trong quá trình trượt bộ filter qua bức ảnh, bạn cần chú ý đến số pixel mà bạn dịch chuyển mỗi lần Ví dụ, với tham số stride bằng 2, bộ filter sẽ dịch chuyển 2 pixel mỗi khi thực hiện phép convolution.
Hình 17: Mô tả cnn strides
Khi áp dụng phép convolution, kích thước ma trận đầu vào sẽ giảm dần, giới hạn số lượng lớp trong mô hình CNN và không cho phép xây dựng deep nets như mong muốn Để khắc phục vấn đề này, cần sử dụng padding cho ma trận đầu vào nhằm giữ cho kích thước đầu ra sau mỗi tầng convolution không đổi, cho phép xây dựng mô hình với số tầng convolution lớn Phương pháp padding đơn giản và phổ biến nhất là sử dụng số 0, ngoài ra còn có thể áp dụng reflection padding hoặc symmetric padding.
Hình 18: Mô tả cnn padding
Nonlinear Layer ReLU (Rectified Linear Units, f = max(0, x)) là hàm kích hoạt phổ biến nhất cho CNN tại thời điểm hiện tại, được giới thiệu bởi Geoffrey
E Hinton năm 2010 Trước khi hàm ReLU được áp dụng thì những hàm như sigmoid hay tanh mới là những hàm được sử dụng phổ biến Hàm ReLU được ưa chuộng vì tính toán đơn giản, giúp hạn chế tình trạng vanishing gradient, và cũng cho kết quả tốt hơn ReLU cũng như những hàm kích hoạt khác, được đặt ngay sau tầng convolution, ReLU sẽ gán những giá trị âm bằng 0 và giữ nguyên giá trị của đầu vào khi lớn hơn 0.
ReLU, mặc dù phổ biến do hiệu suất tốt, vẫn gặp phải một số vấn đề như không có đạo hàm tại điểm 0 và giá trị có thể tăng vô hạn Nếu trọng số không được khởi tạo cẩn thận hoặc learning rate quá lớn, các neuron có thể rơi vào trạng thái chết, tức là luôn có giá trị nhỏ hơn 0 Ngoài ReLU, còn có các hàm phi tuyến khác như tanh và sigmoid có thể được sử dụng.
Pooling Layer
Sau hàm kích hoạt, thông thường chúng ta sử dụng tầng pooling.
Một số loại pooling layer phổ biến như là max-pooling, average pooling,
Chức năng chính của pooling là giảm chiều của tầng trước đó Với pooling kích thước 2x2, bạn cần trượt filter 2x2 qua các vùng ảnh tương ứng và tính giá trị lớn nhất (max) hoặc giá trị trung bình (average) cho từng vùng Lưu ý rằng max pooling chọn phần tử lớn nhất từ ma trận, trong khi sum pooling tính tổng tất cả các phần tử trong map.
Tầng pooling trong mạng nơ-ron tích chập (CNN) giúp loại bỏ các đặc trưng không cần thiết, chỉ giữ lại vị trí tương đối của các đặc trưng quan trọng để phân loại đối tượng Việc sử dụng tầng pooling có khả năng giảm chiều dữ liệu một cách đáng kể, từ đó hạn chế hiện tượng overfitting và rút ngắn thời gian huấn luyện.
Tầng fully connected layer là tầng cuối cùng trong mô hình CNN dùng để phân loại ảnh, có nhiệm vụ chuyển đổi ma trận đặc trưng từ tầng trước thành vector xác suất cho các đối tượng dự đoán Trong bài toán phân loại số viết tay MNIST, tầng này tạo ra một vector 10 chiều, tương ứng với 10 lớp số từ 0 đến 9, thể hiện xác suất cho từng lớp.
Quá trình huấn luyện mô hình CNN cho phân loại ảnh tương tự như huấn luyện các mô hình khác, yêu cầu có hàm lỗi để tính toán sai số giữa dự đoán và nhãn chính xác Đồng thời, thuật toán backpropagation được sử dụng để cập nhật trọng số trong mô hình.
Nhận diện cảm xúc qua khuôn mặt trong môi trường tự nhiên là lĩnh vực nghiên cứu tích cực, nhưng vẫn đối mặt với nhiều thách thức cần khắc phục Để giải quyết những vấn đề này, các nhà nghiên cứu đã tổ chức cuộc thi nhằm thúc đẩy sự tiến bộ trong lĩnh vực Trong số các thử thách, cuộc thi sử dụng cơ sở dữ liệu FER2013 đã đạt được thành công, với phương pháp CNN là công nghệ chiến thắng trong việc nhận dạng cảm xúc khuôn mặt.
Trong chương này, chúng ta sẽ tìm hiểu về thuật toán nhận dạng gương mặt người thông qua phương pháp Viola-Jones, đồng thời khám phá các khái niệm cơ bản về mạng nơ-ron tích chập (CNN).
• Đầu vào của lớp tích chập là hình ảnh
Chọn đối số và áp dụng các bộ lọc với bước nhảy và padding nếu cần thiết Tiến hành thực hiện tích chập cho hình ảnh và áp dụng hàm kích hoạt ReLU cho ma trận hình ảnh.
• Thực hiện Pooling để giảm kích thước cho hình ảnh.
• Thêm nhiều lớp tích chập sao cho phù hợp
• Xây dựng đầu ra và dữ liệu đầu vào thành 1 lớp được kết nối đầy đủ (Full Connected)
• Sử dụng hàm kích hoạt để tìm đối số phù hợp và phân loại hình ảnh.
Machine learning Workflow
Hình 21: Sơ đồ quy trình để làm việc với machine learning
Cụ thể từng bước trong machine learning workflow như sau như sau:
Để máy tính có thể học hiệu quả, việc thu thập dữ liệu là rất quan trọng Bạn cần có một bộ dữ liệu (dataset) có chất lượng, có thể tự thu thập hoặc sử dụng các bộ dữ liệu đã được công bố Hãy đảm bảo rằng nguồn dữ liệu là chính thống để đảm bảo tính chính xác, giúp máy học đúng đắn và đạt hiệu suất cao hơn.
Tiền xử lý dữ liệu là bước quan trọng để chuẩn hóa thông tin, loại bỏ thuộc tính không cần thiết và gán nhãn cho dữ liệu Quá trình này bao gồm mã hóa các đặc trưng, trích xuất và rút gọn dữ liệu, đảm bảo kết quả vẫn chính xác Thời gian thực hiện bước này thường chiếm hơn 70% tổng thời gian, tỷ lệ thuận với khối lượng dữ liệu mà bạn có.
Huấn luyện mô hình là giai đoạn quan trọng, nơi bạn cho phép mô hình học hỏi từ dữ liệu đã được thu thập và xử lý trong hai bước trước.
Đánh giá mô hình là bước quan trọng sau khi hoàn tất quá trình huấn luyện Chúng ta cần sử dụng các chỉ số đánh giá khác nhau để xác định hiệu suất của mô hình Mô hình được coi là tốt khi đạt độ chính xác trên 80%.
Để cải thiện mô hình, sau khi đánh giá, những mô hình có độ chính xác không đạt yêu cầu cần được huấn luyện lại Quá trình này sẽ được lặp lại từ bước đầu tiên để nâng cao hiệu suất.
3, cho đến khi đạt độ chính xác như kỳ vọng Tổng thời gian của 3 bước cuối rơi vào khoảng 30% tổng thời gian thực hiện.
Khái niệm về dataset - tập dữ liệu
Mọi bài toán học máy đều cần dữ liệu để huấn luyện, điều này được coi là điều kiện tiên quyết Sau khi thu thập dữ liệu, cần thực hiện các bước xử lý và phân tích để đảm bảo chất lượng và tính chính xác của thông tin.
Chuẩn hóa dữ liệu đầu vào là bước quan trọng để máy tính có thể xử lý hiệu quả Quá trình này bao gồm việc số hóa dữ liệu và điều chỉnh các thông số cho phù hợp với bài toán cụ thể Việc chuẩn hóa không chỉ ảnh hưởng đến tốc độ huấn luyện mà còn quyết định hiệu quả của quá trình huấn luyện.
Việc chọn mô hình phù hợp với tập dữ liệu không đảm bảo rằng giả thuyết của chúng ta là chính xác, vì có thể dữ liệu thực tế không khớp Tình huống này trong học máy được gọi là quá khớp (Overfitting) Do đó, trong quá trình huấn luyện, cần phân chia dữ liệu thành ba loại để kiểm chứng mức độ tổng quát của mô hình.
– Tập huấn luyện: Dùng để học khi huấn luyện.
– Tập kiểm chứng: Dùng để kiểm chứng mô hình khi huấn luyện.
– Tập kiểm tra: Dùng để kiểm tra xem mô hình đã phù hợp chưa sau khi huấn luyện.
Trong quá trình huấn luyện mô hình, tập kiểm tra cần được tách riêng và không được sử dụng trong giai đoạn huấn luyện Đồng thời, tập huấn luyện và tập kiểm chứng nên được xáo trộn với nhau để đảm bảo rằng mô hình được huấn luyện với các mẫu ngẫu nhiên nhất có thể.
Ensemble Methods
Phương pháp này kết hợp nhiều kỹ thuật khác nhau để dự đoán kết quả, sau đó tổng hợp kết quả cuối cùng dựa trên trọng số của từng phương pháp.
Vậy phương pháp này hoạt động như thế nào và tại sao nó lại ưu việt hơn các mô hình khác?
Sai số trung bình (bias) là một yếu tố quan trọng trong các phương pháp phân tích, với một số phương pháp mang lại kết quả chính xác và sai số nhỏ, trong khi những phương pháp khác có thể dẫn đến sai số lớn Tổng thể, việc kết hợp nhiều phương pháp thường cho phép đạt được sai số chấp nhận được, thậm chí có thể nhỏ hơn so với việc chỉ sử dụng một phương pháp duy nhất.
Giảm độ phụ thuộc vào tập dữ liệu (variance) thông qua việc tổng hợp ý kiến từ nhiều mô hình giúp giảm nhiễu so với ý kiến của một mô hình đơn lẻ Trong lĩnh vực tài chính, điều này được gọi là đa dạng hóa; một danh mục đầu tư bao gồm nhiều cổ phiếu sẽ có độ biến động thấp hơn so với việc chỉ đầu tư vào một cổ phiếu riêng lẻ.
Giảm thiểu hiện tượng over-fit là một yếu tố quan trọng trong quá trình phát triển mô hình, khi mà mô hình có thể hoạt động xuất sắc trên dữ liệu huấn luyện nhưng lại kém hiệu quả trên dữ liệu kiểm tra Một trong những giải pháp hiệu quả để khắc phục vấn đề này là kết hợp nhiều mô hình cùng lúc, giúp tăng cường độ chính xác và khả năng tổng quát của mô hình.
Hiện tượng underfitting, overfitting
Hiện tượng overfitting xảy ra khi mô hình học quá chi tiết từ bộ dữ liệu huấn luyện, bao gồm cả dữ liệu nhiễu và bất thường Điều này dẫn đến việc các quy luật mà mô hình học được không còn ý nghĩa khi áp dụng cho dữ liệu mới, đặc biệt là khi dữ liệu mới có dạng nhiễu khác Hệ quả là độ chính xác của mô hình sẽ bị ảnh hưởng tiêu cực.
Hiện tượng Overfitting thường xuất hiện trong các mô hình phi tham số hoặc phi tuyến, đặc biệt là những mô hình có độ linh hoạt cao trong việc xây dựng hàm mục tiêu.
Nhiều thuật toán học máy phi tham số sử dụng các thông số và kỹ thuật nhằm hạn chế mức độ học chi tiết của mô hình.
Bài toán cây quyết định là một thuật toán học máy phi tham số, nhưng thường gặp hiện tượng Overfitting Để khắc phục tình trạng này, phương pháp cắt tỉa cây (pruning) có thể được áp dụng nhằm cải thiện hiệu suất của mô hình.
Hiện tượng Underfitting xảy ra khi mô hình xây dựng không đạt độ chính xác cao trong tập dữ liệu huấn luyện và không thể tổng quát hóa với dữ liệu tổng thể Khi đó, mô hình sẽ không hoạt động hiệu quả với bất kỳ bộ dữ liệu nào liên quan đến vấn đề đang được đề cập.
Hiện tượng Underfitting thường ít gặp trong các bài toán Khi xảy ra tình trạng này, có thể khắc phục bằng cách thay đổi thuật toán hoặc bổ sung thêm dữ liệu đầu vào.
Mô hình lý tưởng nằm giữa hiện tượng Underfitting và Overfitting, cho ra kết quả hợp lý cho cả tập dữ liệu huấn luyện và dữ liệu mới Mô hình này có khả năng tổng quát tốt, phù hợp với nhiều mẫu dữ liệu khác nhau, đồng thời vẫn duy trì hiệu suất cao khi áp dụng cho dữ liệu chưa thấy trước đó.
Mục tiêu của mỗi bài toán là đạt được Good Fitting, nhưng việc này thực tế rất khó khăn Để xác định điểm Good Fitting, cần theo dõi hiệu suất của thuật toán học máy theo thời gian trong quá trình học trên bộ dữ liệu huấn luyện Chúng ta có thể mô tả và thể hiện các thông số của mô hình cũng như độ chính xác của nó trên cả tập dữ liệu huấn luyện và tập dữ liệu kiểm tra.
Theo thời gian và quá trình học, sai số của mô hình trên bộ dữ liệu huấn luyện sẽ giảm Tuy nhiên, nếu quá trình training kéo dài, độ chính xác của mô hình có thể bị ảnh hưởng do hiện tượng Overfitting, khi mà mô hình học cả dữ liệu nhiễu và bất thường Kết quả là, sai số trên bộ dữ liệu kiểm định sẽ tăng lên do khả năng tổng quát của mô hình giảm.
Mô hình dự đoán rằng trước khi sai số trên bộ dữ liệu tăng lên, nó hoạt động tốt nhất trên cả dữ liệu huấn luyện và dữ liệu kiểm định.
Việc lựa chọn điểm dừng trong quá trình huấn luyện không thực sự hiệu quả, vì nó yêu cầu phải biết giá trị từ bộ mẫu kiểm định Điều này dẫn đến việc bộ dữ liệu kiểm định không còn được xem là “unseen” hay độc lập với bộ dữ liệu huấn luyện, gây ra hiện tượng rò rỉ dữ liệu trong quy trình huấn luyện.
Hai kỹ thuật hiệu quả để xác định điểm dừng tối ưu trong quá trình huấn luyện là kỹ thuật lấy lại mẫu (resampling methods) và kỹ thuật validation.
Vậy làm thế nào để giảm Overfitting?
Cả Overfitting và Underfitting đều ảnh hưởng tiêu cực đến độ chính xác của mô hình Tuy nhiên, hiện nay, Overfitting đang trở thành vấn đề phổ biến hơn trong việc xây dựng mô hình.
Overfitting là một vấn đề quan trọng trong học máy, vì việc đánh giá mô hình trên bộ dữ liệu huấn luyện thường khác với độ chính xác của mô hình khi áp dụng cho dữ liệu mới mà nó chưa từng gặp.
Có hai kỹ thuật quan trọng trong việc đánh giá mô hình học máy và tránh hiện tượng overfitting:
• Sử dụng kỹ thuật lấy lại mẫu để ước lượng độ chính xác của mô hình
• Sử dụng tập Validation test
Kỹ thuật lấy lại mẫu (resampling methods) rất phổ biến, trong đó dữ liệu được chia thành k tập con, được gọi là k-fold cross validation Phương pháp này cho phép huấn luyện mô hình trên các tập dữ liệu khác nhau k lần, từ đó giúp ước lượng độ chính xác của mô hình học máy khi áp dụng vào dữ liệu mới.
Phương pháp đánh giá mô hình
Khi xây dựng mô hình học máy, việc đánh giá hiệu quả của mô hình là rất quan trọng để so sánh khả năng của các mô hình khác nhau Hiệu năng thường được kiểm tra dựa trên tập dữ liệu kiểm thử, vì tập này không chứa dữ liệu đã được huấn luyện trước đó Cụ thể, đầu ra của mô hình khi sử dụng tập kiểm thử sẽ tạo thành một vector dự đoán, trong đó mỗi phần tử tương ứng với nhãn dự đoán của một điểm dữ liệu trong tập kiểm thử.
Chúng ta sẽ tiến hành so sánh giữa vector dự đoán và vector chứa nhãn thật của dữ liệu Phương pháp đầu tiên là dựa vào tỉ lệ trùng nhãn, đây là cách đánh giá đơn giản và tự nhiên nhất, thường được sử dụng trong thực tế Cách này tính toán tỉ lệ giữa số lượng dữ liệu được dự đoán chính xác và tổng số dữ liệu trong tập kiểm thử.
Accuracy= Tổng số dữ liệu đầu vào dự đoán đúng
Tổng số dữ liệu đầu vào b) Ma trận nhầm lẫn (confusion matrix)
Ma trận nhầm lẫn là một trong những kỹ thuật đo lường hiệu suất phổ biến nhất và được sử dụng rộng rãi cho các mô hình phân loại.
Hình 25: Minh họa ma trận nhầm lẫn
Chúng ta có thể học được gì từ Ma trận này?
Có hai cách phân loại sự kiện: "có" và "không." Nếu dự đoán sự hiện diện của một sự kiện, "có" chỉ ra rằng sự kiện đó đã xảy ra, trong khi "không" cho thấy sự kiện đó đã không xảy ra.
• Mô hình đã thực hiện tổng cộng 100 dự đoán về một sự kiện
• Trong số 100 kết quả đó, mô hình dự đoán "có" 45 lần và "không"
55 lần Trong khi đó, trong thực tế, 60 lần sự kiện được đề cập đã xảy ra và 40 lần thì không. Điều cơ bản cần ghi nhớ
• True positive (TP): Đây là những sự kiện được mô hình dự đoán chính xác là "xảy ra = Có".
• Tiêu cực thực sự (TN): Đây là những sự kiện được mô hình dự đoán chính xác là "không xảy ra = Không."
• Sai tích cực (FP): Đây là những sự kiện được dự đoán là "xảy ra Có", nhưng trong thực tế, nó "không xảy ra = Không."
• Âm tính giả (FN): Điều này trái ngược với FP, tức là được dự đoán là "không xảy ra = Không", nhưng trong thực tế, nó đã "xảy ra Có".
Làm thế nào các số liệu này được tính toán cho phân loại nhị phân
• Độ chính xác: Nhìn chung, phân loại dự đoán thường xuyên như thế nào?
• Nhìn chung, mức độ thường xuyên là sai?
100 = 15% Điều này tương đương với 1 trừ đi Độ chính xác.
• Tỷ lệ tích cực thực: Các sự kiện được mô hình dự đoán chính xác là "xảy ra = Có".
40 = 87%(còn gọi là "Nhớ lại" hoặc "Độ nhạy")
• Tỷ lệ dương tính giả: Các sự kiện được dự đoán là "xảy ra = Có", nhưng trong thực tế, đó là "không xảy ra = Không".
• Tính cụ thể: Khi một sự kiện thực sự được xác nhận là "không" và nó thực sự là "không".
• Chính xác: Khi một sự kiện được dự đoán là "có", mức độ thường xuyên là đúng?
• Tỷ lệ: Mức độ thường xuyên xảy ra sự kiện "có" trong mẫu?
Có thực tế Tổng cộng = 40
100 = 40% Điều khoản chính đáng để biết
Giá trị dự đoán tích cực (PPV) phản ánh khả năng chính xác của một mô hình, đặc biệt khi các lớp dữ liệu được phân bổ đồng đều với tỷ lệ 50% Trong tình huống này, PPV và độ chính xác sẽ có giá trị tương đương, cho thấy mức độ hiệu quả của mô hình trong việc dự đoán các kết quả tích cực.
Tỷ lệ lỗi Null là chỉ số phản ánh tần suất sai sót khi luôn dự đoán lớp đa số trong một tập dữ liệu Ví dụ, nếu tỷ lệ lỗi null là 60%, điều này có nghĩa là khi dự đoán "có", sẽ có 60 trường hợp "không" bị sai Chỉ số này có thể được sử dụng làm thước đo cơ bản để so sánh hiệu suất của các mô hình phân loại khác nhau Tuy nhiên, cần lưu ý rằng một số trình phân loại tốt nhất cho từng ứng dụng cụ thể có thể có tỷ lệ lỗi cao hơn tỷ lệ lỗi null.
• Điểm F: Đây là trung bình có trọng số của độ chính xác thực (thu hồi) và độ chính xác.
Đường cong ROC thể hiện tỷ lệ dương thực sự so với tỷ lệ dương tính giả ở các điểm cắt khác nhau, cho thấy sự đánh đổi giữa độ nhạy và độ đặc hiệu Khi độ nhạy tăng lên, độ đặc hiệu có thể giảm xuống Đường cong càng gần với cạnh trái và cạnh trên cùng của biểu đồ ROC, độ chính xác của thử nghiệm càng cao.
Phương pháp nhận diện khuôn mặt với Haar Cascades
Giới thiệu thuật toán Viola Jones
Viola-Jones là một phương pháp tiên tiến cho việc phát hiện đối tượng, cho phép xử lý lên tới 15 khung hình mỗi giây, và là công nghệ đầu tiên đạt được khả năng phát hiện đối tượng trong thời gian thực Nhiều nhà sản xuất máy ảnh như Canon và Samsung đã tích hợp công nghệ này vào sản phẩm của họ Phương pháp phát hiện khuôn mặt của Viola và Jones được giới thiệu vào năm 2002 và hiện đã được cài đặt trong OpenCV.
Trong bài toán này, mỗi bức ảnh được xử lý bởi detector thông qua thuật toán sliding window với kích thước cố định ở nhiều tỉ lệ khác nhau Quy trình này sử dụng các đặc trưng Haar và áp dụng chúng qua nhiều lượt (cascade) để xây dựng một hệ thống nhận diện hoàn chỉnh.
• Tạo ra một frame hình vuông, lần lượt di chuyển frame này khắp tấm ảnh gốc: scan and sliding window.
Hình 26: Minh họa sliding window
Mỗi khi khung hình di chuyển, cần kiểm tra xem khu vực trong khung có phải là khuôn mặt hoặc đồ vật hay không, thông qua việc phân tích các vùng sáng tối trong khung hình.
• Sau khi di chuyển hết tấm ảnh, tăng kích cỡ frame lên và scan lại từ đầu.
• Dừng thuật toán khi frame đủ lớn.
Các thuật ngữ quan trọng trong lĩnh vực nhận diện khuôn mặt bao gồm Haar Feature và Adaboost Training Để phát triển một hệ thống nhận diện khuôn mặt hiệu quả, cần phải huấn luyện với hàng nghìn đến hàng chục nghìn hình ảnh, nhằm xác định các đặc điểm đặc trưng của khuôn mặt con người.
Haar like
Tính năng Haar, được Alfred Haar đề xuất vào năm 1909, là các đặc điểm quan trọng trong nhận diện khuôn mặt Chúng tương tự như các hạt nhân tích tụ và có nhiều loại khác nhau Tuy nhiên, những tính năng nổi bật nhất trong số đó được sử dụng rộng rãi trong các ứng dụng nhận diện khuôn mặt.
• 2 tính năng Haar hình chữ nhật
• 3 tính năng Haar hình chữ nhật
• 4 tính năng Haar hình chữ nhật
Hình ảnh tích phân
Việc sử dụng các tính năng giống như haar ở nhiều kích thước và vị trí khác nhau dẫn đến hàng nghìn tính năng cần tính toán, tạo ra một khối lượng công việc lớn Vấn đề chính trong tính toán các đối tượng địa lý là cần tính giá trị trung bình của một khu vực nhiều lần, với độ phức tạp thời gian là O(n * n) Tuy nhiên, chúng ta có thể áp dụng phương pháp tiếp cận hình ảnh tích phân để giảm thời gian chạy xuống O(1) Cụ thể, một pixel trong hình ảnh tích phân là tổng của tất cả các pixel bên trái và bên trên nó.
Hình 28: Minh hoạ hình ảnh tích phân
Tính toán các tính năng Haar like với Hình ảnh Tích hợp
Sử dụng hình ảnh tích phân, chúng tôi có thể đạt được đánh giá thời gian liên tục của các tính năng Haar.
• Các Tính năng Cạnh hoặc 2 Tính năng Hình chữ nhật chỉ yêu cầu 6 lần tra cứu bộ nhớ
• Tính năng Đường thẳng hoặc Tính năng 3 Hình chữ nhật chỉ cần 8 lần tra cứu bộ nhớ.
• Tính năng Đường chéo hoặc Tính năng 4 Hình chữ nhật chỉ yêu cầu 9 lần tra cứu bộ nhớ.
Hình 29: Kỹ thuật tính tổng các vùng để tính toán các đối tượng địa lý trong một khoảng thời gian không đổi.
Kỹ thuật Boosting là một phương pháp học máy, trong đó nhiều thuật toán học, chẳng hạn như cây quyết định, được xây dựng đồng thời và kết hợp lại Mục tiêu của Boosting là tạo ra một nhóm các weak learner và kết hợp chúng để hình thành một strong learner duy nhất, giúp cải thiện độ chính xác của mô hình.
AdaBoost
AdaBoost (Adaptive Boost) là một thuật toán học máy mạnh mẽ, giúp xây dựng một bộ phân loại mạnh bằng cách lựa chọn những đặc trưng tốt từ các bộ phân loại yếu và kết hợp chúng một cách tuyến tính thông qua trọng số Thuật toán này cải thiện độ chính xác dần dần bằng cách áp dụng hiệu quả một chuỗi các bộ phân loại yếu.
Sơ đồ cơ bản về Adaboost:
Hình 30: Sơ đồ cơ bản về Adaboost
Các tính năng mạnh mẽ được phát triển thành một bộ phân loại nhị phân, trong đó các kết quả tích cực sẽ được chuyển tiếp đến tính năng tiếp theo, trong khi các kết quả phủ định sẽ bị loại bỏ và không tiếp tục trong quá trình tính toán.
• Giảm thời gian tính toán trên các cửa sổ sai.
Giá trị ngưỡng có thể được điều chỉnh để cải thiện độ chính xác trong quá trình phát hiện Việc thiết lập ngưỡng thấp hơn sẽ tăng cường khả năng phát hiện, nhưng đồng thời cũng dẫn đến việc gia tăng số lượng dương tính giả.
Sử dụng AdaBoost vì đây là một thuật toán đơn giản, dễ cài đặt và có tốc độ học nhanh Các weak learner trong thuật toán này đơn giản hơn nhiều so với strong learner, giúp cải thiện hiệu suất và tốc độ chạy của thuật toán.
AdaBoost là phương pháp điều chỉnh các classifier một cách tinh tế, nhờ vào việc tối ưu hóa trọng số cho các learner hiệu quả qua từng hiệp Để đạt được kết quả tốt nhất, bạn chỉ cần xác định số hiệp cần lặp lại.
AdaBoost là một thuật toán linh hoạt và đa năng, có khả năng kết hợp với bất kỳ thuật toán học máy nào Nó có thể xử lý một lượng lớn dữ liệu đa dạng, mang lại hiệu quả cao trong việc cải thiện độ chính xác của mô hình.
Thuật toán Adaboost hoạt động trên một tập dữ liệu được gán nhãn x = {(x₁, y₁), , (xₙ, yₙ)}, trong đó mỗi cặp (xᵢ, yᵢ) thuộc X × {-1, +1} Phân phối trong vòng lặp thứ t, ký hiệu là Dₜ, bắt đầu với D₁ là phân phối đều Mỗi bộ phân loại cơ sở hₜ ∈ H được chọn nhằm tối thiểu hóa độ lỗi trên tập huấn luyện đã được tính lại trọng số, được xác định bởi công thức: hₜ ∈ argminₕ∈H Pᵢ∼Dₜ[hₜ(xᵢ) ≠ yᵢ] = argminₕ∈H Pₘᵢ=₁ Dₜ(i) 1[h(xᵢ) ≠ yᵢ].
Với Z t là thừa số để chuẩn hoá sao cho tổng các trọng số trên phân phối
Dữ liệu đầu vào của quy trình này là một bức ảnh, trong khi dữ liệu đầu ra sẽ cung cấp vị trí và kích thước của các khuôn mặt xuất hiện trong bức ảnh đó.
Toán học
Xác suất thống kê: khái niệm cơ bản, xác suất độc lập, xác suất có điều kiện, định lý Bayes
suất có điều kiện, định lý Bayes
Xác suất là một lĩnh vực rộng lớn và phức tạp, vì vậy việc tổng hợp toàn bộ kiến thức cơ bản trong một bài viết là điều khó khăn Do đó, tôi sẽ chọn lọc những phần quan trọng để trình bày Những nội dung này sẽ được áp dụng trong các bài viết tiếp theo về phân tích thuật toán ngẫu nhiên.
Những khái niệm cơ bản về không gian xác suất:
Definition 1: Một không gian xác suất bao gồm 3 thành phần:
– Một không gian mẫuΩ:là một tập các kết quả có thể của một quá trình ngẫu nhiên được mô hình hóa bởi không gian xác đó.
– Sự kiện: mỗi sự kiện có thể được coi là một tập con củaΩ Tập các sự kiện được kí hiệu là F.
– Một hàm xác suất: Pr :F →R thỏa mã những điều kiện sau:
∗ Với mỗi sự kiệnE, 0≤Pr[E]≤1;
∗ Với mỗi tập hữu hạn hoặc đếm được các sự kiệnE 1 , E 2 , ,đôi một không giao nhau
Pr[∪i≥1Ei] =P i≥1Pr[Ei] Definition 2: Hai sự kiệnE 1 , E 2 được gọi là độc lập nếu:
Pr[E 1 ∩E 2 ] = Pr[E 1 ]ãPr[E 2 ] Tương tự như vậy, các sự kiện E1, E2, , En được gọi là độc lập nếu:
Definition 3: Xác xuất có điều kiện của một sự kiệnE khi biết sự kiện
Phân loại Bayes là một phương pháp phân loại xác suất đơn giản, sử dụng định lý Bayes và giả định rằng các đặc tính là độc lập với nhau.
– P(A/B) : Xác suất có điều kiện
Naive Bayes là một thuật toán phổ biến nhờ vào tính đơn giản trong tính toán và tốc độ huấn luyện nhanh Thuật toán này thường được áp dụng cho nhiều bài toán khác nhau trong lĩnh vực học máy.
– Dự đoán trong thời gian thực (Real time Prediction)
– Phân loại văn bản (Text classification)
– Lọc thư rác (Spam Filtering)
Norms-chuẩn
Trong không gian một chiều, khoảng cách giữa hai điểm được tính bằng trị tuyệt đối của hiệu giữa hai giá trị Trong không gian hai chiều, chúng ta sử dụng khoảng cách Euclid, hay còn gọi là khoảng cách "đường chim bay", để đo khoảng cách giữa hai điểm trên mặt phẳng Tuy nhiên, trong thực tế, việc di chuyển từ điểm này đến điểm kia không phải lúc nào cũng theo đường chim bay, mà còn phụ thuộc vào hình dạng của các con đường nối giữa hai điểm.
Việc đo khoảng cách giữa hai điểm dữ liệu nhiều chiều, hay hai vector, đóng vai trò quan trọng trong Machine Learning Điều này giúp xác định điểm gần nhất so với một điểm khác, đánh giá độ chính xác của các ước lượng, và áp dụng trong nhiều trường hợp khác nhau.
Khái niệm norm (chuẩn) ra đời nhằm xác định khoảng cách giữa hai vector Có nhiều loại norm khác nhau, và để đo khoảng cách giữa hai vector x và y, người ta thường áp dụng một hàm số lên vector hiệu x = y − z Hàm số này cần có một số tính chất đặc biệt để đảm bảo tính chính xác trong việc đo lường.
Một hàm sốf()ánh xạ một điểmxtừ không giann chiều sang tập số thực một chiều được gọi là norm nếu nó thỏa mãn ba điều kiện sau đây:
Ví dụ về chuẩn: khoảng cách Euclid chính là một norm, norm này thường được gọi là norm 2:
||x|| 2 q x 2 1 +x 2 2 + x 2 n (1) Với p là một số không nhỏ hơn 1 bất kỳ, hàm số sau đây:
Norm p được định nghĩa bởi công thức ||x|| p = (|x 1 | p +|x 2 | p + +|x n | p )^(1/p) và thỏa mãn ba điều kiện cơ bản Khi p tiến tới 0, biểu thức này trở thành số lượng các phần tử khác 0 trong vector x, và được gọi là giả chuẩn 0 (pseudo-norm 0) Mặc dù giả chuẩn này không phải là norm vì không đáp ứng đủ điều kiện 2 và 3, nhưng nó lại rất quan trọng trong Machine Learning, đặc biệt trong các bài toán yêu cầu tính "sparse" của các thành phần.
Có một vài giá trị của p thường được dùng:
• Khi p=2 chúng ta có norm 2 như ở trên
||x||1 =|x1|+|x2|+ .|xn| (3) là tổng các trị tuyệt đối của từng phần tử của x Norm 1 thường được dùng như xấp xỉ của norm 0 trong các bài toán có ràng buộc “sparse”.
Chuẩn của ma trận là một khái niệm quan trọng trong toán học, đặc biệt là với ma trận A thuộc R m×n Chuẩn Frobenius, ký hiệu là ||A|| F, là loại chuẩn thường được sử dụng, được định nghĩa là căn bậc hai của tổng bình phương tất cả các phần tử trong ma trận.
Đạo hàm của hàm nhiều biến
Trong phần này, chúng ta sẽ giả định rằng các đạo hàm tồn tại và xem xét hai trường hợp: đầu tiên, hàm số có giá trị là ma trận (vector) và trả về một số thực vô hướng; thứ hai, hàm số có giá trị là một số vô hướng hoặc vector và trả về một vector Đạo hàm (gradient) của hàm số f(x) : R n → R theo vector x được định nghĩa như sau:
Trong không gian R^n, đạo hàm ∂f/∂x_i của hàm số f theo thành phần thứ i của vector x được tính với giả định rằng tất cả các biến khác đều giữ hằng số.
Nếu không có biến bổ sung trong hàm số, ký hiệu ∇ x f(x) thường được rút gọn thành ∇f(x) Cần lưu ý rằng đạo hàm của hàm số này là một vector có cùng chiều với vector được lấy đạo hàm Điều này có nghĩa là nếu vector được biểu diễn dưới dạng cột, thì đạo hàm cũng phải được viết dưới dạng cột.
Để tổng quát hóa, chúng ta giả sử biến đầu vào là một ma trận, trong đó vector và số thực là các trường hợp đặc biệt của ma trận Các hàm số cần có chiều phù hợp để thực hiện các phép nhân.
= (∇f(X))g(X) + (∇g(X))f(X) (14) Biểu thức này giống như biểu thức chúng ta đã quá quen thuộc:
Chú ý rằng với vector và ma trận, chúng ta không được sử dụng tính chất giao hoán.
• Chain rules Khi có các hàm hợp thì:
∇Xg(f(X)) =∇Xf T ∇fg (15) Quy tắc này cũng giống với quy tắc trong hàm một biến:
Nhắc lại rằng khi tính toán với ma trận, chúng ta cần chú ý tới chiều của các ma trận, và nhân ma trận không có tính chất giao hoán.
Bảng các đạo hàm thường gặp:Cho vector f(x) ∇f(x) a T x a x T Ax (A+A T )x x T x=||x|| 2 2 2x
||Ax−b|| 2 2 2A T (Ax−b) a T x T xb 2a T bx a T xx T b (ab T +ba T )x
Cho ma trận f(x) ∇f(x) a T X T Xb X(ab T +ba T ) a T XX T b X(ab T +ba T ) a T YX T b ba T Y a T Y T Xb Yab T a T X T Yb Yba T
Ngôn ngữ lập trình
Python
"Các lập trình viên có thể dành thời gian và trí lực của mình vào việc giải quyết các vấn đề liên quan đến Học máy, thay vì phải lo lắng về các kỹ thuật của ngôn ngữ lập trình."
Python là một ngôn ngữ lập trình bậc cao đa năng, được Guido van Rossum phát triển và ra mắt lần đầu vào năm 1991 Với ưu điểm nổi bật về tính dễ đọc, dễ học và dễ nhớ, Python là lựa chọn lý tưởng cho những người mới bắt đầu lập trình Ngôn ngữ này có cấu trúc rõ ràng, giúp người dùng viết mã lệnh hiệu quả với số lần gõ phím tối thiểu Python hiện đang được sử dụng rộng rãi trong phát triển trí tuệ nhân tạo (AI) Vào tháng 7 năm 2018, Guido van Rossum đã từ chức lãnh đạo cộng đồng Python sau 30 năm cống hiến.
Python là ngôn ngữ lập trình hoàn toàn động, với cơ chế cấp phát bộ nhớ tự động, tương tự như các ngôn ngữ như Perl, Ruby, Scheme, Smalltalk, và Tcl Ngôn ngữ này được phát triển trong một dự án mã nguồn mở, dưới sự quản lý của tổ chức phi lợi nhuận Python Software Foundation.
Python ban đầu được phát triển cho hệ điều hành Unix, nhưng theo thời gian, nó đã mở rộng và trở thành một ngôn ngữ lập trình phổ biến trên nhiều hệ điều hành khác nhau, từ MS-DOS đến Mac.
Python là một ngôn ngữ lập trình mạnh mẽ, được phát triển với sự đóng góp của nhiều cá nhân, nhưng Guido van Rossum vẫn là tác giả chủ yếu và giữ vai trò quan trọng trong việc định hướng phát triển của ngôn ngữ này Các hệ điều hành như OS, OS/2, Windows, Linux và các hệ điều hành thuộc họ Unix đều hỗ trợ Python, làm cho ngôn ngữ này trở nên linh hoạt và phổ biến trong nhiều môi trường lập trình khác nhau.
• Clean - ít ký tự đặc biệt làm code dài đơn cử là dấu
• Cộng đồng hỗ trợ lớn
• Có nhiều lựa chọn về Thư viện và Framework
Thư viện hỗ trợ
Trong quá trình phát triển phần mềm, việc triển khai nhiều đoạn mã và thuật toán là cần thiết để phân tích và tổng hợp dữ liệu, đồng thời làm nền tảng cho phần mềm hoạt động Tuy nhiên, với quy mô chương trình lớn, khối lượng phép toán tăng lên đáng kể, khiến cho việc tính toán thủ công không còn hiệu quả TensorFlow ra đời như một giải pháp hỗ trợ tính toán, giúp người dùng tiếp cận các phép toán phức tạp một cách mạnh mẽ và hiệu quả hơn Nhờ TensorFlow, toán học được đơn giản hóa thông qua các đồ thị luồng dữ liệu, tạo điều kiện thuận lợi cho việc phát triển phần mềm.
• Keras, TensorFlow, and Scikit-learn cho Học máy Nguồn gốc, và đặc điểm của Tensorflow:
TensorFlow ra mắt vào năm 2015 với mục tiêu hỗ trợ các thành viên trong nhóm phát triển phần mềm hợp tác hiệu quả trên các mô hình A.I Đến năm 2017, TensorFlow đã trải qua quá trình cải tiến và trở thành phiên bản ổn định nhất, mang lại hiệu suất vượt trội cho người dùng.
– Khả năng phân tích abstraction một cách tổng quan nhất.
TensorFlow xử lý nhanh chóng và tự động các bước nhỏ như triển khai thuật toán và chuyển đổi input thành output Điều này giúp người dùng giảm đáng kể khối lượng công việc, cho phép họ tập trung vào việc phát triển tính logic tổng thể của ứng dụng mà không phải bận tâm đến những chi tiết không quan trọng.
Google đang tích cực phát triển phần mềm hỗ trợ cho Tensorflow, cho phép người dùng tăng tốc độ xử lý đám mây bằng silicon TPU Bên cạnh đó, người dùng cũng có thể chia sẻ các mô hình mới cho framework thông qua một kênh trực tuyến.
TensorFlow là một công cụ mạnh mẽ giúp đơn giản hóa việc xây dựng phần mềm bằng cách tự động xử lý các thuật toán phức tạp Hiểu về TensorFlow không khó như nhiều người nghĩ, và nó mang lại hiệu quả cao trong việc phát triển ứng dụng.
NumPy là một thư viện quan trọng trong Python, chuyên phục vụ cho phân tích dữ liệu và tính toán khoa học hiệu năng cao Thư viện này hỗ trợ xử lý các mảng nhiều chiều lớn, cho phép áp dụng các hàm tối ưu lên chúng Đặc biệt, NumPy rất hữu ích trong việc thực hiện các phép toán liên quan đến Đại Số Tuyến Tính.
SciPy, phần mềm nguồn mở cho toán học, khoa học và kỹ thuật, được phát triển dựa trên thư viện NumPy, mang đến khả năng thao tác mảng N chiều một cách nhanh chóng và thuận tiện Thư viện này bao gồm nhiều gói con cho các lĩnh vực như đại số tuyến tính, tối ưu hóa, tích hợp và thống kê, hỗ trợ mạnh mẽ cho các tác vụ tính toán nâng cao.
NumPy và SciPy rất dễ sử dụng, mạnh mẽ và được nhiều nhà khoa học và kỹ sư hàng đầu thế giới lựa chọn.
– SciPy chứa nhiều loại gói phụ giúp giải quyết vấn đề phổ biến nhất liên quan đến tính toán khoa học.
– SciPy là thư viện Khoa học được sử dụng nhiều nhất chỉ sau Thư viện Khoa học GNU cho C/C ++ hoặc Matlab.
– Dễ sử dụng và hiểu cũng như sức mạnh tính toán nhanh.
– Nó có thể hoạt động trên mảng (array) của thư viện NumPy.
Pandas là thư viện mã nguồn mở hiệu suất cao dành cho phân tích dữ liệu trong Python, được phát triển bởi Wes McKinney vào năm 2008 Chỉ sau hơn 1 năm phát triển, Pandas đã trở thành thư viện tiêu chuẩn cho phân tích dữ liệu trong Python, với nhiều tính năng nổi bật.
– Có thể xử lý tập dữ liệu khác nhau về định dạng: chuỗi thời gian, bảng không đồng nhất, ma trận dữ liệu
– Khả năng import dữ liệu từ nhiều nguồn khác nhau như CSV, DB/SQL
– Có thể xử lý vô số phép toán cho tập dữ liệu: subsetting, slicing, filtering, merging, groupBy, re-ordering, and re-shaping,
– Xử lý dữ liệu mất mát theo ý người dùng mong muốn: bỏ qua hoặc chuyển sang 0
– Xử lý, phân tích dữ liệu tốt như mô hình hoá và thống kê
– Tích hợp tốt với các thư viện khác của python
– Cung cấp hiệu suất tốt và có thể tăng tốc thậm chí hơn cả sử dụng Cython ( extension C cho python)
Lợi ích của việc sử dụng pandas so với sử dụng các ngôn ngữ Java,
Biểu diễn dữ liệu trở nên dễ dàng và tự nhiên hơn với cấu trúc DataFrame và Series, giúp phù hợp với dữ liệu phân tích So với các ngôn ngữ lập trình khác, việc sử dụng các cấu trúc này yêu cầu ít mã lệnh hơn.
Tập hợp và lọc dữ liệu là những phương thức quan trọng giúp đơn giản hóa quá trình phân tích dữ liệu Những thủ tục này không chỉ tiết kiệm thời gian mà còn nâng cao độ chính xác trong việc xử lý thông tin.
API ngắn gọn và rõ ràng giúp người dùng tập trung vào mục tiêu chính, thay vì phải viết mã dài từ đầu để hoàn thành công việc.
Seaborn là một thư viện Python nổi bật trong lĩnh vực trực quan hóa dữ liệu, giúp tạo ra những hình ảnh đẹp mắt và dễ hiểu Được phát triển dựa trên Matplotlib, Seaborn cung cấp các công cụ mạnh mẽ để nâng cao khả năng trực quan hóa, làm cho việc phân tích dữ liệu trở nên sinh động và trực quan hơn.
Công cụ hỗ trợ
Anaconda là nền tảng mã nguồn mở phổ biến nhất cho Khoa học dữ liệu trên Python, được sử dụng bởi hơn 6 triệu người Đây là công cụ nhanh chóng và dễ dàng để học Khoa học dữ liệu với Python hoặc R trên các hệ điều hành Windows, Linux và Mac.
OS X Được tích hợp sẵn Python và Jupyter Notebook Bạn có thể tải về tại trang chủ của Anaconda: https://www.anaconda.com/download/.
* Khuyến khích bạn tải về phiên bản Python 3.7.
Hình 34: Cài đặt AnacondaQuá trình cài đặt khá đơn giản, bạn chỉ việc nhấn Next màn hình như trên, tick chọn cả 2 ô và bấm Install.
Sau khi cài đặt, bạn mở Command Prompt/Terminal lên để kiểm tra quá trình cài đặt có thành công hay không bằng 3 lệnh sau:
Hình 35: Kiểm tra version OpenCV-Anaconda-Navigator
Sử dụng câu lệnh pip Bạn mở Command Propmt/Terminal và chạy lệnh sau:
# pip install opencv-python dlib
• Sau khi cài đặt mọi thứ hoàn tất, bạn có thể khởi động Jupyter Notebook với lệnh sau:
Sau khi khởi động, Jupyter Notebook sẽ mở tự động trong trình duyệt Để tạo một Notebook mới, bạn chỉ cần chọn New và sau đó chọn Python 3.
Hình 38: Tìm hiểu layout Jupyter notebook
Tổng kết
Thông qua chương này, chúng ta đã tìm hiểu về những thuật ngữ trong xây dựng mô hình học máy.
Overfitting là hiện tượng xảy ra khi một mô hình học máy đạt độ chính xác cao trên bộ dữ liệu huấn luyện nhưng lại có độ chính xác thấp khi áp dụng vào bộ dữ liệu mới hoặc tổng thể Điều này cho thấy mô hình đã học quá mức từ dữ liệu huấn luyện, dẫn đến việc không thể tổng quát tốt cho các dữ liệu chưa thấy.
• Underfitting: khi mô hình có độ chính xác thấp trên cả bộ dữ liệu huấn luyện và bộ dữ liệu mô tả tổng thể mới.
• Một số công thức toán học
2 Chương 2 Lựa chọn phương pháp nhận diện cảm xúc
Mô tả dữ liệu đầu vào
Trong các dự án machine learning và data mining, dữ liệu đầu vào đóng vai trò quan trọng quyết định chất lượng kết quả Dù thuật toán có tốt đến đâu, nếu thiếu dữ liệu mẫu đủ số lượng và chất lượng, hiệu quả sẽ không đạt yêu cầu Để nhận diện chính xác, cần thu thập dữ liệu về tên idol và hình ảnh của họ, với số lượng càng lớn càng tốt để đào tạo máy học.
Hình 40: Ảnh mẫu trong tập dữ liệu
The FER2013 database, introduced during the ICML 2013 Challenges in Representation Learning, is a widely recognized dataset featuring 35,887 grayscale images of faces, each measuring 48×48 pixels This dataset encompasses seven emotion categories: Angry, Disgust, Fear, Happy, Sad, Surprise, and Neutral.
Dữ liệu được thu thập từ API tìm kiếm hình ảnh của Google cho thấy bộ dữ liệu FER2013 cung cấp 35,887 ảnh phục vụ nghiên cứu Tuy nhiên, con số này vẫn được coi là hạn chế trong lĩnh vực deep learning Để giải quyết bài toán nhận diện cảm xúc, tôi đã phải tìm kiếm trên nhiều trang web lớn nhỏ để thu thập thêm dữ liệu Sau khi tìm được, tôi đã sử dụng Python để tải ảnh về.
Dữ liệu được chia thành:
• Tập huấn luyện (Training set): chiếm 80% dùng để học khi huấn luyện.
• Tập kiểm chứng (Cross validation set): chiếm 20% dùng để kiểm chứng mô hình huấn luyện.
Phương pháp truyền thống - SVM
Ví dụ với bài toán phân chia hai classes
Giả sử có hai lớp khác nhau trong không gian nhiều chiều, và chúng có thể phân tách tuyến tính, nghĩa là tồn tại một siêu phẳng phân chia chính xác hai lớp Mục tiêu là tìm siêu phẳng sao cho tất cả các điểm của một lớp nằm về một phía và ngược lại với các điểm của lớp còn lại Thuật toán PLA có khả năng thực hiện nhiệm vụ này, nhưng nó có thể tạo ra nhiều nghiệm khác nhau.
Hình 41: Các mặt phân cách hai classes linearly separable.
Câu hỏi đặt ra là tìm kiếm mặt phân chia tốt nhất giữa các lớp dữ liệu Trong Hình 1, hai đường thẳng phân chia nghiêng về lớp hình tròn đỏ, có thể gây cảm giác không công bằng cho lớp này Vậy có cách nào để xác định đường phân chia công bằng, mang lại sự hài lòng cho cả hai lớp hay không?
Chúng ta cần tìm một tiêu chuẩn để đo sự hạnh phúc của mỗi class Hãy xem 2 hình dưới đây:
Hình 42: Margin của hai classes là bằng nhau và lớn nhất có thể.
Hình 43: Margin của hai classes là bằng nhau và lớn nhất có thể.
Nếu mức độ hạnh phúc của một lớp được xác định tỷ lệ thuận với khoảng cách gần nhất từ một điểm trong lớp đó đến đường hoặc mặt phân chia, thì hình ảnh minh họa sẽ cho thấy rõ mối liên hệ này.
Hai lớp tròn đỏ sẽ không đạt được hạnh phúc cao do đường phân chia gần hơn so với lớp vuông xanh Để đảm bảo công bằng, cần có một đường phân chia sao cho khoảng cách từ điểm gần nhất của mỗi lớp tới đường này là như nhau, được gọi là margin (lề) Tuy nhiên, chỉ có công bằng thôi chưa đủ, vì nếu cả hai lớp đều không hạnh phúc thì chưa thể coi là văn minh.
Khi khoảng cách từ đường phân chia tới các điểm gần nhất của mỗi lớp là như nhau, chúng ta cần xem xét hai cách phân chia: một bằng đường nét liền màu đen và một bằng đường nét đứt màu lục Đường nét liền màu đen sẽ tạo ra một margin rộng hơn, do đó, nó sẽ làm cho cả hai lớp hạnh phúc hơn.
Việc mở rộng margin sẽ cải thiện hiệu ứng phân lớp, tạo ra sự phân chia rõ ràng hơn giữa hai lớp Điều này đóng vai trò quan trọng, giúp Support Vector Machine đạt được hiệu quả phân loại tốt hơn so với Neural Network chỉ với một lớp, cụ thể là Perceptron Learning Algorithm.
Bài toán tối ưu trong Support Vector Machine (SVM) tập trung vào việc tìm kiếm đường phân chia với margin lớn nhất, lý do SVM được gọi là Maximum Margin Classifier Tên gọi Support Vector Machine sẽ được giải thích rõ hơn trong bài viết này.
Hệ thống nhận dạng cảm xúc qua khuôn mặt sử dụng phương pháp truyền thống bao gồm ba giai đoạn chính: tiền xử lý hình ảnh khuôn mặt, trích xuất đặc trưng và phân loại.
Hình 44: Kiến trúc hệ thông nhận dạng theo phương pháp truyền thống
Tiền xử lý là bước quan trọng nhằm nâng cao hiệu suất của hệ thống nhận dạng cảm xúc qua khuôn mặt Quá trình này bao gồm các thao tác như căn chỉnh độ rõ, chia tỷ lệ hình ảnh, điều chỉnh độ tương phản và áp dụng các kỹ thuật nâng cao để cải thiện các khung biểu thức.
Trích xuất đặc trưng trong thị giác máy tính là giai đoạn quan trọng, chuyển đổi từ mô tả đồ họa sang dữ liệu ẩn Quá trình này giúp lựa chọn những đặc trưng nổi bật nhất của hình ảnh, từ đó tạo ra các mô tả dữ liệu có thể sử dụng làm đầu vào cho bài toán phân loại.
Phân loại là giai đoạn cuối cùng trong hệ thống nhận diện cảm xúc qua khuôn mặt (FER), nhằm xác định các loại cảm xúc như hạnh phúc, buồn bã, bất ngờ, tức giận, sợ hãi, ghê tởm và trạng thái bình thường.
Sử dụng các phương pháp phân loại như Cây quyết định (ID3), SVM, và HMM, trong đó phân loại SVM đạt độ chính xác và hiệu suất tốt nhất Do đó, tôi chọn SVM làm phương pháp truyền thống đại diện cho hệ thống nhận diện của mình.
Phương pháp hiện đại - CNN
Depthwise Separable Convolution
Trong chương trước, chúng ta đã khám phá khái niệm Convolution, được hiểu đơn giản như một cửa sổ trượt trên ma trận Các lớp Convolution sử dụng các tham số (ma trận Kernel) để thực hiện tính toán, từ đó tạo ra các giá trị đặc trưng Quá trình này giúp trích xuất các điểm đặc trưng và giảm chiều dữ liệu, tối ưu hóa hiệu suất tính toán.
Hình 45: Cách thức làm việc của Convolution Xét từ khía cạnh độ phức tạp tính toán của một Convolution
Hình 46: Độ phức tạp tính toán của một Convolution
Hình ảnh trên mô tả một kernel trong không gian 3 chiều với các thông số H (chiều cao), W (chiều dài) và N (chiều sâu) Một kernel thông thường có kích thước (K, K, N), trong đó K đại diện cho độ lớn và N là chiều sâu của ảnh.
Khi xem xét một kernel, độ phức tạp tính toán phụ thuộc vào kích thước của feature map sau khi quét qua tất cả các chiều H và W Do chúng ta sử dụng nhiều kernel trong quá trình xử lý, độ phức tạp tổng thể sẽ tăng lên tương ứng.
Depthwise Separable Convolution là một phương pháp tối ưu hóa quá trình tính toán trong mạng nơ-ron, giúp giảm độ phức tạp khi áp dụng cho các thiết bị nhỏ gọn như smartphone hay máy tính nhúng Phương pháp này chia phép convolution thành hai phần: Depthwise convolution và Pointwise convolution, từ đó cải thiện hiệu suất mà vẫn giữ được chất lượng.
Depthwise convolution là một loại tích chập đặc biệt, trong đó mỗi kênh đầu vào được áp dụng một bộ lọc tích chập riêng biệt Khác với tích chập 2D thông thường, nơi bộ lọc có độ sâu tương đương với số kênh đầu vào và cho phép trộn lẫn các kênh, depthwise convolution giữ cho các kênh tách biệt Điều này giúp tối ưu hóa quá trình xử lý và giảm số lượng tham số trong mô hình.
Pointwise Convolution
Hình 47: Trọng số Mini Xception
MobileNet áp dụng kỹ thuật Tích chập chiều sâu tách biệt (Depthwise Separable Convolutions) nhằm giảm thiểu số lượng phép toán và số lượng tham số Phương pháp này cho phép thực hiện trích xuất đặc trưng một cách độc lập trên các kênh khác nhau.
Hình 48: Tích chập chiều sâu tách biệt cơ bản
Hình 49: Tích chập chiều sâu tách biệt với mô hình Xception
Hình 50: Kiến trúc tổng thể
Môi trường phát triển
• Hệ điều hành: Server Ubuntu 18.04.4
• RAM: 8GB, HDD, i5 2.20GHZ CPU
• Công cụ phát triển: Pycharm 2020.1
• Ngôn ngữ phát triển: Python
Tiến hanh traning
Tiền xử lý dữ liệu
Để đáp ứng nhu cầu khác nhau của các mô hình CNN, cần xử lý một số vấn đề liên quan đến ảnh đầu vào trước khi tiến hành huấn luyện Các bước thực hiện bao gồm căn chỉnh khuôn mặt để phát hiện chính xác, tăng cường dữ liệu hình ảnh nhằm đảm bảo đủ dữ liệu cho quá trình huấn luyện, và cuối cùng là chuẩn hóa dữ liệu khuôn mặt để cải thiện hiệu suất của mô hình.
Dữ liệu đóng vai trò quan trọng trong việc giải quyết các bài toán trong lĩnh vực học máy Tuy nhiên, sinh viên, đặc biệt là tôi, thường không có đủ dữ liệu, nhất là các dữ liệu nhạy cảm như khuôn mặt, chứng minh nhân dân, hình ảnh vũ khí và xe cộ Điều này đã tạo ra rào cản lớn trong việc tiếp cận học sâu và tiêu tốn nhiều thời gian của tôi.
Để giải quyết vấn đề thiếu dữ liệu trong quá trình huấn luyện mô hình, tôi đã tìm ra phương pháp hiệu quả là Tăng Cường Dữ Liệu (Data Augment) Phương pháp này cho phép tối ưu hóa việc sử dụng ít dữ liệu mà vẫn đảm bảo mô hình được đào tạo thành công.
Dữ liệu hay Làm Giàu Dữ liệu.
Khi huấn luyện mô hình, việc có đủ lượng ảnh là rất quan trọng, thường cần từ hàng nghìn bức ảnh tùy theo bài toán cụ thể Tuy nhiên, đối với sinh viên, việc sở hữu vài trăm bức ảnh đã là một thành công lớn Việc chỉ sử dụng vài trăm bức ảnh để huấn luyện sẽ không hiệu quả và dễ dẫn đến hiện tượng Overfitting nếu lặp đi lặp lại nhiều epoch Do đó, tôi đã nghĩ đến việc sử dụng Augment Data để làm phong phú thêm bộ dữ liệu ảnh hạn chế của mình.
Cách tăng cường ảnh bao gồm các biện pháp chỉnh sửa như lật ngang, lật dọc, kéo méo, phóng to, thu nhỏ, tăng giảm sáng, tương phản và thêm noise Những kỹ thuật này giúp tạo ra các ảnh mới từ ảnh hiện có, giúp mô hình học tập hiệu quả hơn và tổng quát hơn Việc lựa chọn phương pháp tăng cường phù hợp phụ thuộc vào loại mô hình và môi trường làm việc.
Khi thực hiện các phép augmentations, cần lưu ý rằng không phải tất cả đều phù hợp với mọi loại dữ liệu Ví dụ, không nên lật dữ liệu dạng chữ viết hoặc lật trên dưới với dữ liệu cần phân biệt giữa trời và đất, như trong trường hợp dữ liệu cho xe tự lái và người đi bộ Do đó, hãy cân nhắc kỹ lưỡng để chọn các phép augmentations phù hợp thay vì áp dụng một cách đồng loạt.
Để tiến hành chia dữ liệu, chúng ta sẽ phân tách thành hai phần: phần 1 dành cho việc huấn luyện, chiếm 80% tổng dữ liệu, và phần 2 dùng cho kiểm tra độ chính xác, chiếm 20% còn lại Dưới đây là đoạn code Python để thực hiện việc phân chia này.
# Shuffle data np.random.shuffle(MatrixData)
# Number of row for trainning data (80%)
X_Train = MatrixData[0 : NumberRowTrainSet, 0 : NumberFeature] Y_Train = MatrixData[0 : NumberRowTrainSet, NumberFeature]
Để đảm bảo sự phân bố đồng đều của các nhãn trong dữ liệu, việc trộn dữ liệu trước khi tách là cần thiết Sau khi thực hiện trộn, chúng ta tạo ra bốn biến: XT rain chứa các giá trị đặc tính cho quá trình huấn luyện, Y T rain là tập hợp các nhãn dữ liệu dùng cho huấn luyện Tương tự, XT est và Y T est được sử dụng cho quá trình kiểm tra.
Phân loại
Trong phương pháp truyền thống, quá trình trích xuất đặc trưng và phân loại tính năng thường diễn ra độc lập Ngược lại, trong Deep Learning, việc nhận diện cảm xúc khuôn mặt (FER) được thực hiện theo cách từ đầu đến cuối Một lớp mất được tích hợp ở cuối mạng giúp điều chỉnh lỗi thông qua quá trình lan truyền ngược, cho phép mạng trực tiếp xuất ra xác suất dự đoán cho từng mẫu.
Tiến hành thực nghiệm
• Đầu vào: là ảnh bất kỳ đã được gán nhãn, kích thước 48x48
• Cảm xúc của khuôn mặt + phần trăm dự đoán độ chính hình ảnh.
• Sử dụng phương pháp CNN
Trong đoạn mã dưới đây, chúng tôi sử dụng thư viện scikit-learn để hỗ trợ việc xây dựng cây quyết định Cách thức hoạt động của thuật toán đã được giải thích chi tiết trong phần lý thuyết trước đó.
# Training process clf = tree.DecisionTreeClassifier(criterion="gini") clf = clf.fit(X_Train, Y_Train)
# Show depth of tree print("Depth of tree is: " + str(clf.tree_.max_depth))
Trong quá trình huấn luyện, mã nguồn sẽ lưu lại mô hình cây đã được tạo ra, cho phép sử dụng lại mà không cần phải xây dựng lại từ đầu Sau khi cây được tạo thành công, hãy sử dụng tập X Test để kiểm tra kết quả.
# Predict result = clf.predict(X_Test) accuracy = accuracy_score(Y_Test, result) print("Accuracy is: " + str(accuracy))
# Show report of predict print(classification_report(Y_Test, result)
Biến kết quả lưu trữ giá trị dự đoán cho từng điểm dữ liệu trong XT est Sử dụng hàm accuracyScore() để tính toán độ chính xác của dự đoán so với giá trị thực tế Hàm classificationReport() được áp dụng để xuất báo cáo về các thông số của kết quả dự đoán Tổng cộng có 35.000 dữ liệu được thu thập từ hai tập dữ liệu Sau quá trình huấn luyện, kết quả dự đoán đạt độ chính xác 89.27% (0.8927).
Các tham số cần lưu ý
Độ chính xác của mô hình phân loại là rất quan trọng Ví dụ, khi chúng ta đưa vào mô hình 50 bức ảnh gồm cả chó và mèo, kết quả cho thấy 30 bức ảnh được nhận diện đúng, trong khi 20 bức ảnh còn lại bị nhận sai Điều này cho thấy cần cải thiện độ chính xác của mô hình để nâng cao hiệu quả phân loại.
Hay một cách tổng quát ta có:
– n: Số sample dự đoán đúng
– N: Tổng số sample đưa vào dự đoán
Model có độ chính xác cao hơn sẽ dự đoán chính xác hơn, điều này được xem là một yếu tố tích cực Tuy nhiên, trong các chương sau, chúng ta sẽ khám phá thêm các tham số khác như Precision và Recall để có cái nhìn toàn diện hơn về hiệu suất của model.
Loss là một giá trị không âm, thể hiện sự chênh lệch giữa nhãn thật của dữ liệu và nhãn do mô hình dự đoán Trong nhiều bài toán Deep Learning, hàm loss Cross Entropy thường được sử dụng để đo lường sự khác biệt này.
– n: Số lượng điểm dữ liệu
– y i,j Đây là nhãn thật của dữ liệu y i,j =1 nếu điểm dữ liệu i thuộc class j và =0 nếu ngược lại.
– yi,j Đây là nhãn dự đoán ra.yi,j thể hiện probability mà model của bạn dự đoán điểm dữ liệu i thuộc class j.
Kết quả
Hình 55: Đồ thị kết quả
Trong khóa luận này, tôi áp dụng mô hình Mini-Xception, được phát triển từ mô hình Xception, để thực hiện việc phát hiện và nhận dạng cảm xúc Tôi sử dụng bộ dữ liệu FER-2013 cùng với một bộ ảnh được tìm kiếm và lọc từ internet Bộ dữ liệu gốc bao gồm 7 loại hình cảm xúc: tức giận, khinh bỉ, sợ hãi, hạnh phúc, buồn, ngạc nhiên và bình thường, mà tôi đã tiến hành đào tạo.
Thử nghiệm Fer2013 raw + Haar
Mô hình phát hiện và nhận dạng cảm xúc sử dụng MiniXception đạt độ chính xác 71% trên tập Train và 63.026% trên tập test Độ chính xác của mô hình CNN vượt trội hơn so với mô hình SVM truyền thống, vì vậy tôi đã quyết định chọn mô hình CNN cho hoạt động chính trong khóa luận của mình.
Đề xuất cải tiến
Đa luồng xử lý
Hình 60: Luồng xử lý trong Python
Trong bài toán nhận dạng cảm xúc trong ảnh Ta thấy luồng xử lý sẽ như sau:
CPU: Module nhận dạng mặt => Module nhận dạng cảm xúc
Thuật toán Haarlike có tốc độ xử lý nhanh, cho phép phát hiện và cung cấp nhiều ảnh khuôn mặt cho mô-đun nhận dạng cảm xúc Ngược lại, mô hình CNN thường hoạt động chậm, dẫn đến việc làm chậm toàn bộ quá trình.
Chương trình đa luồng là một ứng dụng có khả năng chạy đồng thời hai hoặc nhiều phần, cho phép mỗi phần thực hiện các tác vụ khác nhau cùng lúc Điều này giúp tối ưu hóa việc sử dụng tài nguyên sẵn có, đặc biệt trong bối cảnh máy tính hiện đại sở hữu nhiều nhân CPU.
Python cung cấp các module thread và threading cho phép lập trình viên khởi tạo các thread mới và thực hiện nhiều tác vụ trong lập trình đa luồng Mỗi thread có vòng đời bao gồm các giai đoạn bắt đầu, chạy và kết thúc Ngoài ra, một thread có thể bị ngắt hoặc tạm thời dừng lại trong khi các thread khác vẫn hoạt động, quá trình này được gọi là yielding.
Chúng ta sẽ phân chia hai module: phát hiện khuôn mặt và nhận dạng cảm xúc thành hai luồng riêng biệt, sử dụng cấu trúc dữ liệu Queue Khi luồng A thực hiện thuật toán phát hiện khuôn mặt, các khuôn mặt được phát hiện sẽ được đưa vào queue.
Luồng B, sẽ nhận từ queue các khuôn mặt tìm được và tiến hành nhận dạng cảm xúc có trong đó.
Hàng đợi (queue) là một cấu trúc dữ liệu hoạt động theo cơ chế FIFO (First In First Out), nghĩa là phần tử được thêm vào trước sẽ được lấy ra trước Bạn có thể hình dung hàng đợi như một đoàn người xếp hàng chờ mua vé.
Người nào xếp hàng trước sẽ được mua vé trước và ra khỏi hàng để nhường vị trí cho người xếp hàng ngay phía sau.
Hình 61: Ảnh mô tả cách hoạt động của queue
Có thể xem hàng đợi (queue) là một kiểu danh sách có 2 phép toán đặc trưng là:
• Bổ sung một phần tử vào cuối danh sách (rear)
• Loại bỏ một phần tử ở đầu danh sách (front)
Vì sao phải cần đến Queue
• Hệ thống xử lý 1 frame ảnh mất 1/25 giây, không có gì phải bàn Vì khi đó sẽ đảm bảo khung hình 25 FPS.
Hệ thống xử lý một khung hình mất 0.5 giây, trong đó 0.1 giây được dành cho việc phát hiện khuôn mặt và 0.4 giây cho nhận dạng cảm xúc Thời gian trễ này khiến người dùng phải chờ đợi hình ảnh xuất hiện, gây cảm giác khó chịu, đặc biệt trong các ứng dụng yêu cầu thời gian thực.
Hệ thống chỉ có khả năng nhận diện cảm xúc từ 100 hình ảnh cùng lúc Khi có hình ảnh thứ 101, hệ thống sẽ tạm dừng 0.5 giây, và các hình ảnh tiếp theo sẽ phải chờ đợi, dẫn đến tình trạng chờ đợi kéo dài và cuối cùng có thể gây ra timeout.
Khi sử dụng queue và background job, hệ thống chỉ mất 0.1 giây để ghi lại hình ảnh vào queue và phản hồi rằng yêu cầu sẽ được xử lý Sau đó, các background job sẽ được tạo ra để xử lý yêu cầu này trên các worker, trong khi hệ thống vẫn tiếp tục nhận các yêu cầu hình ảnh tiếp theo.
The provided code snippet demonstrates the initialization of a video processing class using Python It imports essential libraries such as OpenCV for image processing, Keras for deep learning model handling, and psutil for system resource management The class `Video_Process` initializes a queue for input image buffering and sets a flag to manage process termination It also loads a pre-trained Haar Cascade classifier for face detection, facilitating real-time video analysis.
+’haarcascade_frontalface_default.xml’) self.emotions = (’Angry’,
’Background’,’Disgusted’,’Fearful’,’Happy’,’Neutral’,’Sad’,’Surprised’)
# load model self.model_facial_expression model_from_json(open("model/model_fernet.json",
#load weights self.model_facial_expression.load_weights(’model/model_fernet.h5’) def smoothEmotions(self): while 1 and not self.stop: try:
The code snippet captures video frames and processes them for facial expression recognition It retrieves image pixels and prepares them for analysis by converting them to an array and normalizing the values The model then predicts facial expressions based on the processed region of interest (ROI) The video capture continues until a stop condition is met, such as a failed frame read or a user interrupt Upon termination, resources are released, and any exceptions encountered during processing are printed for debugging purposes.
The code processes video frames to detect faces and analyze emotions Every fifth frame or the first frame is converted to grayscale, and faces are detected using a Haar cascade classifier Detected faces are resized to 48x48 pixels and stored with the current timestamp A rectangle is drawn around the detected faces in the original frame, which is then displayed in a window titled 'Facial Emotion Analysis.' The program runs two threads: one for showing the video and another for processing emotions The video processing is initiated with a specified video file path.
Hình 62: Ảnh so sánh hiệu quả đơn luồng và đa luồng Python
Gán nhãn dữ liệu ảnh bán tự động
Việc gán nhãn dữ liệu là một bước quan trọng trong quá trình phát triển AI, thường được thực hiện bởi các đội ngũ chuyên trách hoặc thông qua dịch vụ thuê ngoài Tuy nhiên, đối với những cá nhân thực hiện gán nhãn cho các dự án demo hoặc đồ án tốt nghiệp, việc này có thể trở nên nản lòng do tốn nhiều thời gian mà không mang lại giá trị chuyên môn rõ rệt.
Hình 63: Gán nhãn hình ảnh
Pipeline gán nhãn bằng Pretrain Model
Bước 1: Chuẩn bị data gồm hình ảnh hoặc video (chưa được gán nhãn) để vào trong folder “data”.
Bước 2: Sử dụng phương pháp Haar-like để phát hiện khuôn mặt trong ảnh và ghi lại file nhãn Lưu ý rằng model chỉ nhận diện khuôn mặt và tạo khung chữ nhật xung quanh, không phát hiện được cảm xúc Bước 3: Chúng ta đã có các file nhãn với một lớp duy nhất là cảm xúc, và việc đã có khung hình giúp công việc trở nên dễ dàng hơn Tại đây, chúng ta có hai phương án để tiếp tục: C1 và C2.
Bước 4: Cách C1 Chúng ta sử dụng các công cụ gán nhãn như LabelMe và LabelImage để thực hiện việc gán nhãn lại Cụ thể, chúng ta sẽ thay đổi từ nhãn "emotion" thành các nhãn cụ thể như "vui," "ngạc nhiên," "khóc," và "khinh bỉ."
Bước 5: Cách C2 là phương pháp sử dụng Python để đọc các ảnh đã được gán nhãn ở Bước 2 Chương trình sẽ hiển thị ảnh trên màn hình, cho phép người dùng gán lại nhãn mới và lưu lại vào file nhãn Ưu điểm của cách này so với Bước 4 là việc gán nhãn chỉ cần sử dụng phím bấm, không cần phải chọn ảnh vì ảnh sẽ tự động được tải lên.
Và đây là code: def saveImage(self): number_face = int(0) img_copy, preds = numpy.array([]), numpy.array([]) while 1 and not self.stop: try:
(img_copy, preds) = self.save_image_buffer.get() number_face += 1 current_time = time.time() label_temp = int(preds.argmax())
Hình 64: Gán nhãn thủ công và bán tự động
# anh se duoc phan loai theo nha, tung nhan ung voi tung folder cu the path_face_save str("face_database/"+str(self.EMOTIONS[label_temp])
+"/"+str(self.EMOTIONS[label_temp])+’_’ +str(int(current_time))+"_"
+str(number_face) + ".jpg") cv2.imwrite(path_face_save, img_copy) except Exception as e: print(e) print("Co ngoai le",sys.exc_info()[0]," xy ra.") pass
Sau khi thực hiện chạy code, dữ liệu mới sẽ được lưu trữ vào các thư mục riêng biệt Tiếp theo, quá trình lọc các hình ảnh trùng lặp sẽ được tiến hành và các nhãn sẽ được gán lại một lần nữa.
Hình 65: Dữ liệu mới được lưu trong các folder theo nhãn
Xử lý ảnh bị mờ khi xử lý video
Quá trình xử lý ảnh thường xuyên liên quan đến video, đòi hỏi hệ thống phải đọc từng frame một Tuy nhiên, khi gặp frame bị mờ, việc xử lý tiếp theo trở nên khó khăn và không đạt được kết quả như mong muốn Do đó, việc phát hiện và xử lý ảnh bị mờ là rất cần thiết để cải thiện chất lượng video.
Hình 66: Ảnh out nét Để làm được điều này chúng ta sử dụng một hàm đơn giản của OpenCV là cv2.Laplacian(input_image, cv2.CV_64F).var()
Cụ thể openCV sẽ nhân ảnh đầu vào với với cái ma trận này để đo độ focus của ảnh:
Sau khi thực hiện xong quá trình xử lý, hệ thống sẽ trả về một con số Nếu con số này nhỏ hơn ngưỡng mờ (blur threshold) đã được xác định trước đó, hệ thống sẽ kết luận rằng ảnh bị mờ; nếu không, ảnh được xem là rõ nét Dưới đây là đoạn mã cụ thể: import cv2.
# Duong dan den file anh image_file= "anh-out-net.jpg"
# Dinh nghia blur threshold blur_threshold0 text = str() color = (0,0,0)
# Doc anh tu file image = cv2.imread(image_file) gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
To calculate the focus level of an image, the focus measure is determined using the Laplacian method, specifically with the formula `focus_measure = cv2.Laplacian(gray, cv2.CV_64F).var()` If the focus measure falls below a defined blur threshold, the image is labeled as "Blurred" with a red color indicator (0, 0, 255) Conversely, if the focus measure meets or exceeds the threshold, the image is classified as "Sharp" with a green color indicator (0, 255, 0) The results are displayed on the image with the focus measure value formatted to two decimal places.
(30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 3)
# Hien thi anh cv2.imshow("Image", image)
#filename = ’anh-out-net-v1.jpg’
#cv2.imwrite(filename, image) key = cv2.waitKey(0)
Sau khi hệ thống xác định được độ mờ của frame ảnh, nó có khả năng điều chỉnh độ sắc nét cho phù hợp Trong nghiên cứu này, để nhận diện cảm xúc từ video, tôi đã lấy 5 frame liên tiếp thay vì chỉ một frame đơn lẻ Sau đó, tôi viết một hàm để kiểm tra và xác định frame ít mờ nhất trong số đó, và frame này sẽ được giữ lại để xử lý tiếp.
# Sap xep cac input_frames theo muc do Focus giam dan input_frames = sorted(input_frames, key=lambda img : cv2.Laplacian(img[0], cv2.CV_64F).var(), reverse=True)
# Lay khung hinh co muc do focus tot nhat best_image = input_frames[:1] return best_image
Phương pháp nhận diện khuôn mặt tự động bao gồm các bước chính: đầu tiên, phát hiện khuôn mặt để xác định vị trí trong ảnh hoặc video; tiếp theo, liên kết dữ liệu với các khuôn mặt đã phát hiện và xác định danh tính; cuối cùng, thực hiện xác minh khuôn mặt để tính toán độ tương đồng giữa các hình ảnh hoặc video Sơ lược về phương pháp này được minh họa trong hình.
Hình 68: Mô hình cách thức hoạt động hệ thống nhận dạng cảm xúc
Chuẩn bị môi trường
Em đã trình bày về cách cài đặt Jupyter Notebook và Python, bạn có thể tham khảo bài viết Face Detection với Jupyter Notebook và OpenCV.
Trong chương này, em sẽ sử dụng một số thư viện sau:
• Tensorflow – Backend, là một Framework do chính Google phát triển để thúc đẩy sự phát triển của Trí tuệ nhân tạo – AI.
Keras là một frontend được phát triển trên nền tảng TensorFlow, mang đến cho người dùng nhiều công cụ và API hữu ích để xây dựng các mô hình máy học và mạng Neural Network Việc sử dụng Keras giúp giảm thiểu độ phức tạp, tiết kiệm chi phí và rút ngắn thời gian trong quá trình nghiên cứu và phát triển.
OpenCV là thư viện mạnh mẽ cho xử lý hình ảnh, được ứng dụng rộng rãi trong nghiên cứu và ứng dụng thị giác máy tính Để cài đặt các thư viện cần thiết, bạn chỉ cần thực hiện lệnh trong Command Prompt hoặc Terminal, nhưng hãy lưu ý rằng quá trình cài đặt TensorFlow có thể mất nhiều thời gian.
# pip install tensorflow keras opencv-python numpy
Dự đoán cảm xúc với ảnh
Để sử dụng thư viện OpenCV và bộ nhận diện khuôn mặt, bạn thêm 2 dòng code sau:
Listing 1: Tao bo nhan dien khuon mat import cv2 # Import th vien OpenCV faceCascade cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
Thư viện chỉ cần được thêm một lần để nhận diện trên ảnh hoặc camera Để nhận diện trên bức ảnh đã tải về, bạn có thể thực hiện các bước tiếp theo.
1 block code và thêm vào đoạn code sau:
Listing 2: Doc hinh voi OpenCv va nhan dien img = cv2.imread(’./face.jpg’) # doc hinh voi OpenCV img = cv2.resize(img, (480, 480)) # Thay i kich thuoc hinh
# qua trinh nhan dien anh tren anh gray (en/Trang) grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Chuyen anh GRB sang Gray
# Thuc thi Face Detection faces = faceCascade.detectMultiScale( grayImg, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)
# Ve mot hinh vuong xung quanh nhung khuon mat tim duoc Ve tren anh mau. for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow(’Face Detection’, img) cv2.waitKey(0)
Hình 69: Nhận diện cảm xúc từ một ảnh bất kỳ
Nhận dạng khuôn mặt gặp phải một số khó khăn như góc chụp, sự hiện diện của các chi tiết không đặc trưng như râu quai nón và mắt kính, cũng như các yếu tố như biểu cảm khuôn mặt, sự che khuất và điều kiện ánh sáng Để giảm thiểu những thách thức này, bài toán được thực hiện trong điều kiện ánh sáng đồng đều, không có chiếu sáng mạnh, góc chụp trực diện hoặc gần như trực diện, không bị che khuất và sử dụng ảnh chất lượng cao.
Dự đoán cảm xúc với video
Nghiên cứu về phát hiện người trong video và thiết bị ghi hình đã thu hút sự quan tâm của nhiều nhà khoa học trên toàn thế giới, với mục tiêu nâng cao độ chính xác, hiệu suất và khả năng thích nghi trong nhiều môi trường khác nhau Việc phát hiện người trở nên dễ dàng hơn nhờ vào việc sử dụng thông tin khuôn mặt từ các khung hình liên tiếp, đồng thời cũng thực tiễn hơn so với nhận dạng cảm xúc trong không gian 2D.
Nhận dạng cảm xúc khuôn mặt được thực hiện qua các bức ảnh tĩnh, do đó cần chuyển đổi hình ảnh từ camera thành ảnh tĩnh để xử lý Sau khi có ảnh đầu vào, quá trình xử lý tiếp theo sẽ được tiến hành.
Hệ thống yêu cầu ảnh đầu vào, ảnh huấn luyện và ảnh nhận dạng phải có kích thước đồng nhất Vì vậy, sau khi thu thập ảnh, cần thực hiện cắt và chỉnh sửa để đảm bảo tất cả ảnh có cùng kích thước nhất định.
Khối tạo cơ sở dữ liệu gán cảm xúc cho các ảnh đã qua xử lý trong quá trình huấn luyện, phục vụ cho việc nhận dạng Sau đó, khối so sánh sẽ đối chiếu các ảnh đã xử lý cảm xúc trong quá trình nhận dạng với các ảnh trong cơ sở dữ liệu đã được huấn luyện, nhằm đưa ra kết luận chính xác.
Hệ thống sẽ cung cấp thông tin về cảm xúc trong ảnh cần nhận dạng Để sử dụng camera cho việc thu hình và nhận diện trực tiếp, chúng ta cần thêm một block code mới với đoạn mã sau: ```pythonimport os import cv2 import numpy as np from keras.models import model_from_json from keras.preprocessing import image```
#load model model = model_from_json(open("path_to/fer.json", "r").read())
#load weights model.load_weights(’path_to/fer.h5’) face_haar_cascade cv2.CascadeClassifier(’haarcascade_frontalface_default.xml’)
To capture video from a webcam using OpenCV, initiate the video capture with `cv2.VideoCapture(0)` and enter a continuous loop Within this loop, read frames from the webcam and check if the frame was successfully captured If not, skip to the next iteration Convert the captured frame to grayscale and detect faces using the Haar cascade classifier For each detected face, draw a rectangle around it on the original image Crop the region of interest (the face) from the grayscale image, resize it to 48x48 pixels, and preprocess it for prediction by converting it to an array and normalizing the pixel values Finally, use the trained model to predict the results based on the processed image.
#find max indexed array max_index = np.argmax(predictions[0]) emotions = (’angry’, ’disgust’, ’fear’, ’happy’, ’sad’,
The code snippet demonstrates how to predict and display facial emotions using OpenCV It identifies the emotion with the highest prediction score and annotates the image with the predicted emotion text The image is then resized for better visibility and displayed in a window titled "Facial Emotion Analysis." The program continues to run until the user presses the 'q' key, at which point it releases the video capture and closes all OpenCV windows.
Kết quả
Bài toán nhận dạng video đã giải quyết nhiều hạn chế của việc nhận dạng chỉ dựa vào một bức ảnh Nhờ vào các kỹ thuật mới, độ chính xác của các phương pháp này ngày càng cao, trong khi chi phí tính toán ngày càng giảm.
Hình 70: Ảnh một frame của video
Kết luận và Định hướng phát triển
Mục đích của đề tài là nghiên cứu và đánh giá các thuật toán xử lý ảnh và nhận dạng nhằm xây dựng hệ thống nhận dạng khuôn mặt hoàn chỉnh cho ứng dụng thực tế Đề tài đã thực hiện việc tìm hiểu các thuật toán tiêu biểu tại từng giai đoạn của quá trình nhận dạng khuôn mặt, tập trung vào những thuật toán có độ chính xác cao nhất Cụ thể, nghiên cứu tập trung vào thuật toán Violas John để rút trích đặc trưng khuôn mặt và mô hình CNN cho quy trình nhận dạng.
Luận văn đã phát triển một công cụ nhận dạng khuôn mặt hoàn chỉnh, có khả năng ứng dụng thực tiễn với độ chính xác đạt hơn 75% trên bộ thư viện FER2013 và từ 70-73% trên dữ liệu tự thu thập Mặc dù có nhiều nỗ lực, nhưng do thời gian nghiên cứu hạn chế và thiếu kinh nghiệm, khóa luận vẫn tồn tại một số sai sót, như lượng dữ liệu thu thập còn ít và chất lượng ảnh chưa tốt Qua các mô hình và cách thức hoạt động, có thể thấy rằng dữ liệu đóng vai trò quan trọng trong việc đào tạo hệ thống nhận dạng.
Mặc dù mô hình còn hạn chế, việc có nhiều dữ liệu để đào tạo sẽ cải thiện đáng kể độ chính xác của hệ thống Các mô hình đạt độ chính xác trên 97% thường sử dụng hơn 100 nghìn ảnh để huấn luyện Hơn nữa, việc xử lý nhiều phần khuôn mặt cũng góp phần nâng cao độ chính xác trong nhận diện, nhưng điều này đòi hỏi hệ thống cần có khả năng tính toán lớn hơn để thực hiện nhận diện hiệu quả.
Các phương pháp nhận dạng sử dụng mạng nơ ron tích chập hiện nay có độ sai số rất thấp, nằm trong ngưỡng chấp nhận Việc áp dụng công nghệ này để phát triển hệ thống nhận diện là khả thi và có thể đáp ứng nhiều nhu cầu trong bối cảnh cách mạng công nghiệp 4.0 đang diễn ra.
Qua khóa luận tốt nghiệp đề tài “Nghiên cứu về mạng nơ ron tích chập và ứng dụng cho bài toán nhận dạng khuôn mặt”,em đã thực hiện:
• Nghiên cứu tổng quan về nhận dạng khuôn mặt cũng như tìm hiểu một số khái niệm, giải thuật tối ưu mô hình
Mạng nơ ron và mạng nơ ron tích chập (CNNs) là hai công nghệ quan trọng trong lĩnh vực học máy Mạng nơ ron truyền thống có những ưu điểm như khả năng học từ dữ liệu lớn, nhưng cũng gặp phải nhược điểm như dễ bị overfitting Trong khi đó, CNN hiện đại nổi bật với khả năng xử lý hình ảnh hiệu quả và giảm thiểu độ phức tạp tính toán, mặc dù cũng có một số hạn chế nhất định Việc hiểu rõ những điểm mạnh và yếu của cả hai phương pháp này là cần thiết để áp dụng chúng một cách hiệu quả trong các bài toán thực tiễn.
• Áp dụng CNNs cho bài toán nhận dạng cảm xúc, và cho kết quả khả quan.
Xử lý ảnh và nhận dạng cảm xúc là lĩnh vực nghiên cứu mới mẻ, hứa hẹn sẽ phát triển mạnh mẽ trong tương lai Đề tài này có tiềm năng được triển khai rộng rãi trong nhiều ứng dụng nhận dạng cá nhân và gương mặt khác nhau, nhằm đáp ứng nhu cầu ngày càng tăng về tính thực tiễn.
Thuật toán phát hiện cảm xúc cần được huấn luyện thêm để nâng cao độ ổn định và khả năng trích chọn đặc trưng cảm xúc từ khuôn mặt Đồng thời, mô hình CNN cũng cần cải thiện tốc độ và độ chính xác trong việc phát hiện cảm xúc.
Hướng phát triển của bài toán
Để nâng cao hiệu quả chương trình nhận diện khuôn mặt, cần tách ly các đặc trưng khuôn mặt trong điều kiện nhiễu và mất mát thông tin do ảnh hưởng từ môi trường Việc tìm kiếm vùng khuôn mặt trong ảnh cần chú ý đến sự tương phản giữa khuôn mặt và nhiễu, đặc biệt là đối với những khuôn mặt ở xa hoặc ngược sáng.
Nghiên cứu tập trung vào ứng dụng cụ thể, bao gồm giám sát cảm xúc của sinh viên trong giờ học, khảo sát mức độ hài lòng của khách hàng, và phân tích phản ứng của con người trước các kích thích từ môi trường.
Nghiên cứu phát triển phần mềm nhằm tự động nhận dạng cảm xúc của người đang chuyển động trong thời gian thực, áp dụng cho các lĩnh vực như phân tích cảm xúc khách hàng và giáo dục sinh viên Đặc biệt, nghiên cứu này tập trung vào việc kết hợp mạng nơ-ron tích chập (CNNs) với GPU để cải thiện tốc độ xử lý và nâng cao độ chính xác trong nhận dạng cảm xúc.
• Xây dựng một chương trình hoàn chỉnh có giao diện tương tác với người sử dụng
Em đã trải nghiệm nhiều hình thức đánh giá bài giảng như phiếu đánh giá cuối giờ, trong giờ ra chơi và các biểu mẫu của Google Tuy nhiên, cơ chế này vẫn tồn tại một số vấn đề cần khắc phục.
• Việc rà soát, thống kê từ những tờ giấy lại rất khó khăn Cần dữ liệu dễ dàng nhập xuất tra cứu (đơn cử là excel).
• Việc khảo sát tốn rất nhiều thời gian với những lớp học như hội trường có thể với lượng 200 sinh viên Cần một ứng dụng chạy real-time.
Khảo sát cảm xúc trong một khoảng thời gian nhất định để đánh giá hiệu quả của một tiết học không mang lại độ chính xác cao Để có được kết quả đáng tin cậy hơn, cần thiết phải sử dụng một ứng dụng theo dõi cảm xúc theo thời gian thực.
Là sinh viên, em mong muốn xây dựng mô hình đánh giá khả năng tích cực của học sinh trong giờ học thông qua hệ thống camera giám sát Mục tiêu là phân tích hoạt động giơ tay phát biểu ý kiến, từ đó đánh giá tính tích cực của học sinh Luận văn sẽ tập trung vào việc phát hiện hành động của học sinh như một tiền đề cho việc phân tích này, đồng thời nghiên cứu các phương pháp phát hiện đối tượng dựa trên học sâu trong lĩnh vực thị giá máy tính.
Có nhiều dấu hiệu để phát hiện sự tích cực học tập của học sinh trong lớp, bao gồm việc chú ý, hoàn thành nhiệm vụ và hiểu bài Một trong những hoạt động nổi bật nhất là việc giơ tay phát biểu ý kiến Đánh giá sự tích cực này thường dựa vào cảm nhận của người quan sát mà không có số liệu cụ thể Luận văn này sẽ cung cấp số liệu thống kê và phân tích hoạt động giơ tay phát biểu ý kiến trong giờ học, từ đó giúp đánh giá tính tích cực của học sinh qua hoạt động này.
[1] Texmath, Website học tập Latex
[2] Blogchiasekienthuc, Website học tập Latex
[3] V H Tiệp, Xác suất cho machine learning 2017 [Online] Available
[4] V H Tiệp, Phân nhóm các thuật toán machine learning 2016.
[5] N.Q Anh, N.H Dũng Tạp chí Khoa học ĐHQGHN: Khoa học Tự nhiên và Công nghệ, Tập 33, Số 1 (2017)
[6] Linda G Shapiro and George C Stockman Computer Vision.
[7] Tim Morris,Computer Vision and Image Processing Palgrave Macmillan.
[8] Bernd Jăahne and Horst Hauòecker Computer Vision and Applications, A Guide for Students and Practitioners Academic Press (2000)
[9] Milan Sonka, Vaclav Hlavac and Roger Boyle.Image Processing, Analysis, and Machine Vision Thomson (2008)
[10] David A Forsyth and Jean Ponce.Computer Vision, A Modern Approach. Prentice Hall (2003)
[11] Dana H Ballard and Christopher M Brown Computer Vision Prentice Hall (1982)
[12] Barghout, Lauren, and Jacob Sheynin Real-world scene perception and perceptual organization: Lessons from Computer Vision Journal of Vision 13.9 (2013)
[13] http://www.psych.utoronto.ca/users/reingold/courses/ai/cache/neural4.html, (2019)
[14] Md Zahangir Alom, Tarek M Taha, Christopher Yakopcic, Stefan West- berg, Paheding Sidike, Mst Shamima Nasrin, Brian C Van Esesn, Abdul
A S Awwal, Vijayan K Asari.The History Began from AlexNet: A Com- prehensive Survey on Deep Learning Approaches (2018)
[15] Qianli Liao A summary of deep models for face recognition (2015)
[16] D H Hubel and T N Wiesel Receptive fields of single neurones in the cat’s striate cortex URL:https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1363130/ (1959)
[17] Y Lecun, L Bottou, Y Bengio, P Haffner Gradient-based learning ap- plied to document recognition (1998)
[18] Reinhard Klette Concise Computer Vision Springer (2014)
[19] URL: http://disp.ee.ntu.edu.tw/tutorial/NeuralNetwork.docx, (2019) 71
[20] URL: https://trantheanh.github.io/2016/10/18/ML-07/, (2019)
[21] URL: https://towardsdatascience.com/activation-functions-neural- networks1cbd9f8d91d6, (2019)