3.1.1 Cơ sở dữ liệu ảnh
Cơ sở dữ liệu ảnh bao gồm có các tập ảnh chứa tệp. Trong đó mỗi tập ảnh chứa nhiều ảnh với nhiều góc chụp, biểu cảm, …. Và những tập ảnh được dùng trong chương trình nhận diện.
3.1.2 Các bước thực hiện 3.1.2.1 . Tạo file train
Tạo một biến có tên là Dataset, sau đó sử dụng hàm “imageDatastore” để tải tập dữ liệu đối số đầu tiên của hàm này là đường dẫn đến tập dữ liệu mà bạn muốn tải tập dữ liệu của mình nằm trong thư mục làm việc.
Nhập tên dữ liệu “Dataset”, mà trong “Dataset” lại chứa các thư mục con phải sử dụng và giá trị của đối số này là “true”, nghĩa là đang bao gồm các thư mục con cần để gắn nhãn danh mục dữ liệu.
Bây giờ chúng ta có tập dữ liệu trong đối tượng tập dữ liệu mà chũng ta cần tách “Training Data” và “Validation Data” và sử dụng hàm “splitEachLabel” đối số đầu tiên của hàm này là đối số thứ hai của tập dữ liệu là tỷ lệ chia “Dataset” thành tỷ lệ 7:3, điều đó có nghĩa là 70% dữ liệu sẽ được sử dụng để train và 30% dữ liệu sẽ được sử dụng để tets, chia tách một cách ngẫu nhiên.
Dataset = imageDatastore('Dataset', 'IncludeSubfolders', true,
'LabelSource', 'foldernames');
[Training_Data, Validation_Data] = splitEachLabel(Dataset,
0.7,'randomized');
Sau đó lấy một biến có tên là “net” và dùng hàm “squeezenet” để nhận dạng khuôn mặt. Squeezenet sử dụng “anylyzeNetwork” để chạy mã là kiến trúc mạng.
net = squeezenet; analyzeNetwork(net)
“Input_Layer_Size” là kích thước đầu vào “net.Layer(1).InputSize (1:2)” . Sau đó lấy một biến có tên “Resize Trainning Data” để lưu trữ hình ảnh đã thay đổi kích thước mà chúng ta sử dụng “auqmentedImageDatastore” để thay đổi kích thước hình ảnh, “Training Data” sẽ được thay đổi kích thước thành “Input_Layer_Size”. Làm tương tự với “Validation Data”.
Input_Layer_Size = net.Layers(1).InputSize(1:2);
Resized_Training_Data = augmentedImageDatastore(Input_Layer_Size, Training_Data);
Resized_Validation_Data = augmentedImageDatastore(Input_Layer_Size, Validation_Data);
Sau đó lưu trữ “Network Architecture” bằng cách sử dụng hàm “layerGraph” trong biến “net”.
Sau đó lấy “Number of classes” mà ta có trong tập dữ liệu bằng cách sử dụng hàm numel, trong đó đối số là “categories” mà ta có trong “Training Data”.
Lấy một biến có tên “New Convolutional Layer” sử dụng hàm “convolution2dLayer” để sử đổi tích chập, đối số đầu tiên là thứ nguyên (“1,1” nghĩa là đối số 2d thứ hai là “Number of classes”)
Sử dụng “…” để chuyển đến một dòng mới, đối số tiếp theo là “WeightLearnRateFactor” với giá trị là 10, “BiasLearningRateFactor” với hệ số tỷ lệ là 10, cũng như đặt “name” vơí “Facial Feature Learner”.
Bây giờ chúng ta sẽ xác đinh “New Classification Layer” sử dụng chức năng “classificationLayer” thay đổi “Name” và đặt tên nó là “Face Classifier”.
Lấy một biến có tên là “New Network” và sử dụng “replaceLayer” để thay thế “Network Architecture”, thay thế “convio” hiện có với “New Convolutional Layer” Tôi muốn thay đổi lớp đầu ra theo phân loại mới, vì vậy “New Network” đã được xác định.
Network_Architecture = layerGraph(net);
Number_of_Classes = numel(categories(Training_Data.Labels));
New_Convolutional_Layer = convolution2dLayer([1, 1], Number_of_Classes, ...
'WeightLearnRateFactor', 10, ...
'BiasLearnRateFactor', 10, ...
'Name', 'Facial Feature Learner');
New_Classification_Layer = classificationLayer('Name', 'Face Classifier'); New_Network = replaceLayer(Network_Architecture, 'conv10',
New_Convolutional_Layer);
New_Network = replaceLayer(New_Network, 'ClassificationLayer_predictions', New_Classification_Layer);
Lấy một biến có tên “Training Options”, sau đó sử dụng hàm “trainingOptions” để chỉ định các tùy chọn đào tạo mà chúng ta muốn sử dụng quy tắc học tập “sgdm”, “MiniBatchSize” là 4, “MaxEpochs” là 10, “InitialLearnRate” tỷ lệ học tập là 4e-4, “Shuffle” với “every-epoch”, “ValidationData” với “Resized Training Data” được cây tần số xác thực, “ValidationFrequency” là 3, “Verbose” là “false”, “Plots” lập kế hoạch cho “training progress”, các “Training Options” đã được xác định.
Lấy một biến có tên là “Trained Network” và sử dụng chức năng “trainNetwork” để đào tạo mạng đối số đầu tiên là “Resized Training Data”, đối số thứ hai là “New Network”, đối số cuối cùng là “Training Options”.
Sau khi đào tạo, chúng ta lưu lại để sử dụng sau này, lưu dưới dạng “Face Recognizer.mat” và nó nằm trong biến “Trained Network”.
Training_Options = trainingOptions('sgdm', ... 'MiniBatchSize', 4, ... 'MaxEpochs', 10, ... 'InitialLearnRate', 4e-4, ... 'Shuffle', 'every-epoch', ... 'ValidationData', Resized_Training_Data, ... 'ValidationFrequency', 3, ... 'Verbose', false, ... 'Plots', 'training-progress');
Trained_Network = trainNetwork(Resized_Training_Data, New_Network, Training_Options);
3.1.2.2 Tạo file test
Trong ô “Command Windows của Matlab”, cấu trúc của mạng đã lưu của chúng ta tải mạng trong một biến có tên là x, chúng ta có thể thấy nó là một cấu trúc chứa “Trained Network”
Hình 17: Trained Network đã lưu
Để truy cập vào “Trained Network”, chúng ta phải sử dụng “x.Trained_Network”, bây giờ chúng ta có thể thấy nó là một mạng nơ-ron phức hợp với 68 dòng.
Hình 18: Kết quả truy cập Trained Network
Lấy một biến có tên “loaded Network” và load “Face_Recognizer.mat”, sau đó lấy “net” từ “loaded Network” và “Trained Network”.
Trong biến “net” để phân loại hình bằng cách sử dụng cnn, chúng ta có tập dữ liệu nó trả về là “Label” và “Probability” sử dụng “classify” hàm số đầu tiên của hàm là “net” được đào tạo và đối số thứ hai là “Resized Validation Data”.
Biến có tên “accuracy” để tính giá trị trung bình độ chính xác của các trường hợp khi “Label” được dự đoán bằng “Validation_Data.Files”.
Lấy một biến có tên “index” sau đó sử dụng hàm randperm để tạo vectơ số nguyên có bốn phần tử đại diện cho “Validation_Data.Files”.
Sử dụng “figure” bắt đầu một vòng lặp “for” lặp lại 4 lần. Sử dụng “subplot” 2x2 để vẽ 4 hình ảnh.
Trên hình đọc hình ảnh từ dữ liệu xác thực bằng cách sử dụng “Validation Data” và “index” Trước đó “imshow” hiển thị hình ảnh.
Lấy “label” của hình ảnh sử dụng cùng 1 “index”.
Sau đó sử dụng chức năng “title” để hiển thị “label” trên hình, nối một dấu phẩy, sau đó dùng hàm “num2str” để chuỗi đối số của 100 nhân với hàm max, nó sẽ tiếp tục xác suất tối đa của “index” hiện tại cho đến hết, để hiển thị xác suất bằng cách sử dụng ba chữ số, sau đó nối một ký hiệu tỷ lệ phần trăm
loaded_Network = load('Face_Recognizer.mat'); net = loaded_Network.Trained_Network;
[Label, Probability] = classify(net, Resized_Validation_Data); accuracy = mean(Label == Validation_Data.Labels)
index = randperm(numel(Validation_Data.Files), 6); figure for i = 1:6 subplot(2,3,i) I = readimage(Validation_Data, index(i)); imshow(I) label = Label(index(i)); title(string(label) + ", " + num2str(100*max(Probability(index(i), :)), 3) + "%"); end 3.2 Kết quả mô phỏng 3.2.1 Kết quả train
Nó có 68 lớp trong lúc này bạn tập trung trên dòng đầu tiên chỉ có kiểu đầu vào là hình ảnh có nghĩa là nó lấy hình ảnh làm đầu vào, kích thước của hình ảnh phải là 227x227 nó chỉ chấp nhận ba hình ảnh kênh
Hình 19: Kết quả squeezenet
Hãy tập trung vào dòng 64 và dòng 68, dòng 64 là chiều dài phức hợp chịu trách nhiệm cho trích xuất tính năng và dòng 68 là dòng đầu ra ta cần sửa đổi để đào tạo lại mạng bằng tập dữ liệu của ta.
Hình 20: Number of classes
“Training Progress” đã bắt đầu, chúng ta có thể thấy độ chính xác xác thực đang tăng lên, trong khi việc mất xác thực đang giảm xuống, điểu đó có nghĩa là “Network” học đúng cách thì “Training Progress” đã hoàn thành. Chúng ta có độ chính xác xác thực 100%.
Hình 21: Kết quả Train Progress
3.2.2 Kết quả test
Hình 22: Kết quả test lần 1
Lần 2: Độ chính xác là 50% và có 1 kết quả không chính xác
Hình 23: Kết quả test lần 2
Hình 24: Kết quả test lần 3
Qua 3 lần thử có thể thấy cùng độ xác thực là 50% nhưng lần 1 có tới 3 kết quả không chính xác, lần 2 và lần 3 có sự cải thiện khi chỉ có 1 kết quả không chính xác.
3.3 Nhận xét kết quả đạt được
Qua quá trình tìm hiểu và nghiên cứu, em đã xây dựng được một
cái nhìn
khái quát về bài toán nhận dạng, đặc biệt là nhận dạng mặt người. Đồng thời, nắm bắt được một số vấn đề về xử lý ảnh: các dạng ảnh, tính chất ảnh, không gian, tọa độ ảnh, ma trận ảnh,… và vận dụng nó kết hợp với các công cụ xử lý ảnh trong Matlab (Image Processing Toolbox).
Ưu điểm
Ta có thể nhận dạng được nhiều bức ảnh cùng một lúc
Khuôn mặt người được nhận dạng có độ chuẩn xác xác thực với thông tin
Đối với thuật toán CNN, đây là một thuật toán được sử dụng trong rất nhiều lĩnh vực, đối với lĩnh vực chuyên ngành điện tử, thuật toán được vận dụng trong Matlab với nhiều công cụ xử lý, tạo điều kiện thuận lợi cho việc thực hiện đề tài.
Khuyết điểm
Độ chuẩn xác xác thực chưa cao.
Chương 4 Kết luận và hướng phát triển