Ma trận bên trái là một bức ảnh đen trắng. Mỗi giá trị của ma trận tương đương với một điểm ảnh (pixel), 0 là màu đen, 1 là màu trắng (nếu là ảnh grayscale thì giá trị biến thiên từ 0 đến 255).
Sliding window cịn có tên gọi là kernel, filter hay feature detector. Ở đây, ta dùng một ma trận filter 3×3 nhân từng thành phần tương ứng (element-wise) với ma trận ảnh bên trái. Giá trị đầu ra do tích của các thành phần này cộng lại. Kết quả của tích chập là một ma trận (convoled feature) sinh ra từ việc trượt ma trận filter và thực hiện tích chập cùng lúc lên tồn bộ ma trận ảnh bên trái.
Cơng thức tích chập giữa hàm ảnh f(x, y) và bộ lọc k(x, y) (kích thước mxn):
( , ) ( , ) ( , ) ( , ) a b s a t b w x y f x y w x y f x s y t (15) Với: a(m1) / 2,b(m1) / 2
Hình 2.17 là kết quả thu được sau khi sử dụng cửa sổ trượt là ma trận tách biên Sobel:
1 0 1 2 0 2 1 0 1 Hình 2.17 Tách biên sử dụng bộ lọc Sobel
Xét bài toán thực hiện tính giá trị đầu ra của một ảnh có kích thước 𝑊1*𝐻1* 𝐷1 (ở đây 𝐷1 được gọi là chiều xâu của ảnh thực chất là giá trị tại 3 kênh màu tương ứng với ảnh RGB). Khi đó một Conv như một cửa sổ trượt (sliding window, có tên gọi là kernel, filter hay feature detector) – cửa sổ này thực chất cũng là một ma trận có kích thước F*F thực hiện trên mỗi chiều của ảnh đầu vào (ta sử dụng K filter). Trong quá trình xử lý sẽ dịch chuyển các filter trên tồn bộ bức ảnh theo S(stride) bước (tính bằng pixcel). Người ta gọi mỗi vùng mà filter áp đặt lên ma trận đầu vào là receptive field. Trong một số trường hợp để cân bằng giữa số bước dịch chuyển và kích thước của ảnh người ta có thể chèn thêm P pixel với một giá trị màu cho trước (thường là 0) xung quanh viền của ảnh khi đó ta được ma trận đầu ra (feature map) là 𝑊2* 𝐻2*𝐷2 trong đó:
𝑊2=(𝑊1– F+2P)/S+1 𝐻2=( 𝐻1– F+2P)/S+1
𝐷2=K
Giá trị tại các ô trong ma trận của filter có kích thước (F*F*𝐷1) +1 (cộng 1 ở đây là tham số ngưỡng của filter) sẽ tương ứng là trọng số, các giá trị này của mỗi filter khơng đổi trong q trình dịch chuyển trên tồn bộ bức ảnh đầu vào. Đây cũng là tính chất quan trọng (dùng chung bộ trọng số – shared weights) làm giảm thêm số tham số cần học trong q trình huấn luyện mạng. Từ đó tổng số tham số cần học cho quá trình sử dụng Conv là (F*F*𝐷1)*K +K (ở đây cộng thêm K tham số ngưỡng của K filter).
Hình 2.18 Các thành phần của lớp tích chập.
Trong hình 2.19 là ví dụ cụ thể, trong đó đầu vào là ảnh có kích thước (32*32*3) ở đây 𝑊1= 𝐻1 =32 và 𝐷1=3 là chỉ giá trị của kênh màu RGB. Giả sử ta tiến hành sử dụng 6 filter (K=6) trong đó mỗi filter có kích thước (5*5*3) F=5 với bước dịch
W P
Giá trị ở feature map Kernel
chuyển S=1 và P=0. Tương ứng với mỗi filter sẽ cho một feature map khác nhau ở kết quả đầu ra trong đó: kích thước feature map là 𝑊2 = 𝐻2= (𝑊1– F)/1 +1 =28. Mỗi neural trong một feature map sẽ có số tham số là (F*F*𝐷1) = 5*5*3 +1. Nếu không sử dụng tính chất shared weights thì số tham số cần học trong tất cả feature map trong cả 6 filter là: (28*28*6) * (5*5*3 +1) mặc dù đã nhỏ hơn nhiều so với việc khơng sử dụng tích chập nhưng con số vẫn lớn hơn so với (F*F*𝐷1)K + K = 5*5*3*6+6 tham số khi dùng chung bộ trọng số.
Hình 2.19 Cách tính tham số của lớp tích chập.
Như vậy sử dụng tích chập có những ưu điểm sau:
Giảm số lượng tham số: Ở ANNs truyền thống, các neural ở lớp trước sẽ kết nối tới tất cả các neural ở lớp sau (full connected) gây nên tình trạng quá nhiều tham số cần học. Đây là ngun nhân chính gây nên tình trạng overfiting cũng như làm tăng thời gian huấn luyện. Với việc sử dụng Conv trong đó cho phép chia sẻ trọng số liên kết (shared
weights), cũng như thay vì sử dụng full connected sẽ sử dụng local receptive fields giúp giảm tham số.
Các tham số trong quá trình sử dụng Conv hay giá trị của các filter – kernel sẽ được học trong quá trình huấn luyện. Như giới thiệu ở phần trên các thông tin này biểu thị thơng tin giúp rút trích ra được các đặc trưng như góc, cạnh, đóm màu trong ảnh … như vậy việc sử dụng Conv sẽ giúp xây dựng mơ hình tự học ra đặc trưng.
2.2.3 Lớp Pooling
Tầng pooling (hay còn gọi subsampling hoặc downsample) là một trong những thành phần tính tốn chính trong cấu trúc CNN. Xét về mặt toán học pooling thực chất là q trình tính tốn trên ma trận trong đó mục tiêu sau khi tính tốn là giảm kích thước ma trận nhưng vẫn làm nổi bật lên được đặc trưng có trong ma trận đầu vào. Trong CNN toán tử pooling được thực hiện độc lập trên mỗi kênh màu của ma trận ảnh đầu vào.
Có nhiều tốn tử pooling như Sum-Pooling, Max Pooling, L2 Pooling nhưng Max Pooling thường được sử dụng. Về mặt ý nghĩa thì Max Pooling xác định vị trí cho tín hiệu mạnh nhất khi áp dụng một loại filter. Điều này cũng tương tự như là một bộ lọc phát hiện ví trị đối tượng bằng filter trong bài tốn phát hiện đối tượng trong ảnh.
Về mặt lý thuyết với ma trận đầu vào có kích thước 𝑊1= 𝐻1* 𝐷1 và thực hiện toán tử pooling trên ma trận con của ma trận đầu vào có kích thước F*F với bước nhảy S pixcel thì ta được ma trận đầu ra 𝑊2*𝐻2*𝐷2 trong đó:
𝑊2 = ( 𝑊1– F)/S+1 𝐻2 = (𝐻1 – F)/S+1 𝐷2 = 𝐷1
(a)
(b)
Hình 2.20 Cách tính tham số của lớp pooling.
Hình 2.20 là ví dụ về sử dụng tốn tử pooling. Trong đó hình (b) là cách thức tầng pooling xử lý đối với một đầu vào là kết quả của nhiều filter (k=64), kích thước của đầu vào là [224*224*64] được thực hiện với các thông số F=2 và S= 2 thì đầu ra có kích thước [112*112*64]. Hình (a) mơ tả chi tiết cách thức hoạt động của max- pooling trong đó F=2 và S=2.
2.2.4 Lớp biến đổi tuyến tính (Rectified Linear Unit)
Về cơ bản, covolution là một phép biển đổi tuyến tính. Nếu tất cả các neural được tổng hợp bởi các phép biến đổi tuyến tính thì một mạng neural đều có thể đưa về dưới dạng một hàm tuyến tính. Khi đó mạng ANN sẽ đưa các bài tốn về logistic regression. Do đó tại mỗi neural cần có một hàm truyền dưới dạng phi tuyến.
Có nhiều dạng hàm phi tuyến được sử dụng trong quá trình này như đã giới thiệu trong phần neural căn bản (mục 2.1.1. Giới thiệu về mạng Nơ-ron). Tuy nhiên, các nghiên cứu gần đây chứng minh được việc sử dụng hàm ReLu (Rectified Linear Unit) cho kết quả tốt hơn ở các khía cạnh:
Tính tốn đơn giản
Tạo ra tính thưa (sparsity) ở các neural ẩn. Ví dụ như sau bước khởi tạo ngẫu nhiên các trọng số, khoảng 50% các neural ẩn được kích hoạt (có giá trị lớn hơn 0).
Quá trình huấn luyện nhanh hơn ngay cả khi không phải trải qua bước tiền huấn luyện.
𝑎(𝑓) = max (0, 𝑓) 0 f a(f) Hình 2.21 Hàm truyền Relu 2.2.5 Fully-connected
Fully-connected là cách kết nối các neural ở hai tầng với nhau trong đó tầng sau kết nối đẩy đủ với các neural ở tầng trước nó. Đây cũng là dạng kết nối thường thấy ở ANN, trong CNN tầng này thường được sử dụng ở các tầng phí cuối của kiến trúc mạng. (Xem lại 2.1 – Mạng Nơ-ron).
CHƯƠNG 3: XÂY DỰNG BỘ PHÂN LOẠI HÀNH ĐỘNG NGƯỜI SỬ DỤNG MẠNG NƠ-RON TÍCH CHẬP NGƯỜI SỬ DỤNG MẠNG NƠ-RON TÍCH CHẬP 3.1 Bài tốn phân loại sử dụng Machine learning và Deep learning
Một bộ phân loại sử dụng phương pháp Machine learning tryền thống (ML – Học máy) có 2 giai đoạn:
Giai đoạn huấn luyện: Trong giai đoạn này, chúng ta đào tạo một thuật toán học máy bằng cách sử dụng một bộ dữ liệu bao gồm các hình ảnh và các nhãn tương ứng.
Giai đoạn dự đốn: Chúng ta sẽ sử dụng mơ hình đã được huấn luyện để dự đốn nhãn của một hình ảnh chưa biết.
Trong giai đoạn huấn luyện bộ phân loại hình ảnh ta lại chia làm 2 bước chính: 1. Trích đặc trưng (Feature Extraction): Ở bước này, chúng ta sử dụng kiến thức
trong lĩnh vực máy học để trích xuất các đặc trưng của ảnh. HOG (Histogram of oriented gradients) và SIFT (scale-invariant feature transform) là các ví dụ điển hình thường được sử dụng.
2. Đào tạo mẫu (Model Training): Tại đây, chúng ta sử dụng một bộ dữ liệu “sạch” bao gồm các đặc trưng của hình ảnh và các nhãn tương ứng để huấn luyện mơ hình học máy.
Trong giai đoạn dự đoán, chúng ta áp dụng cùng một q trình trích đặc trưng cho các hình ảnh mới và thơng qua các đặc trưng đã được huấn luyện trong bước trích đặc trưng để dự đốn nhãn của ảnh đầu vào.
Hình 3.1 Hai giai đoạn Machine learning
Sự khác biệt chính giữa việc học máy truyền thống và các thuật toán học sâu là trong kỹ thuật trích xuất đặc trưng. Trong các thuật toán học máy truyền thống, chúng ta cần phải trích đặc trưng một cách “thủ công”. Ngược lại, trong các thuật toán học sâu kỹ thuật trích đặc trưng được thực hiện tự động theo thuật toán. Việc trích xuất các đặc trưng là rất khó, tốn nhiều thời gian và địi hỏi chun mơn cao, chính vè thế học sâu hứa hẹn sẽ là các thuật tốn học máy chính xác hơn so với học máy truyền thống với ít hoặc khơng có kỹ thuật trích đặc trưng.
Hình 3.2 Machine learning và Deep learning
Một số kiến trúc mạng Deep learning được đề cập gần đây góp phần quan trọng trong sự phát triển ngành cơng nghệ thị giác máy tính và mạng tích chập:
AlexNet (2012)
VGG Net (2014)
GoogLeNet (2015)
Microsoft ResNet (2015)
Region Based CNNs (R-CNN - 2013, Fast R-CNN - 2015, Faster R-CNN - 2015)
Generative Adversarial Networks (2014)
Generating Image Descriptions (2014)
Spatial Transformer Networks (2015)
Cùng với sự phát triển của các thuật tốn Deep Learning thì các thư viện cũng như framework hỗ trợ các thuật toán này cũng ngày càng tăng về số lượng. Hầu hết các thư viện và framework này đều cung cấp dưới dạng mã nguồn mở do đó rất linh hoạt trong việc sử dụng và mở rộng, đây cũng là một trong những lý do Deep Learning được áp dụng trong nhiều bài toán với nhiều lĩnh vực khác nhau. Một số thư viện phổ biến đang được cộng đồng nghiên cứu sử dụng như:
Caffe framework
Torch
TensorFlow
Theano
3.2 Kiến trúc mạng CNN 10 lớp sử dụng trong nhận dạng hành động người
Hiện nay dữ liệu video dễ dàng được tạo ra bởi các thiết bị như: Máy quay phim, máy ảnh kỹ thuật số, máy tính xách tay, điện thoại di động, các camera quan sát, … bên cạnh đó trên các trang mạng mức độ chia sẻ, tải lên của các video cũng tăng trưởng khơng ngừng. Bài tốn nhận diện hành động người đóng góp một phần tự động hóa khai thác tài ngun dữ liệu nhiều thơng tin này. Các ứng dụng liên quan đến bài toán nhận diện hành động người như giám sát an ninh nhằm phát hiện ra các hành vi nghi ngờ hoặc các hệ thống giám sát truyền thống, giám sát chăm sóc sức khỏe nhằm
phát hiện hành vi bất thường của bệnh nhân như té ngã, đột quỵ. Nhiệm vụ của tác giả đặt ra chính là tìm ra giải pháp có thể thay thế hoặc hỗ trợ người giám sát đảm bảo vấn đề hiệu quả và tính chính xác.
3.2.1 Dữ liệu huấn luyện
Dữ liệu tác giả sử dụng bao gồm 3.418 ảnh màu với kích thước 227x227, được phân thành 4 mục tương ứng: ‘Bowing’, ‘Walking’, ‘Waving’ và ‘Nothing’. Và do giới hạn về phần cứng nên trong đề tài này tác giả chỉ thực hiện nhận dạng trên bốn hành động cơ bản của người. Các hành động khác chúng ta cũng có thể thu thập và đưa vào huấn luyện mạng như các hành động trên đồng nghiã với việc thời gian xử lý sẽ lâu hơn và yêu cầu phần cứng cao hơn.
Hình 3.3 Dữ liệu hành động người (MyData)
Hình ảnh được trích tự động từ những đoạn video nhỏ tác giả tự quay trên một camera cố định trong một phòng nhỏ, khoảng cách từ 2 đến 3 mét (Bỏ qua ảnh hưởng của điều kiện chiếu sang, ảnh hưởng của những background phức tap,…). Ảnh sau đó sẽ được hiệu chỉnh lại kích thước 227x227. Mục tiêu của việc hiệu chỉnh nhằm phù hợp với kiến trúc mạng CNN 10 lớp của tác giả (xem mục 3.2.3 – Mơ hình huấn luyện) và tiết kiệm thời gian trong quá trình huấn luyện.
1 Bowing 660
2 Walking 1146
3 Waving 1400
4 Nothing 212
Bảng 3.1 Số lượng hình ảnh sử dụng trong huấn luyện
3.2.2 Thiết lập cấu hình phần cứng
Có nhiều lựa chọn để training mạng CNN như: dùng CPU, GPU, TPU hoặc là dùng distributed system. GPU thì thích hợp với nghiên cứu cá nhân hoặc nhóm nhỏ vì nó nhỏ gọn dễ setup, còn disitributed system thường được dùng trong các công ty lớn. Nếu khơng có GPU chúng ta vẫn có thể chạy trên CPU nhưng phải rất kiên nhẫn vì nó khơng mạnh trong việc xử lý đồ họa.
Trong mơ hình huấn luyện mạng CNN nhận dạng hành động người lần này tác giả đã sử dụng GPU để huấn luyện trên Card rời GeForce GTX 750 Ti.
Hình 3.5 Cấu hình máy tính sử dụng
3.2.3 Mơ hình huấn luyện
227 227 3 11 11 3 55 55 32 3 3 27 27 32 5 5 32 19 19 64 3 3 9 9 64 . .. . .. Walking Bowing Waving Nothing Input Conv1 + ReLU1 Pool1 Conv2 +
ReLU1 Pool2 Flatten FC Softmax
Hình 3.7 Đặc trưng ngõ ra tại mỗi lớp
Một kiến trúc mạng 10 lớp được tác giả xây dựng như sau:
Lớp 1 (imageinput): Ảnh đầu vào với kích thước 227x227x3
Lớp 2 (conv1): Tích chập lần 1: Name ‘conv1’ FilterSize [11,11] NumChannels 3 NumFilters 32 Stride [4,4] Padding [0,0]
Weights Auto ‘4-D double’ Bias Auto ‘1x1x32 double’
Hình 3.8 Trọng số bộ lọc trong lớp conv1
Lớp 3 (relu1): Biến đổi tuyến tính lần 1
Lớp 4 (poo1): Max Pooling lần 1 Name ‘poo1’ PoolSize [3,3] Stride [2,2] Padding [0,0] Lớp 5 (conv2): Tích chập lần 2 Name ‘conv2’ FilterSize [5,5] NumChannels 32 NumFilters 64 Stride [1,1] Padding [2,2]
Weights Auto ‘4-D double’ Bias Auto ‘1x1x64 double’
Lớp 6 (relu2): Biến đổi tuyến tính lần 2
Name ‘poo2’ PoolSize [3,3] Stride [2,2] Padding [0,0]
Lớp 8 (fc1): Fully connected Layers
Name ‘fc1’
InputSize ‘auto’ OutputSize 4
Lớp 9: Softmax
Lớp 10: Classification Output Layer: Phân loại 4 trạng thái ngõ ra ‘Walking’, ‘Bowing’, ‘Waving’ và ‘Nothing’
3.2.4 Quá trình huấn luyện
Sau khi đã xác định mơ hình, dữ liệu huấn luyện và thiết lập cấu hình máy, ta bắt đầu quá trình huấn luyện.
Image Datastore Training Data (70%) Test Data (30%) ConvNet Model Classification Predictions Compute Accuracy Out-of-Sample error estimate (a)
Bước 1: Đầu tiên là tải bộ dữ liệu huấn luyện. Sau đó hàm ImageDatastore sẽ tự động gán nhãn các tập hình ảnh này dựa trên các tên Folder và lưu lại như một đối tượng ImageDatastore.
categories = {'Bowing','Walking','Waving','Nothing'};
imds = imageDatastore(fullfile('myimage','imagetrain', categories), 'LabelSource', 'foldernames');
Bước 2: Ta chia dữ liệu thành các tập huấn luyện (70%) và các tập kiểm tra (30%). Lưu ý: cần thêm một bước hiệu chỉnh lại kích thước ảnh thành 227x227x3 nếu như tập dữ liệu trước đó chưa được hiệu chỉnh.
[trainingSet, testSet] = splitEachLabel(imds, 0.3, 'randomize');
Bước 3: Xác định kiến trúc mạng CNN sử dụng. Ở đây tác giả dùng kiến trúc mạng CNN-10 lớp (xem mục 3.3.3 – Mơ hình huấn luyện).
Bước 4: Thiết lập các tùy chọn sử dụng trong huấn luyện: sgdm (stochastic gradient descent with momentum) với tối đa chu kỳ huấn luyện là 20 (maximum epoch), và bắt đầu quá trình huấn luyện với tốc độ học ban đầu là 0.0001.
options = trainingOptions('sgdm','MaxEpochs',20, ... 'InitialLearnRate',0.0001); Bước 5: Huấn luyện mạng CNN-10 lớp với tùy chọn ở các bước trên
convnet = trainNetwork(trainingSet,layers,options);
Bước 6: Phân loại các ảnh trong dữ liệu kiểm tra và tính tốn độ chính xác. YTest = classify(convnet,testSet);
TTest = testSet.Labels;
accuracy = sum(YTest == TTest)/numel(TTest)
Độ chính xác là tỷ số của số lượng các nhãn đúng trong dữ liệu kiểm tra khớp với nhãn từ việc phân loại với số lượng hình ảnh trong dữ liệu thử nghiệm.