Trong bài này tôi thiết kế hệ thông nhận diện số đếm bằng tay từ 1 đến 10 trong bảng thủ ngữ sau: Hình 1 – Bảng số đếm bằng tay Mô hình Máy Học Tập: Xây dựng mô hình học sâu sử dụng mạ
Trang 1TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT
BỘ MÔN TRÍ TUỆ NHÂN TẠO
-*** -
BÀI TẬP LỚN
MÔN TRÍ TUỆ NHÂN TẠO – 7080122-02
Đề tài:
XÂY DỰNG MÔ HÌNH MÁY HỌC TẬP Cán bộ giảng dạy Sinh viên thực hiện
GV Trần Trường Giang Nguyễn Đức Nam-1921050411
HÀ NỘI-2022
Trang 2<ND1>: Mô tả về dự án
Mục đích: Xây dựng một hệ thống nhận dạng bàn tay để đoán ra
các ký tự mà người khuyết tật muốn nói trong thời gian thực Trong bài này tôi thiết kế hệ thông nhận diện số đếm bằng tay từ
1 đến 10 trong bảng thủ ngữ sau:
Hình 1 – Bảng số đếm bằng tay
Mô hình Máy Học Tập: Xây dựng mô hình học sâu sử dụng mạng
nơ-ron tổ hợp tích chập – Convolution Neural Network
Môi trường dự án: Python virtual environment - Môi trường lập trình ảo
Python
Ngôn ngữ: Python
Bộ thư viện: Tensorflow, Keras
IDE: Visual Studio Code
Tạo môi trường lập trình ảo: Tại terminal cho thư mục chưa project thực
hiện câu lệnh “py –m venv venv” để tạo môi trường lập trình ảo “venv” cho ngôn ngữ Python phiên bản hiện dùng Các thư viện sử dụng liên quan đều được cài trong môi trường này
Trang 3Hình 2 – Môi trường lập trình ảo Python
<ND2>: Mô tả về quá trình tạo dữ liệu huấn luyện
Viết file “gesture_data.py” với mục đích tạo dữ liệu huấn luyện như sau:
Tạo thư mục “data” chứa thư mục “train” và “test”: Thực hiện
kiểm tra xem đã tồn tại thưc mục “data” hay chưa, nếu đã tồn tại in ra màn hình thông báo “The directory containing the data already exists” Nếu chưa tồn tại, tiến hành tạo thư mục “data”, bên trong tạo 2 thư mục con “train” và “test” Bên trong mỗi thư mục con tạo 10 thư mục chứa ảnh cho huấn luyện mô hình Kết quả thu được như hình dưới
Trang 4Hình 3 – Tạo các thư mục chứa dữ liệu huấn luyện
Trang 5Hình 4 – Thư mục chưa dữ liệu huấn luyện Thu thập hình ảnh ký hiệu tay của từng số đếm (từ 1 đến 10) bằng camera máy tính, lưu hình ảnh thu được vào thư mục cùng tên tương ứng: Thiết kế vòng lặp thu thập dữ liệu cho tập [“train”, “test”], với mỗi tập thực hiện vòng lặp thu thập dữ liệu cho từng folder từ 1 đến 10 của mỗi tập Thu thập 300 ảnh với mỗi ký hiệu đối với tập “train” và 100 ảnh đối với tập “test”
Hình 5 – Vòng lặp thu thập dữ liệu Đầu tiên cần xác định nền (back ground) của ảnh, qua đó giúp máy tính nhận dạng được hình ảnh tay khi đưa vào Xác định nền của ảnh
trong 60 frame đầu tiên Việc xác định nền chỉ cần làm 1 lần duy nhất
trong vòng lặp lấy ảnh cho số 1 của tập “train” Đối với các lần tiếp theo
sẽ lấy 60 frame đó là thời gian nghỉ để chuẩn bị cho việc thu thập số tiếp theo
Trang 6Hình 6 – Giao diện nhận dạng nền Việc xác nhận nền là cơ sở để thu thập ảnh, giúp máy tính tính toán được hình ảnh thu được với mỗi frame khi đưa tay vào nhận diện Cần giữ máy ảnh cố định trong suốt quá trình thu thập dữ liệu
File “gesture_data.py” được thiết kế thu thập toàn bộ dữ liệu
“train”, “test” cho 10 số trong một lần chạy duy nhất, có 1 khoảng nghỉ
60 frame cho mỗi chuyển đổi giữa các số để người thực hiện có thời gian định hình ký hiệu tay
Trang 7Hình 7 – Thu thập dữ liệu Trong quá trình thu thập dữ liệu cần điều kiện đủ sáng, hình ảnh thu được sẽ sắc nét hơn
<ND3>: Mô tả quá trình huấn luyện
Viết file “gesture_training.py” với mục đích huấn luyện mô hình
như sau:
Hình ảnh đưa vào huấn luyện được resize về kích thước 64x64, chia mỗi bath gồm 10 ảnh
Mô hình học sâu mạng nơ-ron tổ hợp tích chập được xây dựng như sau:
Trang 8Hình 8 – Xây dựng kiến trúc mô hình học sâu
Trang 9Hình 9 – Kiến trúc mô hình học sâu
Do việc thu thập lại data không được tối ưu, nên sử dụng model cũng không đạt được Accyracy cao, vậy nên em đã viết lại kiến trúc mô hình học sâu như trên Mô hình được xây dựng theo ý tưởng của mô hình VGG16, 2 lớp Conv2D + 1 lớp Pooling Do hạn chế cấu hình máy
Trang 10tính còn yếu, không đáp ứng đủ nhu cầu training model với lượng layer
cao và các kỹ thuật khác như áp dụng Batch Normalization, Skip
Connection,
Huấn luyện mô hình trong khoảng 10 phút đạt kết quả như sau:
Hình 10 – Đồ thị hàm loss và hàm accuracy
Trang 11Hình 11 – Confusion matrix
Hình 12 – Quá trình huấn luyện Trong quá trình huấn luyện mô hình, thông số quan trọng nhất cần
quan sát là loss, val_loss, accuracy, val_accuracy và lr Learning rate sẽ
thay đổi nhằm mục đích mô hình học tốt nhất có thể
Từ hình 12 cho thấy việc ánh xạ của mô hình từ X sang y đã được
Trang 12thực hiện tốt, nói cách khác model đã có thể hiểu được các ký hiệu tay
có trong tập “train” ứng với con số này đang được thể hiện Tuy nhiên val_accuracy hay chính là Accuracy của tập “test” chưa được cao Điều này sẽ tiếp tục được thảo luận trong phần tiếp theo
<ND4>: Mô tả quá trình chạy mô hình đã được huấn luyện (chạy chương trình nào, mô hình đã được huấn luyện được lưu vào tệp tin có tên là gì)
Viết file “gesture_model.py” với mục đích sử dụng mô hình đã được huấn
luyện vào sử dụng thực tế như sau:
Mô hình đã được huấn luyện được lưu vào tệp tin có tên là
“BTL_CNN_model.h5”
<ND5>: Viết những nhận xét của riêng bạn về quá trình huấn luyện mô hình Máy Học Tập (viết nếu bạn huấn luyện được mô hình, ngược lại không cần viết)
Để mô hình hoạt động tốt việc tạo dữ liệu là vô cùng quan trọng
Dữ liệu có đúng, chính xác, đa dạng thì mô hình mới có thể học tập và thực hành chính xác được
Trong quá trình huấn luyện mô hình, giới hạn phần cứng ảnh
hưởng nhiều đến việc viết mô hình học sâu, cần sử dụng GPU với dung lượng bộ nhớ cao giúp chạy được mô hình lớn, tốc độ cao, cải thiện
được kết quả bài toán
Nhìn chung mô hình được huấn luyện đã nhận diện được ký hiệu tay cho các con số, tuy nhiên mô hình dễ nhận diện nhầm các số khi đưa tay không đúng góc nhìn của camera Điều này lý giải do lượng dữ liệu đưa vào học chưa được tường minh, cử chỉ tay khi tạo dữ liệu chưa được dứt khoát, dễ gây hiểu nhầm, đồng thời dữ liệu chưa được phái sinh như lật, xoay, thu phóng kích thước để là đa dạng dữ liệu
Dựa vào các hình 10 11 và 12 có thể nhận thấy mô hình học tập chưa tốt Biện minh cho kết quả này có các lý do như sau:
- Dữ liệu chuẩn bị chưa tốt, số lượng ít, chưa đa dạng
- Mô hình học tập thiết kế đơn giản, số lượng tham số, lớp chưa đảm bảo, chưa áp dụng các kỹ thuật tiên tiến
<ND6>: Tìm hiểu về mạng nơ-ron tích chập
Mô hình đã được huấn luyện theo dữ liệu tự thu thập và mô hình tự
Trang 13thiết kế
<ND7>: Trực quan hóa sơ đồ mạng nơ-ron tổ hợp tích chập
Hình 13 – Xây dựng kiến trúc mạng nơ-ron tổ hợp tích chập
Hình 14 – Sơ đồ mạng nơ-ron tổ hợp tích chập Filers = [32, 64] thể hiện ở lớp Conv2D đầu tiên xuất hiện có filter = 32, lần tiếp theo xuất hiện có filter = 64 Tương tự với các
ký hiệu khác
Tham số:
kernel_size(3, 3) – là kích thước của kernel hình vuông 3 x3
trong phép toán tích chập ảnh Kernel trượt lần lượt theo bước nhảy strides từ trái qua phải, từ trên xuống dưới và thực hiện phép tích chập với ảnh như hình 14 Việc lấy size của kernel thích hợp với mục tiêu của lớp và bài toán Tuy nhiên kích thức của kernel phải là
số lẻ để kernel có tâm, việc tích toán tránh phát sinh các vấn đề khác
Trang 14Hình 15 – Phép tích chập của lớp Conv2D
activation=’relu’ – là 1 hàm kích hoạt f(x) =max(0, x) Có
nhiều hàm kích hoạt khác nhau, mỗi hàm có một ưu điểm nhược điểm riêng Từ lâu ta đã biết các hàm như Sigmoid, Sofmax, Tanh… Hàm ReLU gần đây được sử dụng phổ biến khi huấn luyện các mạng nơ-ron ReLU đơn giản lọc các giá trị < 0 Nhìn vào công thức chúng
ta dễ dàng hiểu được cách hoạt động của nó Một số ưu điểm khá vượt trội của nó so với sigmoid và tanh:
(+) Tốc độ hội tụ nhanh hơn hẳn ReLU có tốc độ hội tụ nhanh gấp 6 lần Tanh Điều này có thể do ReLU không bị bão hoà ở 2 đầu như Sigmoid và Tanh
(+) Tính toán nhanh hơn Tanh và Sigmoid sử dụng hàm exp
và công thức phức tạp hơn ReLU rất nhiều do vậy sẽ tốn nhiều chi phí hơn để tính toán
(-) Tuy nhiên ReLU cũng có một nhược điểm: Với các node
có giá trị nhỏ hơn 0, qua ReLU activation sẽ thành 0, hiện tượng đấy gọi là “Dying ReLU“ Nếu các node bị chuyển thành 0 thì sẽ không
có ý nghĩa với bước linear activation ở lớp tiếp theo và các hệ số tương ứng từ node đấy cũng không được cập nhật với gradient descent Từ đó Leaky ReLU ra đời
(-) Khi learning rate lớn, các trọng số (weights) có thể thay đổi theo cách làm tất cả nơ-ron dừng việc cập nhật
Trang 15Hình 16 – Đồ thị hàm ReLU
pool_size(2, 2) – là kích thước của kernel hình vuông cạnh 2x2
khi thược hiện phép pooling Khi kernel di chuyển theo stride sẽ lấy toàn bộ các giá trị nằm trong phạm phi kích thước của nó và thực hiện phép pooling tương ứng (max, min, aveg) Như hình dưới là pooling_size(2,2)
Hình 17 - Pooling
strides=2 – là bước nhảy của kernel như hình 16 Kernel di
chuyển qua 2 pixel 1 lần nhảy từ trái qua phải xong từ trên xuống dưới
Sequential() của Keras – là mô hình tuần tự là đơn giản nhất
Trang 16cho thiết kết model học sâu Nó được gọi là “sequential” vì nó liên quan đến việc xác định một lớp Sequential và thêm từng lớp vào
mô hình theo cách tuyến tính, từ đầu vào đến đầu ra
Theo hình 13 là một mô hình tuần tự Mô hình tuần tự rất dễ
sử dụng vì có thể tiếp tục gọi model.add() cho đến khi đã thêm tất
tham khảo qua trang về API chính thức của Keras
Để thiết kết một mô hình Sequential() của Keras cần khai báo tên của model, sau đó input , các lớp layer và sau cùng là output Người dùng có thể tùy biết thiết kế model theo ý thích, miễn sao đảm bảo được shape của model, kích thước input phải đủ lớn để có thể tăng chiều sâu theo tham số strides sử dụng Cần xác định mục đích bài toán để lựa chọn activation hợp lý tại output
Sau đây là một số API phổ biến được sử dụng trong mô hình Sequential của Keras
Convolution layers:,
Conv1D layer, Conv2D layer, Conv3D layer
DepthwiseConv2D layer
Conv3DTranspose layer
Optimizers: SGD, RMSprop, Adam, Adadelta, Adagrad, Adamax,
Nadam, Ftrl
Losses: Probabilistic losses, Regression losses, Hinge losses for
"maximum-margin" classification
Và nhiều API khác nữa, cần đọc và tuân thủ các cú pháp của Keras đưa ra (https://keras.io/api/)