Người khuyết tật về nghe và nói gặp nhiều khó khăn trong giao tiếp với cộng đồng. Ngôn ngữ ký hiệu là phương tiện giao tiếp chính của họ, nhưng không phải ai cũng hiểu được. Vì vậy, việc xây dựng một hệ thống nhận diện cử chỉ tay giúp chuyển đổi ngôn ngữ ký hiệu thành văn bản hoặc giọng nói là rất cần thiết.
Với sự phát triển của trí tuệ nhân tạo (AI) và thị giác máy tính, đề tài này tập trung nghiên cứu và ứng dụng các mô hình học sâu để nhận diện cử chỉ tay, giúp người khuyết tật giao tiếp thuận tiện hơn. Hệ thống không chỉ hỗ trợ cá nhân mà còn góp phần tạo ra một môi trường giao tiếp thân thiện, hòa nhập hơn cho cộng đồng.
- Chuẩn bị dữ liệu: Tải bộ dữ liệu ASL Alphabet từ Kaggle, giải nén và sắp xếp dữ liệu theo từng lớp ký hiệu.
- Huấn luyện mô hình: Hỗ trợ các mô hình CNN, Xception để nhận diện cử chỉ tay. Theo dõi quá trình học qua biểu đồ và ma trận nhầm lẫn.
- Nhận diện từ ảnh: Cung cấp một ảnh chứa cử chỉ tay. Hệ thống hiển thị ảnh và dự đoán ký hiệu.
- Nhận diện từ video: Tải lên video có chứa cử chỉ tay. Hệ thống tách khung hình và dự đoán từng cử chỉ.
- Chuyển đổi giọng nói: Sau khi nhận diện, hệ thống phát âm thanh tương ứng với ký hiệu.
- Lưu và sử dụng lại mô hình: Mô hình được lưu lại để sử dụng sau mà không cần huấn luyện lại.
Hệ thống này được xây dựng với các công nghệ và thư viện sau:
- TensorFlow & Keras: Huấn luyện và triển khai mô hình nhận diện cử chỉ tay.
- Mô hình CNN & Xception: Dùng để học đặc trưng từ hình ảnh cử chỉ tay.
- Scikit-learn: Hỗ trợ tiền xử lý dữ liệu và đánh giá mô hình.
- OpenCV: Xử lý hình ảnh và video để phát hiện và nhận diện cử chỉ tay.
- NumPy & Pandas: Xử lý và quản lý dữ liệu.
- Matplotlib, Seaborn, Plotly: Vẽ biểu đồ để theo dõi quá trình huấn luyện.
- Mô hình CNN & Xception: Hiển thị kết quả huấn luyện và dự đoán trực quan.
- gTTS (Google Text-to-Speech): Chuyển đổi văn bản thành giọng nói sau khi nhận diện ký hiệu.
- TensorFlow/Keras hỗ trợ lưu mô hình đã huấn luyện để sử dụng lại mà không cần huấn luyện từ đầu.
Dữ liệu được sử dụng từ Kaggle:
- Bộ dữ liệu ASL Alphabet: Tải tại đây
- Sau khi tải, giải nén và sắp xếp vào thư mục phù hợp.
Cài đặt các thư viện bằng lệnh sau:
pip install opencv-python tensorflow keras numpy pandas scikit-learn matplotlib seaborn plotly gttsHệ thống có thể chạy trên Google Colab mà không cần cấu hình phức tạp. Chỉ cần tải notebook lên và chạy các ô lệnh theo thứ tự.
- Tải notebook lên Colab: Mở Google Colab.
- Cài đặt thư viện: Chạy ô lệnh sau trong Colab để cài đặt thư viện:
!pip install opencv-python tensorflow keras numpy pandas scikit-learn matplotlib seaborn plotly gtts
- Tải dữ liệu ASL Alphabet:
!kaggle datasets download -d grassknoted/asl-alphabet !unzip asl-alphabet.zip -d data/
- Kết nối với GPU (tùy chọn): Vào
Runtime>Change runtime type> ChọnGPUđể tăng tốc độ huấn luyện. - Chạy từng ô lệnh theo thứ tự trong notebook để huấn luyện và kiểm tra mô hình.
Nếu chạy trên Visual Studio Code hoặc môi trường cục bộ:
- Python 3.7 trở lên
- Cài đặt đầy đủ thư viện cần thiết (xem mục "Các thư viện Python cần thiết")
- GPU (tùy chọn): Nếu có GPU, cài đặt CUDA để tăng tốc huấn luyện mô hình
Nếu chưa có Python, hãy tải và cài đặt Python 3.7 trở lên từ python.org.
Sau đó, cài đặt các thư viện cần thiết bằng lệnh:
pip install -r requirements.txt(Nếu không có requirements.txt, dùng lệnh pip install opencv-python tensorflow keras numpy pandas scikit-learn matplotlib seaborn plotly gtts.)
Trên Google Colab: (Dự đoán bằng ảnh và video) Colab của tôi.
- Bước 1: Tải Dataset
- Link tải
- Bước 2: Tải thư viện
!pip install tensorflow opencv-python gtts scikit-learn seaborn
- Bước 3: Gắn link dataset
import os data='/content/asl_data/asl_alphabet_train/asl_alphabet_train' def create_dataframe(data_path): # List to store filepaths and labels filepaths = [] labels = [] # List all subfolders in the current data path folds = os.listdir(data_path) # Iterate through each subfolder for fold in folds: f_path = os.path.join(data_path, fold) imgs = os.listdir(f_path) # Iterate through images in the subfolder for img in imgs: img_path = os.path.join(f_path, img) # Append image path and corresponding label filepaths.append(img_path) labels.append(fold) # Create Pandas Series for filepaths and labels fseries = pd.Series(filepaths, name='Filepaths') lseries = pd.Series(labels, name='Labels') # Concatenate into a DataFrame and return return pd.concat([fseries, lseries], axis=1) # Create DataFrames for train, test, and val df = create_dataframe(data)
- Bước 4: Chia ra làm 3 để huấn luyện: 80% train, 10% test, 10% val
from sklearn.model_selection import train_test_split train_df, dummy_df = train_test_split(df, train_size= 0.8, shuffle= True, random_state= 42) valid_df, test_df = train_test_split(dummy_df, train_size= 0.5, shuffle= True, random_state= 42)
- Bước 5: Xây dựng mô hình Xception, CNN và huấn luyện AI
base_model = tf.keras.applications.xception.Xception(weights= 'imagenet' ,include_top = False , input_shape = (150,150,3) ,pooling = 'max' ) model = Sequential([ BatchNormalization(), Dense(256,activation = 'relu'), Dropout(.5), Dense(29 , activation= 'softmax' ) ]) model.compile(Adamax(learning_rate = 0.001) , loss = 'categorical_crossentropy' , metrics= ['accuracy']) history = model.fit( x= train_generator , validation_data= valid_generator , epochs= 5 , verbose = 1 , validation_steps= None, shuffle= False )
- Bước 6: Tích hợp Text-to-speech
!pip install gTTS # install the missing gTTS module from gtts import gTTS # import the gTTS module to make it accessible from IPython.display import Audio # Import Audio to play the output import IPython.display as ipd # import the ipd to be used later def text_to_speech(text, lang='en'): tts = gTTS(text=text, lang=lang) tts.save("output.mp3") ipd.display(ipd.Audio("output.mp3", autoplay=True))
- Bước 7: Dự đoán hình ảnh
class_labels = list(train_generator.class_indices.keys()) def predict_sign(model, img_path): # Load và xử lý ảnh img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (150, 150)) img = img / 255.0 # Chuẩn hóa về [0, 1] img = np.expand_dims(img, axis=0) # Thêm batch dimension predictions = model.predict(img) predicted_class = np.argmax(predictions) confidence = np.max(predictions) label = class_labels[predicted_class] return label, confidence, img # Return the image as well import matplotlib.pyplot as plt test_image = '/content/asl_data/asl_alphabet_test/asl_alphabet_test/A_test.jpg' # Đổi path tới hình bạn muốn test label, confidence, img = predict_sign(model, test_image) # Get the image from the function print(f"Dự đoán: {label}, Độ tin cậy: {confidence:.2f}") plt.imshow(img[0]) # Display the image using matplotlib plt.title(f"Predicted: {label}") plt.axis('off') plt.show() text_to_speech(label)
- Huấn luyện mô hình CNN/Xception: (Do đã có File huấn luyện từ trước có thể bỏ qua bước này)
- Chạy File train.py
- Nhận diện cử chỉ từ Camera:
- Chạy File predict.py
Phong Ngọc Anh (nhóm trưởng): Phát triển toàn bộ mã nguồn, triển khai dự án, đề xuất cải tiến, kiếm thử, thực hiện video giới thiệu, thuyết trình, Làm Power Point, Github
Bùi Trung Quân: Hỗ trợ làm Power Point, chỉnh sửa Video, Github
Vũ Đức Toàn: Biên soạn tài liệu Overleaf

