Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về bộ mô tả hình ảnh Histogram of Oriented Gradients (HOG) và các ứng dụng của nó.
Đang xem: Histogram of oriented gradients là gì
HIỂU VỀ HISTOGRAM OF ORIENTED GRADIENTS
Histogram of Oriented Gradients được sử dụng chủ yếu cho bài toán Object Detection, ngoài ra HOG cũng là bộ mô tả kết cấu, hình dạng của đối tượng khá mạnh mẽ.
Bản chất của HOG là mô hình hóa đối tượng bằng sự phân bố cường độ gradient trong từng vùng điểm ảnh của bức ảnh. HOG descriptor có 3 tham số quan trọng, gồm: orientations, pixel_per_cell và cells_per_block, chúng ta sẽ nói đến các tham số này sau.
Để tính toán HOG cần thực hiện 4 bước sau:
Bước 1: Chuẩn hóa hình ảnh (normalizing the image)
Bước này sẽ giúp cải thiện hiệu suất của HOG descriptor.
Bước 2: Tính toán gradients
Đầu tiên chúng ta sẽ tính toán gradient của bức ảnh theo cả 2 trục X, Y. Sau đó tính Gradient Magnitude và Gradient Orientation (tham khảo bài viết này).
Bước 3: Tính toán histogram cho từng vùng của bức ảnh
Chúng ta sẽ chia bức ảnh thành các vùng chữ nhật bằng nhau, được gọi là cells. Mỗi cell sẽ là một vùng hình ảnh với số lượng pixel được quy định trước. Ví dụ, chúng ta có một bức ảnh kích thước 640×480 pixels, nếu giá trị pixel_per_cell là 80×80 thì chúng ta sẽ có tổng cộng (640/80)x(480/80) = 8×6 = 48 cells, nhưng nếu giá trị pixel_per_cell là 40×40 thì số cell tổng cộng sẽ là (640/40)x(480/40) = 16×12 = 192 cells, xem Figure 1.
Figure 1 – Phân chia bức ảnh thành các cells
Sau khi đã chia bức ảnh thành các cells, chúng ta tính HOG cho từng cell sử dụng các giá trị Gradient Magnitude và Gradient Orientation đã có ở bước 2.
Tham số orientations sẽ quy định số bins trong histogram. Góc quay của Gradient trong không gian sẽ có giá trị trong khoảng <0, 180> (unsigned integer) hoặc <0, 360> (signed integer). Thông thường chúng ta sẽ chọn orientations trong khoảng <9, 12> để tính toán histogram.
Xem thêm: Ngọn Cờ Tư Tưởng Của Giai Cấp Vô Sản Là Gì, Giai Cấp Vô Sản
Mỗi pixel trong cell sẽ sử dụng giá trị Gradient Magnitude của mình như một trọng số khi tính toán histogram.
Figure 2 – Histogram of Oriented Gradients
Bước 4: Chuẩn hóa theo khối
Việc chuẩn hóa theo từng khối sẽ cải thiện bộ descriptor trước sự thay đổi ánh sáng và độ tương phản. Để làm được việc này chúng ta sẽ nhóm các cells lại thành từng block và các block này có thể overlap (chồng lấn nhau). Tham số cells_per_block sẽ quy định số cell có trong một block. Thông thường cells_per_block sẽ có giá trị là 2×2 hoặc 3×3 để cho hiệu năng tốt nhất, xem Figure 3.
Quay lại ví dụ phía trên, giả sử chúng ta có một bức ảnh kích thước 640×480, giá trị pixels_per_cell là 80×80 và chúng ta sẽ có 8×6 = 48 cells. Nếu giá trị cells_per_block là 2×2 thì chúng ta sẽ có tổng cộng (8-1)x(6-1) = 7×5 = 35 blocks. Nếu giá trị cells_per_block là 3×3 thì chúng ta sẽ có tổng cộng (8-2)x(6-2) = 6×4 = 24 blocks.
Figure 3 – Nhóm các cells thành block
Sau khi đã nhóm các cells vào từng block, chúng ta sẽ ghép (concatenate) histogram của từng cell trong block với nhau và thực hiện L1 hoặc L2 normalizing. Lặp lại tương tự với tất cả các block. Sau cùng histogram của tất cả các block sẽ được ghép lại với nhau tạo thành Feature Vector.
Quan trọng: khi tính toán HOG, các bức ảnh sẽ được chia thành các blocks và cells, do đó cần đảm bảo rằng tất cả các bức ảnh được dùng để train và test phải được chuyển về một kích thước duy nhất. Khi sử dụng cùng các tham số orientations, pixel_per_cell và cells_per_block cho các bức ảnh có kích thước khác nhau, chúng sẽ sinh ra số lượng cell và block khác nhau, điều này dẫn đến các HOG Feature Vectors sẽ có kích thước khác nhau và kết quả sẽ không như chúng ta mong muốn.
ÁP DỤNG HISTOGRAM OF ORIENTED GRADIENT
Trong bài viết này chúng ta sẽ sử dụng thư viện scikit-image để tính toán HOG.
Xem thêm: Hướng Dẫn Kiểm Tra Ping Mạng Bằng Cách Ping, Ping Mạng, Cách Kiểm Tra Ping Mạng
Install:
pip3 install -U scikit-image
Function:
hog, hogImage = skimage.feature.hog(image, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(3, 3), transform_sqrt=False, block_norm=None,visualize=False)
Trong đó:
hog – Histogram of Oriented Gradient tính toán được, 1-D array;hogImage – 2-D array biểu diễn HOG image;image – bức ảnh cần tính toán HOG;orientations – số bins của histogram, mặc định là 9;pixels_per_cell – số pixel có trong một cell, mặc định là 8×8;cells_per_block – số cell có trong một block, mặc định là 3×3;transform_sqrt – thực hiện chuẩn hóa hình ảnh trước khi tính toán HOG, mặc định là False;block_norm – thực hiện chuẩn hóa theo khối, gồm các method sau: ‘L1’, ‘L1-sqrt’, ‘L2’, ‘L2-Hys’; mặc định là None;visualize – (>= v0.16) nếu visualize=True thì kết quả trả về của function sẽ là hog và hogImage; mặc định là False; (
Bây giờ chúng ta sẽ áp dụng HOG và Machine Learning để nhận biết logo của một số hãng ô tô nổi tiếng nhé.
Training set của chúng ta sẽ nằm trong folder có tên training, gồm các bức ảnh sau: