Tính cấp thiết của đề tài Ngôn ngữ ký hiệu NNKH là một ngôn ngữ hình thể, sử dụng các cử chỉ của tay,khuôn mặt, đầu và thân thể để biểu đạt ý nghĩa.. Vì vậy, nhóm chúng em đã phát triển
GIỚI THIỆU ĐỀ TÀI
Tính cấp thiết của đề tài
Ngôn ngữ ký hiệu (NNKH) là một hình thức giao tiếp phi ngôn ngữ, sử dụng các cử chỉ tay, khuôn mặt, đầu và cơ thể để truyền đạt ý nghĩa Đây là ngôn ngữ chính của người khiếm thính, được áp dụng trong nhiều lĩnh vực như giao tiếp hàng ngày, công việc và giải trí Tuy nhiên, việc sử dụng NNKH vẫn gặp nhiều thách thức, đặc biệt đối với những người không khiếm thính, dẫn đến khó khăn trong việc tiếp cận thông tin, kiến thức và tham gia vào các hoạt động xã hội của người khiếm thính.
Nhóm chúng em đã phát triển một hệ thống nhận diện cử chỉ ngón tay trong ngôn ngữ ký hiệu thông qua hình ảnh từ camera, nhằm hỗ trợ người khuyết tật trong việc giao tiếp hiệu quả hơn.
Hệ thống sử dụng mạng nơ-ron tích chập (CNN) để "nhìn" thấy bàn tay qua camera, xác định vị trí và hướng của nó, đồng thời nhận diện ý nghĩa của các cử chỉ.
Lý do chọn đề tài
Công nghệ hiện đại giúp người khuyết tật, đặc biệt là người khiếm thính, giao tiếp và sử dụng máy tính một cách dễ dàng và thuận tiện mà không cần đến sự hỗ trợ của người phiên dịch.
Trong thực tế, người khiếm thính thường giao tiếp bằng thủ ngữ, nhưng không phải ai cũng hiểu bảng chữ cái và ký hiệu này, gây ra khó khăn trong giao tiếp với cộng đồng Do đó, nghiên cứu xây dựng một ứng dụng nhận diện cử chỉ tay trong bảng chữ cái thủ ngữ là cần thiết Ứng dụng này sẽ giúp cải thiện khả năng giao tiếp giữa người khuyết tật và xã hội.
1 Nhận diện cử chỉ tay của người dùng thông qua camera.
2 Hiển thị chữ cái hoặc từ tương ứng trên màn hình dưới dạng bảng chữ cái Latin.
3 Chuyển đổi từ hoặc câu đó thành lời nói để giúp người khác dễ dàng hiểu được ý tưởng của người sử dụng.
Mục tiêu tổng quát
Mục tiêu của ứng dụng là nhận diện cử chỉ tay của người dùng và chuyển đổi chúng thành văn bản hiển thị trên màn hình, sau đó chuyển đổi thành lời nói Ứng dụng này nhằm hỗ trợ người khiếm thính trong việc giao tiếp, giúp họ vượt qua những khó khăn trong giao tiếp hàng ngày.
Mục tiêu cụ thể là học và hiểu cơ bản bảng chữ cái thủ ngữ, đồng thời nắm vững kiến thức về máy học và cấu trúc thuật toán sử dụng Cần tìm kiếm thông tin về bảng chữ cái thủ ngữ dưới dạng hình ảnh và thiết lập cấu hình giao diện máy tính để máy có thể nhận diện qua camera Điều này giúp thể hiện rõ ràng hình ảnh và nhận diện chính xác từ mà người dùng sử dụng.
Phương pháp nghiên cứu
- Tìm hiểu về bảng chữ cái thủ ngữ cho người khuyết tật ở đây chúng em dùng bảng chữ cái American Sign Language (ASL)
- Tìm kiếm bộ CSDL trên Kaggle bộ ảnh về thủ ngữ American Sign Language
- Nghiên cứu các đề tài hoặc bài toán tương tự trên internet
- Chọn mô hình thực hiện: CNN
- Nghiên cứu mô hình Transformer để xử lý ngôn ngữ tự nhiên
- Nghiên cứu công nghệ Text-to-speech để chuyển đổi câu thành giọng nói
- Nghiên cứu bắt đầu thiết kế giao diện người dùng
Kết quả mong muốn
Sau khi hoàn thành, ứng dụng sẽ:
1 Nhận diện chính xác: Đạt độ chính xác ít nhất 90% trong việc nhận diện các ký hiệu thủ ngữ từ cử chỉ tay.
2 Ghép ký hiệu thành câu: Hiển thị các ký hiệu dưới dạng văn bản trên màn hình và ghép chúng thành từ hoặc câu hoàn chỉnh.
3 Chuyển đổi văn bản thành giọng nói: Văn bản sau khi ghép sẽ được chuyển đổi thành giọng nói thông qua Text-to-Speech.
4 Tích hợp giao diện: Giao diện trực quan, dễ sử dụng, thân thiện với người dùng.
5 Ứng dụng thực tế: Giúp người khuyết tật, đặc biệt là người khiếm thính, giao tiếp thuận tiện hơn mà không cần phiên dịch viên. Ứng dụng không chỉ mang lại giá trị thực tiễn cho người khuyết tật mà còn góp phần thúc đẩy nghiên cứu và ứng dụng công nghệ vào các lĩnh vực hỗ trợ cộng đồng.
CƠ SỞ LÝ THUYẾT
Tổng quan thủ ngữ (cử chỉ tay) của người khuyết tật
Thủ ngữ, hay còn gọi là ngôn ngữ ký hiệu, là hình thức giao tiếp sử dụng các biểu hiện của bàn tay thay vì âm thanh Ngôn ngữ này đóng vai trò quan trọng trong việc giúp người khiếm thính giao tiếp hiệu quả trong cộng đồng và tiếp nhận tri thức từ xã hội.
Bảng chữ cái thủ ngữ: Bảng chữ cái trong ngôn ngữ ký hiệu Mỹ (ASL) bao gồm
Trong tiếng Anh, có 26 biểu tượng đại diện cho các chữ cái Đặc biệt, các biểu tượng cho chữ "p" và "k" có hình thức giống nhau nhưng được định hướng khác nhau.
Hình 2.1 Bảng chữ cái thủ ngữ của người khuyết tật
Convolutional Neural Network (CNN)
2.2.1.1 Thành phần quan trọng của Perceptron
Perceptron có 4 thành phần quan trọng:
2 Trọng lượng và độ lệch (Weights and Bias).
3 Hàm tính tổng (Summation Function).
4 Hàm kích hoạt hoặc chuyển đổi (Activation or Transformation Function).
Hình 2.2 Cấu trúc Perceptron Đầu vào
- Là các node𝑥0,𝑥1, ,𝑥𝑛với node x0 = 1 (Đôi khi node𝑥0 được ẩn đi).
Khi một biến đầu vào được đưa vào mạng, trọng số đầu vào sẽ được gán giá trị ngẫu nhiên và quá trình huấn luyện sẽ cập nhật trọng số này.
- Trọng số của mỗi điểm dữ liệu đầu vào cho biết mức độ quan trọng của đầu vào đó trong việc dự đoán kết quả. Độ lệch (Bias)
Là một thành phần tuyến tính, nó được thêm vào kết quả của phép nhân trọng số với đầu vào, và tham số này được học trong quá trình huấn luyện.
- Tham số độ lệch cho phép điều chỉnh đường cong hàm kích hoạt theo cách đạt được kết quả đầu ra chính xác.
Hàm tính tổng (Summation Function)
- Cộng tất cả các tích của đầu vào và trọng số tương ứng để ra tổng có trọng số. Hàm kích hoạt hoặc chuyển đổi (Activation or Transformation Function)
Hàm phi tuyến tính được áp dụng vào đầu ra của các nơron trong tầng ẩn, đóng vai trò quan trọng trong việc chuyển đổi dữ liệu đầu vào cho tầng tiếp theo Công thức tính toán các hàm này giúp tối ưu hóa quá trình học của mạng nơron.
2.2.1.2 Logic hoạt động của Perceptron
Các đầu vào từ lớp đầu vào được nhân với trọng số tương ứng, tạo thành tổng có trọng số Sau đó, tổng này được áp dụng cho một hàm kích hoạt, giúp ánh xạ đầu vào tới đầu ra tương ứng.
Tập hợp các node màu lục là input layer Số node trong layer là d+1.
Trong mạng nơ-ron, các trọng số 𝑤0, 𝑤1, , 𝑤𝑑 được gán cho các mũi tên dẫn đến nút 𝑧, trong khi nút 𝑦 là đầu ra của mạng Hình chữ Z ngược màu lam trong nút 𝑦 biểu thị đồ thị của hàm sgn, đóng vai trò là một hàm kích hoạt quan trọng trong quá trình xử lý thông tin.
Dữ liệu đầu vào được đặt vào input layer, lấy tổng có trọng số lưu vào biến z, rồi đi qua hàm kích hoạt để có kết quả ở y.
2.2.1.3 Các lớp (Layers) trong Neural Network
Lớp đầu vào (Input layer) :
- Là tầng thể hiện cho các đầu vào của mạng, với số nơron bằng số lượng tính năng (cột) của dữ liệu.
- Mỗi mạng neuron có 1 lớp đầu vào.
- Nằm giữa tầng đầu vào và đầu ra, thể hiện cho quá trình suy luận logic của mạng.
- Một mô hình neural network có thể có hoặc không có tầng ẩn (hidden layer) nhưng các mô hình neural network thường có nhiều tầng ẩn (hidden layer).
- Đóng vai trò quan trọng trong việc trích xuất và phân loại đặc trưng
Lớp đầu ra (Output layer):
- Là lớp tạo ra kết quả, phản ánh đầu ra của mạng.
- Giống lớp đầu vào, mỗi mạng neuron có đúng 1 lớp đầu ra, với số nơron xác định bởi bài toán cụ thể.
2.2.1.4 Lan truyền tiến và lan truyền ngược
Feedforward là quá trình trong đó dữ liệu đầu vào được truyền qua các lớp mà không có sự phản hồi từ các lớp sau về lớp trước, dẫn đến việc tạo ra đầu ra cuối cùng.
1 Đầu vào: Dữ liệu được đưa vào lớp đầu tiên (input layer).
2 Lan truyền: Mỗi nơron tính tổng trọng sốtừ lớp trước, áp dụng hàm kích hoạt (ReLU, Sigmoid, Tanh).
3 Lớp đầu ra: Sử dụng hàm Sigmoid/Softmax (phân loại) hoặc trả giá trị số (hồi quy).
4 Dự đoán: Đầu ra là xác suất phân loại hoặc giá trị hồi quy.
Hình 2.4 Feedforward trong Neural Network
Backpropagation: Đây là thuật toán điều chỉnh trọng số và bias của mạng nơ-ron để giảm thiểu hàm mất mát Các bước chính gồm:
1 Feedforward: Mạng tính toán dự đoán ban đầu và hàm mất mát dựa trên sai lệch giữa dự đoán và giá trị thực.
2 Lan truyền ngược: Từ đầu ra về lớp đầu vào, tính toán gradient của hàm mất mát qua từng lớp dựa trên quy tắc chuỗi (chain rule).
3 Cập nhật trọng số: Sử dụng gradient descent hoặc các biến thể để điều chỉnh trọng số và bias nhằm giảm hàm mất mát.
Mạng nơ-ron tích chập (CNNs) là một mô hình Deep Learning tiên tiến, cho phép phát triển các hệ thống thông minh với độ chính xác cao.
Kỹ thuật CNN trong quá trình huấn luyện và kiểm tra sử dụng hình ảnh đầu vào qua nhiều lớp tích chập với các bộ lọc (Kernels), sau đó tổng hợp qua các lớp kết nối đầy đủ (Fully Connected) và áp dụng hàm Softmax để phân loại đối tượng, cho ra giá trị xác suất từ 0 đến 1.
Hình 2.6 Quá trình nhân chập (convolution) ảnh xám
Một cửa sổ Kernel được dịch chuyển để trích xuất đặc trưng của ảnh thông qua phép nhân chập Giá trị của kernel có ảnh hưởng lớn đến kết quả của phép chập, vì vậy việc tạo ra các kernel khác nhau phụ thuộc vào đặc trưng mà người dùng muốn trích xuất.
Hình 2.7 Dùng kernel để trích xuất đặc trưng từ ảnh
Ảnh màu được biểu diễn bằng 3 kênh là đỏ, xanh lá và xanh dương, do đó, để thể hiện ảnh dưới dạng tensor 3 chiều, kernel cũng sẽ được định nghĩa là một tensor 3 chiều với kích thước k*k*3.
Hình 2.8 Quá trình nhân chập (convolution ) ảnh RGB
Mỗi kernel trong các lớp convolutional giúp chúng ta học được những đặc trưng riêng của ảnh, vì vậy mỗi lớp sẽ sử dụng nhiều kernel để khai thác nhiều thuộc tính khác nhau Mỗi kernel tạo ra một ma trận đầu ra, do đó với k kernel, chúng ta sẽ có k ma trận đầu ra Những ma trận này được kết hợp lại thành một tensor 3 chiều với chiều sâu k.
Layer pooling được sử dụng giữa các lớp convolutional nhằm giảm kích thước dữ liệu trong khi vẫn bảo toàn các đặc trưng quan trọng Việc giảm kích thước dữ liệu này giúp tối ưu hóa quá trình tính toán trong mô hình.
Kích thước pooling được định nghĩa là K*K, trong khi kích thước đầu vào của lớp pooling là H*W*D Chúng ta sẽ tách đầu vào thành D ma trận có kích thước H*W Đối với mỗi ma trận, trên vùng kích thước K*K, chúng ta sẽ tìm giá trị lớn nhất hoặc trung bình của dữ liệu và ghi vào ma trận kết quả Các quy tắc về stride và padding được áp dụng tương tự như trong phép tính convolution trên ảnh.
Có 2 loại pooling layer phổ biến là: max pooling và average pooling.
Hình 2.10 Max pooling và average pooling
Sau khi trải qua nhiều lớp convolutional và pooling, mô hình đã học được các đặc điểm quan trọng của ảnh Tensor đầu ra từ lớp cuối cùng, với kích thước H*W*D, sẽ được chuyển đổi thành một vector có kích thước (H*W*D).
Sau đó ta dùng các fully connected layer để kết hợp các đặc điểm của ảnh để ra được output của model.
Lớp Kết Nối Đầy Đủ (Fully Connected Layer - FCL), hay còn gọi là Lớp Dense, là thành phần quan trọng trong mạng nơ-ron nhân tạo (ANN) với đặc điểm là mỗi nơ-ron được kết nối với tất cả các nơ-ron ở lớp kế tiếp Đầu ra của nơ-ron được xác định bằng cách tính tích trọng số của đầu vào cộng với bias, sau đó áp dụng hàm kích hoạt như ReLU, sigmoid hoặc tanh Trong quá trình huấn luyện, trọng số và bias sẽ được tối ưu hóa để cải thiện hiệu suất của mạng.
Transformer
Transformer ra đời như một giải pháp mới cho NPL, khắc phục những hạn chế của RNNs và LSTM Khác với RNNs, Transformer không yêu cầu dữ liệu phải được xử lý theo thứ tự, điều này cho phép thực hiện nhiều phép toán song song và giảm đáng kể thời gian huấn luyện.
Kiến trúc tổng quan của mô hình transformer gồm 2 phần là encoder và decoder:
- Encoder dùng để học vector biểu của câu với mong muốn rằng vector này mang thông tin hoàn hảo của câu đó.
Decoder chuyển đổi vector biểu diễn thành ngôn ngữ đích, trong khi Transformer áp dụng cơ chế Self-Attention để xác định mối liên hệ giữa các từ trong câu, giúp "hiểu" ngữ nghĩa một cách hiệu quả hơn so với phương pháp "recurrent" của RNNs.
Hình 2.13 Kiến trúc mô hình Transformer
The encoder of the transformer model consists of multiple identical encoder layers Each encoder layer features two main components: multi-head attention and a feedforward network, along with skip connections and normalization layers.
Hình 2.14 Kiến trúc khối Encoder
Encoder đầu tiên nhận ma trận biểu diễn từ đã được bổ sung thông tin vị trí thông qua positional encoding Ma trận này sau đó được xử lý bởi Multi Head Attention, một dạng self-attention cho phép mô hình chú ý đến nhiều mẫu khác nhau bằng cách sử dụng nhiều self-attention song song.
2.3.2.1 Các thành phần của Encoder:
- Biến đổi đầu vào (chuỗi từ hoặc ký hiệu) thành vector số học thông qua Word Embedding.
- Thêm thông tin về thứ tự vị trí của từ trong chuỗi, vì Transformer không có cơ chế xử lý tuần tự như RNN.
- Self-Attention là cơ chế giúp Transformers "hiểu" được sự liên quan giữa các từ trong một câu nghĩa là từ nào liên quan tới từ nào trong câu.
- Multi-head Attention là bản nâng cấp của Self-Attention.
Thay vì sử dụng một self-attention đơn lẻ, chúng ta áp dụng nhiều attention khác nhau (multi-head) để mỗi attention có thể tập trung vào các phần khác nhau của câu Điều này cho phép nhiều self-attention hoạt động đồng thời, giúp học hỏi các mối quan hệ đa dạng giữa các từ trong văn bản.
- Đầu vào của các module Multi-head Attention (bản chất là Self Attention) có
3 mũi tên, đó chính là 3 vectors Querys (Q), Keys (K) và Values (V):
- Là một mạng đơn giản, áp dụng độc lập cho từng vector (token) trong câu.
Mô hình học có khả năng hiểu và biểu diễn các mối quan hệ tốt hơn thông qua việc áp dụng các phép biến đổi phi tuyến tính, giúp tạo ra các biểu diễn đặc trưng phức tạp cho từng token.
5 Residual Connection và Layer Normalization
- Residual Connection: Giúp duy trì thông tin đầu vào qua mỗi lớp:
- Layer Normalization: Giúp tăng tốc độ hội tụ và ổn định quá trình huấn luyện.
Hình 2.18 Quá trình Add & Normalize
2.3.2.2 Luồng hoạt động trong encoder
1 Đầu vào được nhúng thành vector và cộng với Positional Encoding.
2 Qua N lớp Encoder, mỗi lớp thực hiện:
3 Kết quả cuối cùng là biểu diễn đã được mã hóa, được truyền sang Decoder.
Decoder có nhiệm vụ giải mã vector từ câu nguồn thành câu đích, nhận thông tin từ encoder qua hai vector key và value Kiến trúc của decoder tương tự như encoder, nhưng bổ sung thêm một multi-head attention ở giữa, giúp học mối liên hệ giữa từ đang dịch và các từ trong câu nguồn.
Hình 2.19 Kiến trúc khối decoder
Multi-Head Attention trong Encoder sử dụng một mask để đảm bảo rằng mỗi token chỉ chú ý đến các token trước đó, nhằm ngăn chặn việc rò rỉ thông tin từ tương lai.
Trong quá trình dịch tiếng Anh sang tiếng Việt, Decoder phải giải mã thông tin từ Encoder để tạo ra từng từ tiếng Việt dựa trên các từ đã dịch trước đó Nếu áp dụng Multi head attention cho toàn bộ câu như ở Encoder, Decoder sẽ có thể nhìn thấy từ tiếp theo cần dịch Để ngăn chặn điều này, phần sau của câu tiếng Việt sẽ bị che lại (masked), cho phép Decoder chỉ "nhìn" thấy những phần đã được dịch trước đó.
Về cơ bản là giống với encode, chỉ khác là Decoder decode từng từ một và input của Decoder (câu tiếng Việt) bị masked.
Sau khi đầu vào đã được masked đưa qua sub-layer #1 của Decoder, quá trình tạo ra Q, K, V không còn sử dụng ba ma trận trọng số mà chỉ sử dụng một ma trận trọng số WQ K và V được lấy từ Encoder, trong khi Q được lấy từ masked multi-head attention và được đưa vào sub-layer #2.
Cuối cùng, các vector được đẩy vào lớp Linear (là 1 mạng Fully Connected) theo sau bởi Softmax để cho ra xác suất của từ tiếp theo.
Text To Speech
Quy trình xử lý của hệ thống Text-To-Speech khác biệt rõ rệt so với cách con người phát âm, vì nó không phụ thuộc vào áp suất phổi và co thắt đường thanh quản Việc thiết kế các hệ thống này để mô phỏng cấu trúc phát âm của con người là một thách thức lớn Một hệ thống Text-To-Speech tổng quát thường bao gồm hai module chính.
Hình 2.21 Sơ đồ kiến trúc tổng quát
Xử lý ngôn ngữ tự nhiên (NLP) là quá trình phân tích và xử lý ngữ âm, ngữ điệu cùng với nhịp điệu của văn bản, nhằm tạo ra bản phiên âm chính xác từ nội dung đầu vào.
- Digital Signal Processing – Xử lý tín hiệu kỹ thuật số: chuyển đổi bản ghi ngữ âm nhận được thành lời nói.
2.4.2.1 Module Natural Language Processing – Xử lý ngôn ngữ tự nhiên (NLP)
1 Text Analyzer - Phân tích văn bản:
Khối phân tích văn bản bao gồm 4 phần cơ bản:
- Khối tiền xử lý làm nhiệm vụ xử lý sơ bộ văn bản: xóa bỏ những kí tự, những vùng không cần thiết cho hệ thống
Khối phân tích hình thái học có nhiệm vụ xác định, phân tích và mô tả cấu trúc của hình vị cùng các đơn vị ý nghĩa khác, được chia thành ba khâu xử lý.
+ Phân đoạn từ vựng: phân giải câu văn thành các từ có thứ tự
+ Phân loại từ: quyết định từ loại của từ vựng
+ Phục hồi nguyên dạng của từ: phục hồi nguyên dạng ban đầu của các từ vựng
- Khối phân tích ngữ cảnh: chia nhỏ các câu thành các chuỗi từ nối tiếp nhau để trích xuất được ngữ cảnh của các chuỗi từ.
- Khối phân tích cú pháp – ngôn điệu: xác định cấu trúc văn bản
2 Letter-To-Sound - Phiên âm:
Quá trình này chuyển văn bản thành âm thanh dựa trên từ điển hoặc các quy tắc phiên âm.
Giải pháp phiên âm từ điển lưu trữ nhiều phát âm, trong khi phiên âm dựa trên luật áp dụng các quy tắc để xác định cách phát âm của từ chưa biết Quá trình chuyển đổi thường diễn ra theo từng ký tự, từ trái sang phải.
3 Prosody Generator - Tạo ngôn điệu
Ngôn điệu là nhịp điệu, trọng âm và ngữ điệu trong lời nói, giúp tập trung vào các phần cụ thể của câu, như nhấn mạnh âm tiết Nó cũng phân chia câu thành các đoạn liên quan, làm rõ mối quan hệ giữa chúng Khối tạo ngôn điệu đóng vai trò quan trọng trong việc hình thành ngôn điệu.
2.4.2.2 Digital Signal Processing – Xử lý tín hiệu kỹ thuật số (DSP)
Module xử lý tín hiệu số giúp máy tính phát âm các từ, cụm từ và câu giống như giọng nói con người Quá trình này có thể được thực hiện qua hai phương pháp: tổng hợp dựa trên quy tắc và tổng hợp ghép nối.
Tạo giọng nói bằng cách điều chỉnh các tham số như tần số và mức độ tiếng ồn có thể gặp phải một số lỗi và đòi hỏi thời gian phát triển đáng kể.
Tổng hợp ghép nối là phương pháp xâu chuỗi các mẫu giọng nói từ cơ sở dữ liệu để tạo ra giọng nói tự nhiên nhất Tuy nhiên, quá trình này có thể gặp phải sự cố âm thanh do sự không khớp về biên độ và âm sắc giữa các mẫu giọng nói Để giảm thiểu ảnh hưởng này, cần áp dụng quy trình cân bằng âm thanh.
THIẾT KẾ HỆ THỐNG
Sơ đồ hệ thống
Hình 3.1 Sơ đồ hệ thống
Sơ đồ DFD
Hình 3.2 Sơ đồ DFD level 1
HÌnh 3.3 Sơ đồ DFD level 2
Sơ đồ tuần tự
Hình 3.4 Sơ đồ tuần tự
THỰC NGHIỆM
Thu thập dữ liệu
Sử dụng nguồn hình ảnh từ Kaggle, bài viết này tập trung vào hình ảnh bàn tay đại diện cho các ký tự trong bảng chữ cái tiếng Anh và các chữ số từ 0 đến 9, với mỗi ký tự được cung cấp 70 hình ảnh khác nhau.
Hình 4.1 Ảnh bàn tay để làm dữ liệu đầu vào
4.1.2.1 Thư viện cần dùng import cv2 from cvzone.HandTrackingModule import HanDectector import numpy as np import os
- Lớp HandDetector dùng để theo dõi và nhận diện bàn tay, cung cấp các thông tin vị trí bàn tay, tọa độ các điểm mốc của bàn tay.
- Thư viện OpenCV (cv2) để xử lý ảnh và video
- Thư viện Numpy: để tính toán số học và làm việc với mảng dữ liệu
- Thư viện os: để tương tác với hệ điều hành
4.1.2.2 Nhận diện bàn tay trong ảnh
Tìm kiếm bàn tay từ hình ảnh
To identify hands in an image, use the function `hd.findHands(frame, drawse, flipType=True)` If hands are detected, retrieve the first hand's bounding box coordinates with `hand[0]['bbox']` If no hands are found, print "No hands detected." Then, extract the image segment containing the hand using the coordinates, adjusting with an offset Finally, apply `hd2.findHands(frame, drawse, flipType=True)` for further hand detection analysis.
- Lấy ra tọa độ bao quanh bàn tay (bbox)
- Danh sách các điểm mốc (landmarks) của bàn tay, mô tả vị trí các khớp ngón tay và lòng bàn tay (lmList)
- Tọa độ trung tâm của bàn tay (center)
- Loại bàn tay ( phải hoặc trái) (type)
Hình 4.2 Ví dụ tọa độ bàn tay tìm được từ một hình ảnh
4.1.2.3 Vẽ đường skeleton lên bàn tay
Căn cứ vào tọa độ các điểm mốc (landmarks) của bàn tay, mô tả vị trí các khớp ngón tay và lòng bàn tay
- Vẽ các đoạn thẳng giữa các điểm liên tiếp trên các ngón: ngón cái (landmarks từ 0
→ 4) , ngón trỏ (landmarks từ 5 → 8), ngón giữa (landmarks từ 9 → 12), ngón áp út (landmarks từ 13 → 16) và ngón áp út (landmarks từ 17 → 20).
- Vẽ các điểm mốc trên bàn tay (từ 0 → 21).
Hình 4.3 Hình ảnh đánh dấu các điểm ngón tay if handz: hand = handz[0] pts = hand[0]['lmList']
# Vẽ skeleton lên ảnh tay os = 0 os1 = 0
To draw continuous lines between specific points on a frame, the code utilizes the OpenCV library It creates lines in green color by iterating through designated ranges of points, connecting them sequentially Lines are drawn from points 0 to 4, 5 to 8, 9 to 12, 13 to 16, and 17 to 20 Additionally, lines connect points 5 to 9, 9 to 13, and 13 to 17 The code also includes connections from point 0 to 5 and point 0 to 17 Furthermore, it draws red circles around all 21 points to highlight their positions on the frame.
Cho ra được hình ảnh skeleton của từng ảnh tương ứng với các ký tự:
Hình 4.4 Hình ảnh skeleton thu được
Sử dụng CNN nhận diện ngôn ngữ ký hiệu
4.2.1 Xây dựng mô hình CNN
1 Import các thư viện import os import cv2 import numpy as np import matplotlib.pyplot as plt from tensorflow.keras import utils from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activation from tensorflow.keras.regularizers import l2 from tensorflow.keras.optimizers import Adam from tensorflow.keras.preprocessing.image import
ImageDataGenerator from tensorflow.keras.callbacks import ModelCheckpoint from sklearn.model_selection import train_test_split from time import time
- os: Thư viện này giúp tương tác với hệ thống tập tin (đọc, ghi, kiểm tra thư mục).
- cv2: Thư viện OpenCV dùng để xử lý hình ảnh (đọc và thay đổi kích thước ảnh).
- numpy: Được sử dụng để làm việc với mảng dữ liệu số học.
- matplotlib.pyplot: Được sử dụng để vẽ đồ thị và biểu đồ.
- tensorflow.keras: Bộ công cụ của Keras trong TensorFlow dùng để xây dựng mô hình mạng nơ-ron sâu.
- ImageDataGenerator: Tạo dữ liệu tăng cường (augmentation) cho ảnh để làm tăng tính đa dạng của tập dữ liệu huấn luyện.
- train_test_split: Dùng để chia dữ liệu thành các tập huấn luyện, kiểm tra và thử nghiệm.
- time: Để đo thời gian thực thi.
2 Khởi tạo thư mục và danh sách lớp synthetic_dir = '/kaggle/input/skeletonhand/hand_skeleton' classes = ['A', 'B', 'Blank', 'C', 'D', 'E', 'F', 'G', 'H',
- synthetic_dir: Đường dẫn đến thư mục chứa dữ liệu hình ảnh của bộ xương tay.
- classes: Danh sách các lớp (chữ cái ký hiệu ngôn ngữ tay) mà mô hình sẽ phân loại.
3 Hàm load_data để tải và chia dữ liệu def load_data(synthetic_train_dir, synthetic_test_dir): images = [] labels = [] size = 128, 128 index = -1 for folder in classes: index += 1 for image in os.listdir(os.path.join(synthetic_train_dir, folder)): temp_img = cv2.imread(os.path.join(synthetic_train_dir, folder, image))
To resize images directly without cropping, utilize the cv2.resize function to adjust the image dimensions and append the processed images and their corresponding labels to the lists Convert the images to a NumPy array and normalize the pixel values by changing their data type to 'float32' and dividing by 255.0 Use the utils.to_categorical function to one-hot encode the labels Split the dataset into training and testing sets with a 90-10 ratio using train_test_split, and print the number of images loaded for training and testing along with their respective shapes This process efficiently prepares the images and labels for further analysis or model training.
- Duyệt qua các thư mục, mỗi thư mục đại diện cho một lớp (ví dụ: A, B, C…).
- Đọc từng hình ảnh trong mỗi thư mục sử dụng OpenCV (cv2.imread).
- Chuyển đổi hình ảnh về kích thước 200x200 pixels bằng cv2.resize.
- Chuẩn hóa hình ảnh (chia giá trị pixel cho 255.0 để các giá trị nằm trong phạm vi
- Mỗi lớp được gán một nhãn số nguyên (0, 1, 2, …).
Sử dụng hàm utils.to_categorical để chuyển đổi các nhãn thành định dạng one-hot encoding, trong đó mỗi nhãn được biểu diễn bằng một mảng với giá trị 1 ở vị trí tương ứng với lớp và giá trị 0 ở các vị trí còn lại.
Dữ liệu hình ảnh và nhãn được phân chia thành ba phần chính: tập huấn luyện (train), tập kiểm định (validation), và tập kiểm thử (test) bằng cách sử dụng hàm train_test_split từ thư viện sklearn.
- Tỷ lệ chia được xác định bởi các tham số val_split và test_split, với phần còn lại dành cho tập huấn luyện.
4 Tăng cường dữ liệu (Data Augmentation)
Data augmentation is a technique that enhances the quantity and diversity of training data by generating variations of the original images This process enables models to learn more generalized features and reduces the risk of overfitting By utilizing ImageDataGenerator, training data can be augmented through random transformations such as rotation, shifting, flipping, and zooming The configuration for data augmentation can include parameters like rotation range, width and height shift ranges, shear, zoom, and horizontal flipping, with the fill mode set to 'nearest' for optimal results.
5 Xây dựng mô hình CNN
Xây dựng mô hình CNN bao gồm các lớp tích chập, lớp gộp và lớp dense theo lý thuyết đã trình bày Để nâng cao khả năng trích xuất đặc trưng của mô hình, nhóm thực hiện quá trình nhân chập và gộp nhiều lần Số lượng lớp được xác định bởi biến classes_count = len(classes).
Conv2D Layers (Lớp tích chập): Các lớp Conv2D có nhiệm vụ trích xuất các đặc trưng từ hình ảnh đầu vào.
Lớp tích chập đầu tiên trong mô hình là Conv2D với 64 bộ lọc kích thước 3x3 và padding 'same', giúp duy trì kích thước hình ảnh 200x200 pixel và 3 kênh màu RGB Mô hình được xây dựng với tham số batch = 64, epochs = 100 và learning_rate = 0.001.
To build a convolutional neural network, start by adding convolutional layers with increasing filters, beginning with 64 filters in a 3x3 kernel and 'same' padding for an input shape of (200, 200, 3) Follow each convolutional layer with Batch Normalization and ReLU activation to enhance learning Implement MaxPooling2D with a pool size of (2, 2) after each convolutional block to reduce dimensionality Continue this pattern by adding layers with 128, 256, and finally 512 filters, each time applying Batch Normalization, ReLU activation, and MaxPooling2D to maintain performance and efficiency in the model.
The fully connected layers in the model are structured as follows: first, the input is flattened, followed by a dropout layer set at 0.5 to reduce overfitting Then, a dense layer with 1024 units is added, incorporating L2 regularization at a rate of 0.01 This is succeeded by batch normalization and a ReLU activation function Another dropout layer at 0.5 follows, leading to the final dense layer, which uses softmax activation to output the class probabilities This architecture effectively balances complexity and regularization to enhance model performance.
# Compile model model = build_model() adam = Adam(lr=learning_rate) model.compile(optimizeram, loss='categorical_crossentropy',metrics=['accuracy'])
- Các lớp tiếp theo có số bộ lọc tăng dần (128, 256, 512), giúp mô hình học các đặc trưng phức tạp hơn ở các mức độ sâu hơn của mạng.
Mỗi lớp Conv2D được kết hợp với BatchNormalization, giúp chuẩn hóa đầu ra, cải thiện sự hội tụ của mô hình và giảm độ lệch của giá trị đặc trưng, từ đó làm cho quá trình huấn luyện trở nên ổn định hơn.
- Hàm kích hoạt ReLU (Rectified Linear Unit) giúp mô hình học các đặc trưng phi tuyến tính từ dữ liệu.
MaxPooling2D(pool_size=(2, 2)) là một kỹ thuật quan trọng trong mạng nơ-ron tích chập, giúp giảm kích thước của hình ảnh sau mỗi lớp tích chập Việc này không chỉ giảm số lượng tham số và khối lượng tính toán mà còn giữ lại những đặc trưng quan trọng nhất của hình ảnh.
- Sau các lớp tích chập, hình ảnh được "phẳng hóa" (flatten) để chuyển từ dạng 2D (hình ảnh) sang dạng 1D (vector) trước khi đưa vào các lớp Dense.
- Dense(1024, kernel_regularizer=l2(0.01)): Lớp fully connected với 1024 nơ-ron. Hàm L2 Regularization (trọng số 0.01) giúp giảm overfitting bằng cách phạt các trọng số lớn.
- Sau đó, lớp BatchNormalization và hàm kích hoạt ReLU được áp dụng.
- Dense(classes_count, activation='softmax'): Lớp cuối cùng với số lượng nơ-ron bằng số lớp phân loại, sử dụng Softmax để tính xác suất cho từng lớp.
The function build_model() creates and returns a deep learning model that consists of convolutional layers and fully connected layers, designed for effective data processing and analysis.
- Adam(lr=learning_rate): Khởi tạo bộ tối ưu hóa Adam với tốc độ học (learning rate) được đặt là 0.001.
- model.compile(): Biên dịch mô hình với các tham số:
- optimizeram: Sử dụng Adam làm bộ tối ưu.
- loss='categorical_crossentropy': Hàm mất mát (loss function) phù hợp với bài toán phân loại nhiều lớp, tính toán độ sai lệch giữa dự đoán và nhãn thực tế.
- metrics=['accuracy']: Theo dõi độ chính xác (accuracy) trong quá trình huấn luyện và đánh giá mô hình.
4.2.2 Huấn luyện mô hình CNN
In this article, we discuss the process of training a model using the ModelCheckpoint callback to save the best-performing model based on validation accuracy The model is trained with data augmentation through the `datagen.flow` method, utilizing a specified batch size and a set number of epochs Additionally, we measure the training duration and provide a summary of the model's architecture at the end of the training process.
Tạo một đối tượng ModelCheckpoint để lưu mô hình tốt nhất trong quá trình huấn luyện:
- monitor='val_accuracy': Theo dõi độ chính xác trên tập xác thực (validation set).
- mode='max': Lưu mô hình khi độ chính xác trên tập xác thực đạt giá trị tối đa.
- save_best_only=True: Chỉ lưu mô hình khi nó là mô hình tốt nhất.
- verbose=1: Hiển thị thông tin chi tiết về quá trình lưu mô hình.
Lưu lại lịch sử huấn luyện của mô hình:
- datagen.flow(x_train, y_train, batch_sizetch): Sử dụng datagen để tạo ra các batch dữ liệu từ tập huấn luyện x_train và y_train với kích thước batch là 64.
- validation_data=(x_test, y_test): Dùng x_test và y_test để theo dõi độ chính xác.
- steps_per_epoch=len(x_train): Số bước trong mỗi epoch, được tính bằng cách chia tổng số mẫu trong tập huấn luyện cho kích thước batch.
- epochs=epochs: Số lần huấn luyện trên toàn bộ tập dữ liệu.
- callbacks=[checkpoint]:Sử dụng đối tượng checkpoint đã tạo để lưu mô hình.
Hình 4.5 Log quá trình huấn luyện mô hình
Hình 4.6 Hình ảnh đánh giá tính chính xác của model trong quá trình huấn luyện
Biểu đồ minh họa quá trình huấn luyện mô hình học sâu cho thấy sự gia tăng độ chính xác và sự giảm hàm mất mát trên cả tập huấn luyện và tập xác thực Điều này chứng tỏ rằng mô hình học sâu hoạt động hiệu quả, không gặp phải tình trạng overfitting và được tối ưu hóa tốt.
4.2.3 Đánh giá mô hình CNN
# Score trained model. results = model.evaluate(x_test, y_test, verbose=1)
# Giải nén các kết quả loss, acc, precision, recall = results f1 = 2*(precision*recall)/(precision + recall)
# In k ế t qu ả print(f"Loss: {loss:.2f}") print(f"Accuracy: {acc:.2f}") print(f"Precision: {precision:.2f}") print(f"Recall: {recall:.2f}") print(f"F1-score: {f1:.2f}")
Hình 4.7 Kết quả đánh giá model
- Loss: Giá trị loss là 0.25, cho thấy mô hình hoạt động hiệu quả với mức chênh lệch nhỏ giữa dự đoán và giá trị thực tế.
- Accuracy: Mô hình đạt độ chính xác 93%, phản ánh khả năng dự đoán đúng phần lớn các mẫu.
- Precision: Precision đạt 0.93, cho thấy trong các dự đoán dương, 93% là chính xác, hạn chế tốt dự đoán sai.
- Recall: Mô hình nhận diện đúng 93% các mẫu dương, cho thấy khả năng phát hiện hiệu quả.
Sử dụng Transformer khôi phục dấu cho bộ dữ liệu không dấu
Tiếng Việt không dấu có thể được xem như một ngôn ngữ mới, và việc dịch ngược nó về Tiếng Việt có dấu là cần thiết Ví dụ, câu "toi di hoc" sẽ được chuyển thành "tôi đi học".
Dataset Old Newspapers từ Kaggle chứa khoảng 16 triệu câu, trong đó có khoảng 720,000 câu bằng Tiếng Việt Dữ liệu này được lưu trữ trong một file tsv với kích thước gần 6 GB.
Ta sẽ lọc ra các câu Tiếng Việt, và lưu chúng cùng bản không dấu ra một file riêng.
- Sử dụng ngôn ngữ lập trình Python và famework Keras
To read data from a file and split it into training, validation, and test sets, use the following code: from data_loader import load_data Set the file path to 'dataset/old-newspaper-vietnamese.txt' and load the data with the command train_pairs, val_pairs, test_pairs = load_data(file_path, limit) This process ensures effective data management for machine learning tasks.
To create source and target vectorizations from the training dataset, these vectorizations are essential for converting text data into tensors This conversion enables the training of deep learning models using these tensors It is important to save the vectorizations for future use The process can be implemented using the following code: `from data_loader import load_data, save_vectorization; source_vectorization, target_vectorization = create_vectorizations(train_pairs); save_vectorization(source_vectorization, target_vectorization)`.
'result/source_vectorization_layer.pkl') save_vectorization(target_vectorization,
'result/target_vectorization_layer.pkl')
To convert our dataset from text format to tf.data.Dataset, we will create separate tf.data.Datasets for training, validation, and testing By utilizing the `make_dataset` function from the `data_loader`, we set a batch size of 64 and generate the training dataset (`train_ds`), validation dataset (`val_ds`), and test dataset (`test_ds`) using the respective pairs and vectorization methods This structured approach allows us to effectively use these datasets during the evaluation phase.
- Dùng lớp TransformerModel để train model.
Utilize default settings for your model by configuring the embedding layer to 256 dimensions, the dense layer to 2048 dimensions, employing 8 attention heads, and applying a dropout rate of 0.5 for optimal performance.
TransformerModel(source_vectorization=source_vectorization , target_vectorization=target_vectorization)
Train the model for 50 epochs, retaining only the version with the highest validation accuracy Utilize the `transformer.build_model` function with the optimizer set to "rmsprop" and the loss function as "sparse_categorical_crossentropy," while tracking accuracy as a metric Fit the model using `transformer.fit`, specifying the training dataset, the number of epochs, and the validation dataset Implement a callback with `tf.keras.callbacks.ModelCheckpoint` to save the best model based on validation accuracy, storing it in 'result/restore_diacritic.keras'.
Trong lần huấn luyện đầu tiên, mô hình đạt được test loss là 0.6837 và test accuracy là 69.13% Điều này cho thấy mô hình chỉ dự đoán đúng token tiếp theo với xác suất 69.13%.
Hình 4.12 Biểu đồ giá trị loss/accuracy tại từng epoch
- Từ biểu đồ ta thấy validation loss/accuracy là xấp xỉ training loss/accuracy nghĩa là model đang bị underfitting
- Tăng số dimension trong layer embed lên 256 và layer Dense của Transformer, tăng số attention head lên 16, và giảm tỷ lệ dropout.
- Thiết lập 8.192 dimension trong layer Dense của Transformer, 8 attention head, dropout với tỷ lệ là 0.2.
Hình 4.13 Biểu đồ giá trị loss/accuracy tại từng epoch sau khi tăng capacity
- Đạt được validation accuracy là 90%.
- Train toàn bộ dữ liệu và bỏ layer Dropout train_pairs, val_pairs, test_pairs = load_data(file_path, limit=None) transformer =
TransformerModel(source_vectorization=source_vectorization, target_vectorization=target_vectorization, dense_dim92, num_heads=8, drop_out=0)
- Được test accuracy là 94.05% transformer.evaluate(test_ds)
Hình 4.14 Biểu đồ giá trị loss/accuracy tại từng epoch cuối cùng
- Áp dụng vào dự án import tensorflow as tf from transformer_model import TransformerModel from data_loader import load_vectorization_from_disk
# Tải vectorization source_vectorization = load_vectorization_from_disk('source_vectorization_layer.pkl') target_vectorization = load_vectorization_from_disk('target_vectorization_layer.pkl')
# Tải model đã huấn luyện transformer = TransformerModel( source_vectorization=source_vectorization, target_vectorization=target_vectorization, model_path='restore_diacritic.keras'
# Dự đoán và khôi phục dấu cho văn bản không dấu restored_text = transformer.predict(text) return restored_text
# Ví dụ sử dụng input_texts = [
"em con nho hay em da quen",
"ha noi mua nay vang nhung con mua",
"dat nuoc toi thon tha giot dan bau",
] for text in input_texts: output = restore_diacritics(text) print(f"Input: {text} -> Output: {output}")
Hình 4.15 Kết quả đạt được
Hình 4.16 Câu khi nhận diện chưa được thêm dấu
Hình 4.17 Câu khi đã được thêm dấu
Chuyển đổi câu văn thành giọng nói
Cuối cùng, mô hình chuyển đổi văn bản tiếng Việt thành giọng nói sử dụng thư viện Google Text-to-Speech (gTTS) của Python, cho phép thực hiện nhờ API Text-to-Speech từ Google Translate Thư viện này nhẹ, dễ sử dụng và hỗ trợ nhiều ngôn ngữ, bao gồm tiếng Việt Người dùng có thể tùy chỉnh ngôn ngữ, tốc độ đọc và tạo file mp3 để lưu trữ Cách ứng dụng thư viện này như sau: từ gtts import gTTS, từ pydub import AudioSegment, từ pydub.playback import play, từ playsound import playsound.
- Thư viện pydub để thao tác với các tệp âm thanh: cắt ghép, điều chỉnh âm lượng,
- Playsound là một thư viện được sử dụng để phát tệp âm thanh.
To create a function named `speak_func` that converts a sentence into speech after punctuation is added, use the following code: ```pythondef speak_func(self): tts = gTTS(self.str, lang='vi') tts.save("speak_file.mp3") audio = AudioSegment.from_mp3("speak_file.mp3") faster_audio = audio.speedup(playback_speed=1.25) faster_audio.export("speak_file_fast.mp3", format="mp3") playsound("speak_file_fast.mp3") os.remove("speak_file.mp3") os.remove("speak_file_fast.mp3")```This function utilizes the gTTS library for text-to-speech conversion, speeds up the audio playback, and cleans up temporary files afterward.
Để tạo đối tượng tts, bạn sử dụng hàm khởi tạo của lớp gTTS với hai tham số đầu vào: self.str chứa đoạn văn bản và lang = 'vi', trong đó lang xác định ngôn ngữ của giọng nói là tiếng Việt.
- tts.save(): Lưu file âm thanh đã được chuyển đổi từ văn bản.
- Dùng pydub để đọc tệp âm thanh speak_file.mp3 và tạo một đối tượng
Tăng tốc độ phát lại âm thanh lên 1.25, nhanh hơn 25% so với tốc độ gốc, và lưu trữ vào biến faster_audio Sau đó, xuất đối tượng này thành tệp với tên speak_file_fast.mp3.
- Sử dụng thư viện playsound để phát âm thanh từ tệp speak_file.mp3.
- Xóa các tệp speak_file.mp3 và speak_file_fast.mp3 sau khi đã phát âm thanh.
Source code dự án
Source code dự án nhóm 06