Khuôn mặt ở khắp mọi nơi! Từ ảnh tự sướng cơ bản đến hệ thống nhận dạng khuôn mặt thông minh.
OpenCV tích hợp một số tầng cơ bản có ứng dụng thực tế rất tốt như Nhận diện Khuôn mặt, Nhận dạng Biển số xe, v.v.
Bạn đã bao giờ tự hỏi rằng mình có thể tạo tầng của riêng mình để phát hiện bất kỳ vật thể nào bạn muốn chưa? Vật thể có thể đơn giản là bất cứ thứ gì như trái cây, quả bóng, cây bút, chai, v.v. miễn là bạn có một số hình ảnh dương của vật thể đó.
Hình ảnh dương là hình ảnh chứa vật thể của chúng ta. Ví dụ: hình ảnh dương của quả chuối nên có hình quả chuối trong mỗi hình ảnh, bất kể nền là gì. Ví dụ:
Ảnh âm bản có thể là bất kỳ hình ảnh nào miễn là nó không chứa vật thể cụ thể. Đối với ví dụ về quả chuối, nó có thể là bất kỳ hình ảnh nào miễn là không có quả chuối.
Để có một bộ phân loại/phân tầng mạnh mẽ hơn, bạn sẽ cần rất nhiều ảnh dương bản và âm bản.
Chúng ta sẽ tập trung vào việc tạo một bộ phân loại/phân tầng/bộ dò cho một chiếc ô tô. Tôi sẽ sử dụng các thuật ngữ phân tầng/phân loại/bộ dò thay thế cho nhau.
Điều kiện tiên quyết:
- Python (trình độ sơ cấp)
- OpenCV (trình độ sơ cấp)
Các bước
Bước 1: Chuẩn bị dữ liệu
Để có được ảnh dương, chúng ta sẽ sử dụng Cơ sở dữ liệu hình ảnh để phát hiện xe, có sẵn tại đây. Bạn có thể tải xuống và trích xuất nội dung vào thư mục của mình. Sau khi trích xuất, bạn sẽ thấy ảnh âm và ảnh dương nằm trong thư mục TrainImages — 500 Ảnh âm, 550 Ảnh dương. Hãy trích xuất cả hai vào các thư mục riêng biệt như sau:
Bước 2: Tạo file mô tả (description file)
Để tạo ra chuỗi phản hồi, bây giờ chúng ta cần tạo tệp cars.info chứa thông tin cần thiết để đào tạo hình ảnh tích cực.
pos/pos-0.pgm
→ Vị trí của ảnh dương.
1
→ Số lượng vật thể có trong ảnh
0 0 100 40
→ Vị trí của ảnh. 0 0 là tọa độ x và y, 100 40 là chiều rộng và chiều cao sao cho ảnh trải dài từ (0,0) đến chiều rộng = 100 và chiều cao = 40.
Nếu bạn có 2 hoặc nhiều đối tượng, hình ảnh cụ thể của bạn trong cars.info sẽ trở thành
pos/pos-1.pgm 2 0 0 100 40 1 1 80 60
For Object 1, (0,0) to Width = 100, Height =40
For Object 2, (1,1) to Width = 80, Height = 60
Tôi đã tạo tệp cars.info và bạn có thể tải xuống tại đây.
Data Annotation Tools:
- opencv_annotation
- LabelImg
- RectLabel
- VGG Image Annotator (VIA)
- Labelbox
- Supervisely
- Annotator
- CVAT (Computer Vision Annotation Tool)
- LabelMe
- Sloth
- TagTog
- ImageTagger
- GATE (General Architecture for Text Engineering)
- Siafoo
- doccano
Sử dụng công cụ chú thích tích hợp của OpenCV
Kể từ OpenCV 3.x, cộng đồng đã cung cấp và duy trì một công cụ chú thích nguồn mở, được sử dụng để tạo -infotệp. Công cụ này có thể được truy cập bằng lệnh opencv_annotation nếu các ứng dụng OpenCV được xây dựng.
Việc sử dụng công cụ này khá đơn giản. Công cụ chấp nhận một số tham số bắt buộc và một số tham số tùy chọn:
--annotations
(bắt buộc): đường dẫn đến tệp txt chú thích, nơi bạn muốn lưu trữ chú thích của mình, sau đó được truyền đến -info tham số [ví dụ - /data/annotations.txt]--images
(bắt buộc): đường dẫn đến thư mục chứa hình ảnh có đối tượng của bạn [ví dụ - /data/testimages/]--maxWindowHeight
(tùy chọn): nếu hình ảnh đầu vào có chiều cao lớn hơn độ phân giải được cung cấp ở đây, hãy thay đổi kích thước hình ảnh để chú thích dễ dàng hơn bằng cách sử dụng--resizeFactor
.--resizeFactor
(tùy chọn): hệ số được sử dụng để thay đổi kích thước hình ảnh đầu vào khi sử dụng--maxWindowHeight
tham số.
Lưu ý rằng các tham số tùy chọn chỉ có thể được sử dụng cùng nhau. Ví dụ về lệnh có thể được sử dụng có thể được xem bên dưới.
opencv_annotation --annotations=/path/to/annotations/file.txt --images=/path/to/image/folder/
opencv_annotation -a=/path/to/annotations/file.txt -i=/path/to/image/folder/
Lệnh này sẽ mở ra một cửa sổ chứa hình ảnh đầu tiên và con trỏ chuột của bạn, được sử dụng để chú thích. Video hướng dẫn sử dụng công cụ chú thích có thể được tìm thấy tại đây . Về cơ bản, có một số phím tắt kích hoạt một hành động. Nút chuột trái được sử dụng để chọn góc đầu tiên của đối tượng, sau đó tiếp tục vẽ cho đến khi bạn hoàn tất, và dừng lại khi nhấp chuột trái lần thứ hai. Sau mỗi lần chọn, bạn có các lựa chọn sau:
- Nhấn c: xác nhận chú thích, chuyển chú thích sang màu xanh lá cây và xác nhận chú thích đã được lưu trữ
- Nhấn d: xóa chú thích cuối cùng khỏi danh sách chú thích (dễ dàng để xóa chú thích sai)
- Nhấn n: tiếp tục đến hình ảnh tiếp theo
- Nhấn ESC: thao tác này sẽ thoát khỏi phần mềm chú thích
Cuối cùng, bạn sẽ có được một tệp chú thích có thể sử dụng được và có thể truyền vào -info
đối số của opencv_createsamples.
Bước 3: Tạo file .txt mô tả đường dẫn đến các ảnh negative
Để mô tả tất cả các hình ảnh tiêu cực, chúng tôi chỉ cần thu thập tên của chúng trong tệp bg.txt. Bạn có thể tìm thấy tệp này tại đây.
Bước 4: Tạo file vector từ ảnh positive
Bây giờ chúng ta tạo một tệp vec bằng OpenCV. Trong dấu nhắc lệnh (trong thư mục gốc), hãy chạy lệnh:
opencv_createsamples -info cars.info -num 550 -w 48 -h 24 -vec cars.vec
Với windows 11 24H2
.\opencv_createsamples -info cars.info -num 550 -w 48 -h 24 -vec cars.vec
num
→ số lượng đối tượng chúng ta có.
w,h
→ chiều rộng và chiều cao của dữ liệu huấn luyện mà chúng ta muốn tạo.
Thao tác này sẽ tạo cars.vec
trong thư mục gốc.
Nếu bạn gặp lỗi ở đây về “opencv_createsamples is not recognized…”, hãy giải nén tệp zip này vào cấu trúc thư mục của dự án.
Để kiểm tra cars.vec
đã tạo xem có hợp lệ không, hãy chạy lệnh
opencv_createsamples -vec cars.vec -w 48 -h 24
Với windows 11 24H2
.\opencv_createsamples.exe -vec cars.vec -w 48 -h 24
Bước 5: Huấn luyện mô hình Haar Cascade
Để đào tạo cascade, bây giờ chúng ta sẽ tạo một thư mục có tên là data và chạy
opencv_traincascade -data data -vec cars.vec -bg bg.txt -numPos 500 -numNeg 500 -numStages 10 -w 48 -h 24 -featureType LBP
.\opencv_traincascade -data data -vec cars.vec -bg bg.txt -numPos 500 -numNeg 500 -numStages 10 -w 48 -h 24 -featureType Haar
Số lượng numStages càng nhiều thì mô hình của chúng ta càng tốt.
Phân tích từng tham số:
Tham số | Upvotes |
---|---|
opencv_traincascade | Công cụ training cascade classifier |
-data data | Thư mục lưu model đã train (output) |
-vec cars.vec | File chứa ảnh positive samples (ảnh có xe) |
-bg bg.txt | File text liệt kê đường dẫn ảnh negative (không có xe) |
-numPos 500 | Số ảnh positive dùng mỗi stage |
-numNeg 500 | Số ảnh negative dùng mỗi stage |
-numStages 10 | Số stages của cascade (10 tầng lọc) |
-w 48 | Chiều rộng cửa sổ training (48 pixels) |
-h 24 | Chiều cao cửa sổ training (24 pixels) |
-featureType LBP | Dùng LBP features (nhanh hơn Haar) |
Quy trình hoạt động:
- Load dữ liệu: Đọc 500 ảnh positive từ
cars.vec
và 500 ảnh negative từbg.txt
- Training 10 stages: Mỗi stage học phân biệt xe/không phải xe
- Tạo cascade: Các stage xếp tầng - ảnh phải qua hết 10 stage mới được xác định là xe
- Output: File
cascade.xml
trong thư mụcdata/
để dùng cho detection
Thời gian training:
- LBP: ~vài giờ đến 1 ngày
- Haar: ~vài ngày đến 1 tuần
Haartraining được cho là mang lại kết quả tốt hơn traincascade nhưng lại cực kỳ chậm. Đôi khi có thể mất một đến hai tuần để đào tạo một bộ phân loại.
🧰 Công cụ hỗ trợ
Bạn có thể dùng script Python như opencv_traincascade_gui
hoặc các công cụ như:
https://amin-ahmadi.com/cascade-trainer-gui/ (GUI cho việc huấn luyện Haar Cascade)
Bước 6
Bây giờ, trong thư mục dữ liệu, chúng ta có cascade.xml
, đây là cascade cuối cùng và có thể được sử dụng để phát hiện xe. Nó cũng chứa các tệp xml theo từng giai đoạn sau mỗi giai đoạn.
Hãy tự kiểm tra chuỗi sự kiện của riêng bạn và cho tôi biết kết quả nhé.
Hãy vỗ tay nếu câu chuyện này hữu ích với bạn nhé.
Tham khảo:
- Training a Haar Cascade Object Detector in OpenCV
- OpenCV Tutorial: Training your own detector packtpub.com
- Official tutorial on training a Cascade Classifier
- Training a Cascade Classifier - OpenCV Object Detection in Games #8
- OpenCV Object Detection in Games
- How to install OpenCV on Windows 2025
- Training your own Cascade/Classifier/Detector — OpenCV
- TRAINCASCADE AND CAR DETECTION USING OPENCV
- Haar Cascade là gì? Luận về một kỹ thuật chuyên dùng để nhận biết các khuôn mặt trong ảnh
- Phát hiện đối tượng – P1: lý thuyết
- Phát hiện vật thể – P2: thực hành
- OpenCV With Python Part 1
- OpenCV With Python Part 2
- OpenCV With Python Part 3
- OpenCV With Python Part 4
- OpenCV With Python Part 5
- OpenCV With Python Part 6
- OpenCV With Python Part 7
- OpenCV With Python Part 8
- OpenCV With Python Part 9 (Làm mờ và làm mịn)
- OpenCV With Python Part 10 (Biến đổi hình thái học)
- OpenCV With Python Part 11 (Canny Edge Detection và Gradients)
- OpenCV With Python Part 12 (Template Matching)
- OpenCV With Python Part 13 (Interactive Foreground Extraction using GrabCut Algorithm)
- OpenCV With Python Part 14 (Corner Detection)
- OpenCV With Python Part 15 (Feature Matching Brute Force)
- OpenCV With Python Part 16 (MOG Background Reduction And Subtractor)
- OpenCV With Python Part 16 (Haar Cascade Object Detection Facer)
- OpenCV Haar Cascades
- OpenCV Face Detection: Cascade Classifier vs. YuNet