- From Lilian Weng’s blog (có codes)
- Phạm Đình Khánh | Bài 17 - Thuật toán HOG (Histrogram of oriented gradient) ← có codes
- Trước khi các thuật toán DL ra đời (YOLO, SSD, Faster RCNN,…)
- Một thuật toán cổ điển để xử lý ảnh + cũng khá hiệu quả! → object detection
- Những ứng dụng
- human detection (this article)
- face detection (biểu diễn đường nét khuôn mặt theo độ lớn các vector)
- HOG tạo các feature cho các bài toán phân loại ảnh.
- Từ cái hình thiệt bự → lấy 1 khung hình chỉ bao quanh người
- Mỗi hình chia thành lưới blocks, mỗi block gồm 8x8 pixels. Sau đó mỗi pixel (của 64 cái), tính gradient magnitude (GM) & gradient direction (GD) → cần tính tổng cộng (8x8)x2
Ví dụ cách tính GM và GD ở mỗi pixel (ref)
- Chia GD theo 9 bins (do GD trong hình trên → mỗi bin là 20) ← Có nghĩa là thay vì các gradient direction đi mọi hướng từ 0→180 độ thì ta chỉ xét 9 hướng “feature” tương ứng với 9 bins mà thôi!
- Sau đó GD và GM sẽ được ghép cặp với nhau theo từng pixel → nếu cái nào “nằm giữa” (ko rơi ngay vào các đầu mút như 0, 20, 40,…) thì sẽ chia theo phần nó chiếm trong GD (hình dưới 10 nằm ngay giữa nên chia 4 thành 2,2).
- 10 cách 0 10, cách 20 cũng 10 → chia 2
- Còn nếu 15: 15 cách 0 = 3*(15 cách 20) ← nó gần 20 hơn 3 lần so với nó gần 0 nên chia bin 20 nhiều hơn 3 lần → giả sử GD là 8 thì sẽ chia cho bin 20 6, còn bin 0 là 2.
Nó không hẳn là 1 cái bin kiểu [a,b]. Chỉ là mình chọn ra 9 “độ” đại diện (feature) thì sẽ có lần lượt 0, 20, 40,…., 160. Suy ra:
- Tính tổng tất cả GM thuộc cùng 1 bin
- Then we slide a 2x2 cells (thus 16x16 pixels) block across the image.
Then chuẩn hoá (eg. 2 bức ảnh cùng nội dung nhưng 1 cái tối hơn thì vector histogram cũng sẽ gấp đôi ← cần chuẩn hoá để 2 bức này có cùng 1 vector biểu diễn)
- Tính toán HOG feature ← Sau khi chuẩn hóa các véc tơ histogram, chúng ta sẽ concatenate các véc tơ 1x36 này thành một véc tơ lớn (36 = 9 vector đặc trưng x 4 blocks đã chọn trước khi slice). Đây chính là véc tơ HOG đại diện cho toàn bộ hình ảnh.
- Biểu diễn phân phối HOG trên ảnh
- Sau đó áp dụng HOG kết hợp với SVM chẳng hạn để detect object
👇 Code lấy ở đây.
👇 Cũng có thể code thông qua OpenCV (code lấy ở đây)
Or detect people in an image using directly OpenCV
Understand HOC (archived)
HOG + SVG (support vector machine)
👇 (video của cái đứa ở trên luôn) HOG + SVM & Dalal & Triggs (25K citations)
Steps to get the SVG coefficients
(Cái hình đen bên phải ở hình dưới)
- 1K images with people
- 1K images without people
- HOG features of the images
- Train SVM Classifier
QUESTION: Làm sao để có thể detect được người trong 1 hình lớn? ← làm sao biết người đó đứng ở đâu mà có được ái khung bao quanh?
→ Using sliding windows → for each of window: sử dụng HOG và use SVM để xác định xem có người hay ko!
- Bắt đầu từ góc trên bên trái, nhích từng chút một sang phải rùi xuống dưới. Xong áp dụng thuật toán HOG và đưa vào SVM để check xem có phải người hay không. Nếu phải thì xác định được position của khung, còn ko thì tiếp tục.
- Ví chúng ta dùng sliding windows nên chúng ta có thể biết được coordinates của windows khi tìm thấy object!
- Problem: Nếu sliding window quá lớn / quá nhỏ so với object? → Dùng technique “Image Pyramid”
Start with original image → phát hiện some object → down scale hình rùi slide windows → phát hiện (hoặc ko) object → làm cho đến khi nào phát hiện được object quá khổ thì thui!
❓ Down scale bao nhiêu? Down đến khi nào?