Thứ Sáu, 23 tháng 5, 2014

Huấn luyện bộ phân loại (the classifier)

Huấn luyện bộ phân loại (the classifier) dùng cho phát hiện ( đối tượng trên OpenCV – Haartraining – TrainCascade


Tại bài trước các bạn đã biết cách cài đặt JavaCV cho project android + thực hiện chạy thành công sample nhận dạng khuôn mặt của bộ thư viện này.
Trước khi bắt đầu bài hôm nay, mình muốn nói về 2 khái niệm “phát hiện - detection” và “nhận dạng – recognition”, có rất nhiều bạn hiểu nhầm 2 khái niệm này. Để hiểu sự khác nhau giữa 2 khái niệm này, mình quay lại bài trước, chương trình sample có thể giúp bạn khoanh vùng được khuôn mặt nhưng nó không thể nói cho bạn biết đó là ai đúng không?! Đúng rồi, nên đó chỉ là “phát hiện - detection” thôi, còn nếu nó có thể nói cho bạn biết đó là Kate Upton, lúc đó mới là ”nhận dạng - recognition”!! Mình chỉ đưa ra ví dụ cho bạn vậy thôi còn các bạn tự định nghĩa nhen! Thôi, để mình bắt đầu lại bài ngày hôm nay! :)
Tại bài trước các bạn đã biết cách cài đặt JavaCV cho project android + thực hiện chạy thành công sample phát hiện khuôn mặt của bộ thư viện này. Câu hỏi đặt ra là nếu bạn muốn phát hiện một đối tượng khác, chẳng hạn như cây bút, hoặc một con vật…thì bạn phải làm như thế nào?! Câu trả lời rất đơn giản là chỉ cần huấn luyện lại phân loại (the classifier) sau đó bạn hoàn toàn có thể sử dụng lại sample code bạn đã chạy thử tại bài trước để phục vụ việc phát hiện đối tượng bạn muốn. Câu trả lời thì đơn giản vậy nhưng quá trình thực hiện thì hoàn toàn không đơn giản chút nào, nó yêu cầu rất nhiều thời gian và công sức của bạn, còn tốn đến mức như thế nào thì xíu các bạn sẽ được biết ngay thôi! :D
Mình sẽ không đề cập tới lý thuyết dạng như OpenCV dùng thuật toán, hướng tiếp cận nào để nhận dạng đối tượng mà chỉ hướng dẫn các bạn làm sao để có thể có được bộ phân loại dùng cho việc nhận dạng này mà thôi. Nếu các bạn muốn tìm hiểu, các bạn có thể xem tại đây - một bài viết rất hay và đây cũng chính là cách tiếp cận của OpenCV.
Những công việc chính các bạn cần phải làm đó là:
1. Tạo file mô tả các negative sample.
2. Tạo file mô tả các positive sample.
3. Tổng hợp các positive sample vào 1 file vector
4. Chạy huấn luyện
5. Dùng file xml thu được phục vụ việc phát hiện đối tượng.
Quá trình này yêu cầu rất nhiều sample (mẫu), và các mẫu này được chia làm 2 loại: positive sample và negative sample. Positive sample là những mẫu – các bức ảnh – có chứa đối tượng bạn cần phát hiện, còn negative sample thì ngược lại, là các bức ảnh không được chứa những đối tượng các bạn cần phát hiện. Việc chuẩn bị những sample này thôi cũng có thể tốn kha khá thời gian của các bạn rồi, như mình mất gần 1 tuần để thu thập được khoảng 2000 ảnh chứa biển số xe phục vụ cho khóa luận của tụi mình. Bộ data set mình dùng trong khóa luận bao gồm khoảng 2000 positive samples và 3000 negative samles. (Để mang lại hiệu quả cao thì mình khuyên số negative samle nên gấp đôi hoặc chí ít gấp rưỡi số positive sample).
Các  positive sample thì các bạn cần phải tự thu thập, còn negative có thế dùng công cụ “ffmpeg” để lấy ảnh từ một film hoặc một đoạn clip bất kì. Cú pháp như sau:
[java] ffmpeg -i YourVideo.mpg nagetive_samples_%d.bmp[/java]
Các bạn có thể tự tìm hiểu thêm về cú pháp lệnh này, nhưng phải chắc rằng trong đoạn video clip các bạn trích ảnh ra không có chứa đối tượng cần phát hiện.
Giả sử các bạn đã có đầy đủ ảnh cho 2 bộ positive và negative, mình đã chuẩn bị sẵn bộ công cụ, các bạn có thể download tại đây. Sau khi download về, giải nén, các bạn sẽ được một thư mục cấu trúc như sau:
Haartraining
Các bạn hãy bỏ tất cả ảnh thuộc bộ positive sample vào thư mục, còn bộ negative sample vào thư mục . OK!
1. Tạo file mô tả các negative sample: Các bạn chỉ cần chạy file create_list.batcó sẵn trong thư mục  là bạn đã có được file mô tả cần thiết têninfofile.txt có nội dung kiểu như sau:
Haartraining12. Tạo file mô tả các positive sample: trong thư mục  các bạn chạy ứng dụng objectmarker.exe, rồi làm theo hướng dẫn (trong file readme.txt) để tạo file mô tả positive, nhưng hãy nhớ là các bạn cần bỏ tất cả ảnh positive vào thư mục .
Haartraining2
Việc này khá nhàm chán và tốn nhiều thời gian của bạn, nhưng hãy kiên nhẫn!! :D. Sau khi hoàn thành bạn sẽ thu được file info.txt có nội dung dạng:
Haartraining3
File này lưu giữ tọa độ của những đối tượng bạn cần phát hiện tương ứng với từng file, như bạn thấy, 1 mẫu có thể chứa nhiều đối tượng. Vậy là bạn đã hoàn thành việc tạo file mô tả positive sample.
3. Tổng hợp các positive sample vào 1 file vector. Giờ bạn quay trở lại thư mục gốc sẽ thấy ứng dụng tên opencv_createsamples.exe, mình sẽ dùng ứng dụng này để tạo file vector từ mẫu positive. Cú pháp đầy đủ của cái này như sau:
Mình chỉ quan tâm tới những thông số chính là:
info: đường dẫn tới file miểu tả positive sample. Nãy mình có tạo ở bước 2, đường dẫn là .
vec: đường dẫn file output sẽ được tạo ra sau quá trình chạy.
- num: số lượng ảnh trong bộ positive sample.
- w và -h: đây chính là kích thước của từng mẫu nhỏ sẽ được tạo ra trong file vector, nó cũng sẽ là kích thước tối thiểu để phát hiện sau khi huấn luyện sau này. Note: Tỉ lệ thông số -w và -h này cần đúng với tỉ lệ thật đối tượng các bạn cần phát hiện. Ví dụ mình muốn phát hiện biển số xe có kích thước 140×90 thì tỉ lệ tương ứng là 50×40 (hoặc có thế nhỏ hơn 14×9 nếu bạn thích nhưng cần phải đúng tỉ lệ).
Cú pháp mình sử dụng là:
Haartraining4
Quá trình này hoàn thành, bạn sẽ thu được một file vector.vec trong thư mụcOk! Giờ thì bạn đã sẵn sàng qua bước cần nhiều thời gian nhất là huấn luyện! Wohoo! :)
4. Chạy huấn luyện: Bạn sẽ thấy mình cũng chuẩn bị sẵn chương trình opencv_traincascade.exe cho bạn rồi, thật ra thì cái này vàopencv_createsamples.exe mình cũng chỉ lấy từ kết quả sau biên dịch OpenCV mình đã đề cập tạibài 1 thôi! (Và mục đích chính của việc biên dịch OpenCV cũng chỉ là để lấy 2 cái này! :”>). Các bạn để ý thấy mình có bỏ thêm thư viện tbb.dll, mục đích cái này là để hỗ trợ chạy tối ưu trên CPU đa nhân (mà mình tin tất cả các bạn đều đang dùng – và đây cũng là lý do nữa cần biên dịch lại OpenCV do bộ release mặc định của OpenCV không hỗ trợ TBB).
Nếu các bạn có tìm hiểu trên mạng, thì gần như tất cả các bài viết về vấn đề này, tới bước này họ sẽ dùng một công cụ gọi là opencv_haartraining, nhưng đó là phiên bản cũ, hồi đầu mình cũng dùng cái này, nhưng nó không hỗ trợ TBB và cần làm thêm 1 bước convert nữa. OpenCV khuyến cáo các bạn dùng opencv_traincascade.exe, đây là bản cải tiến của opencv_haartraining, có hỗ trợ chạy đa nhân và 1 số định dạng khác ngoài Haar-like.
Để biết đầy đủ tham số của opencv_traincascade.exe các bạn có thể xem tại đây. Mình chỉ nói về mấy tham số quan trọng mà mình dùng:
Lần lượt từng tham số là:
-data data/cascade: đường dẫn để lưu kết quả của quá trình huấn luyện
-vec data/vector.vec: đường dẫn file vector được tạo ra trong bước 3 tạo file vector từ
positive sample
-bg negative/infofile.txt: đường dẫn file miêu tả của tập mẫu negative
-numPos 2000: số lượng file ảnh của tập mẫu positive
-numNeg 3000: số lượng file ảnh của tập mẫu negative
-numStages 20: số stage mong muốn, cái này càng cao, có thể độ chính xác sẽ càng cao nhưng khuyến cáo trong khoảng 18 đến 24. (để càng cao chạy càng lâu bạn ạ! :D)
-mode ALL: chế độ ALL sẽ sử dụng tất cả các dạng (kể cả mở rộng) của đặc trưng Haar-like. (cái này bạn đọc thêm Haar-like tại link mình đề cập phía trên đê hiểu thêm)
-w 55 -h 40: kích thước của tập mẫu. Cái này mình đã đề cập tại phần tạo vector.
Haartraining5
Trong suốt quá trình chạy, rất nhiều lúc CPU của bạn sẽ được tận dụng tối đa 100%! *-*. Và mất rất nhiều thời gian để hoàn thành, hồi đó với 2000 mẫu, mình chạy khoảng 5-6 ngày để hoàn thành trên tính Core i7, 16GB RAM! :D. Các bạn yên tâm chuyện mất điện, vì nếu có sự cố gì, chỉ cần chạy lại lệnh trên, nó sẽ bắt đầu tiếp từ khúc bị dừng. :). Việc chạy huấn luyện này yêu cầu rất nhiều công sức, nếu sau quá trình chạy, kết quả không như mong đợi, bạn có thể phải điều chỉnh lại data set dùng để training hoặc tham số chạy training, có những người họ bỏ ra cả năm, chỉ để điều chỉnh mấy thông số này để mang lại kết quả tốt!!! Hồi đó thật may là mình mới chỉ chạy 1 lần, kết quả đạt được đã khá tốt nên mình có thể làm tiếp nhiều điều tiếp theo nữa!
5. Dùng file xml thu được phục vụ việc phát hiện đối tượng: Sau khi quá trình chạy thành công bạn sẽ thu được 1 file cascade.xml trong thư mụcQuay lại sample hôm trước, bạn chỉ cần thay file haarcascade_frontalface_alt.xml bằng file cascade.xml và nhớ sửa lại code chỗ đường dẫn tới file, và chạy thử. Chúc bạn thành công!!!
P/S: Nếu bạn nào có nhu cầu về bộ data set biển số xe (khoảng 2000 biển + đã có file mô tả), liên hê mình, mình sẽ upload cho các bạn, nó cỡ khoảng gần 5GB (chưa kể negative sample!) :”>

Không có nhận xét nào:

Đăng nhận xét