Kinh nghiệm
– Không nên sử dụng laptop hoặc máy yếu, cố gắng tìm 1 máy tính mạnh để training
– Nếu nơi bạn cúp điện thường xuyên thì hãy cố gắng tìm nguồn dự phòng hoặc sử dụng laptop
– Để tốc độ training được nhanh thì nên dùng LBP thay cho HAAR, vài giờ đã training xong 2000 ảnh size 30×30
Các sai sót thường gặp
– Đường dẫn ảnh có khoảng trắng hoặc ký tự đặc biệt
– Ảnh quá lớn, đề nghị ảnh tầm 1024×768 trở lại
– Ảnh vừa chụp xong vẫn còn metadata như góc xoay, phải loại bỏ trước khi training
Câu hỏi chung
- Có phải Cascade phát hiện được bất kỳ đối tượng nào
- Để phát hiện tốt hơn có cần chuyển sang ảnh trắng đen hoặc tiền xử lý?
– Theo lý thuyết thì được nếu các tham số được chỉ định đúng, bộ dữ liệu đầy đủ mẫu. Tuy nhiên chỉ thực hiện tốt với các trường hợp: đối tượng rõ ràng, không bị overlap nhau, tỉ lệ width/height tương đối giống nhau. (cho nên nhận diện khuôn mặt là hình vuông)
– Tuy nhiên đối tượng nào có hình dạng đơn giản sẽ dễ nhận sai vì chứa ít đặc trưng, cho nên Cascade không phải là vạn năng.
– Chuyển sang trắng đen là bắt buộc từ lúc tạo tập mẫu đến lúc phát hiện, nếu không thuật toán sẽ không chạy được. Do đó chuyển sang ảnh xám không tăng độ chính xác
– Tiền xử lý sẽ giúp nhận diện tốt hơn, các gồm các thuật toán cân bằng sáng, lọc nhiễu,… Và độ chính xác cũng phụ thuộc vào chất lượng hình ảnh.
Ảnh dương
- Tại sao gọi là ảnh dương?
- File Vectơ là gì?
- File_chỉ_mục.txt là gì?
- Tại sao phải cần file_chỉ_mục.txt ngay khi ảnh chỉ chứa 1 đối tượng?
- Các background có cần phải khác nhau?
- Tất cả ảnh dương đều phải cùng kích cỡ?
- -w -h là gì? Nó cần phải luôn luôn là hình vuông?
– Vì nó có chứa đối tượng cần phát hiện. Ngược lại, ảnh không chứa đối tượng được gọi là ảnh âm
– Khi bạn tạo file vectơ bằng chương trình opencv_createsamples.exe chương trình sẽ tạo ra các ảnh thumbnail với kích thước được chỉ định bởi -w và -h và đóng gói lại thành file vectơ. File vectơ có chứa header: số lượng mẫu, chiều rộng, chiều cao và phần thân chứa các ảnh thumbnail
– Trên mỗi ảnh dương có thể có vài đối tượng cần phát hiện. Bạn cần chỉ cho máy tính biết đâu là đối tượng và đâu là không phải bằng cách vẽ khung chữ nhật với toạ độ x,y và width, height bao lấy đối tượng. Bạn có thể tạo file với nội dung:
tên_ảnh số_đối_tượng x y width height x y width height x y width height....
positve\image1.jpg 1 10 10 20 20
positve\image1.jpg 2 30 30 50 50 60 60 70 70
– Tại vì chương trình cần file này để crop lấy phần cần thiết để rút trích đặc trưng của đối tượng. Nếu bạn không chỉ ra rõ ràng khung hình chữ nhật thì chương trình sẽ lấy toàn bộ ảnh. Nếu bạn cần thì tự viết 1 chương trình để tạo file vectơ.
– Cần, điều này rất quan trọng. Trên mỗi ảnh dương ngoài đối tượng thì có background. Thử thay đổi background bằng cách thêm vào những hình vẽ, noise để tạo sự khác biệt giữa các background. Tránh trường hợp background giống nhau liên tục.
– Không, ảnh gốc có thể có kích cỡ bất kỳ. Nhưng điều quan trọng là chiều rộng và chiều cao của khung chữ nhật phải cùng tỉ lệ với -w -h
– Bạn có thể đặt bất kỳ giá trị -w và -h tuỳ thuộc vào tỉ lệ của đối tượng. Nhưng những đối tượng có kích cỡ nhỏ hơn kích cỡ -w -h này sẽ không được phát hiện. Nếu sử dụng cho khuôn mặt thì thường sử dụng giá trị là 24×24, 20×20. Nhưng bạn có thể sử dụng 24×20, 20×24,….
– Tuy nhiên bạn nên giữ tỉ lệ width/height như nhau để đạt kết quả tốt nhất. Và tỉ lệ nhận dạng chính xác nhất với width/height = 1
Ảnh âm
- Lấy ảnh âm từ đâu?
- Ảnh âm phải cùng kích cỡ với nhau?
- Cần bao nhiêu ảnh dương/ảnh âm?
– Bạn có thể sử dụng bất kỳ hình ảnh nào mà OpenCV hỗ trợ miễn là không chứa đối tượng. Nhưng chúng phải khác nhau (rất quan trọng).
– Cách tốt nhất là bạn download các tập ảnh âm được chuẩn bị sẵn, chúng tôi cũng có sẵn bộ ảnh âm .
– Không. Nhưng kích cỡ phải lớn hơn -w -h
– Tuỳ thuộc vào công việc của bạn. Để phát hiện theo thời gian thực cần khoảng 1000 ảnh dương và 2000 ảnh âm.
Tỉ lệ tốt nhất là ảnh âm gấp đôi ảnh dương, nhưng quy tắc này không cố định. Tôi khuyến cáo đầu tiên sử dụng ít mẫu, tạo cascade rồi mở rộng số lượng mẫu
Thực hiện huấn luyện
- Falsealarm và hitrate của bước dự đoán là gì?
- Falsealarm và hitrate phụ thuộc vào nhau?
- Cần làm bao nhiêu stages?
- Những tham số weighttrimming, eqw, bt, nonsym option là gì?
- Minpos, nsplits, maxtreesplits là gì?
- Thời gian trung bình để huấn luyện trên máy tính?
– Bạn phải đọc lý thuyết adaboost về phân lớp mạnh. Stage là phân lớp mạnh, tóm tắt lại như thế này:
• Bạn có 1000 ảnh dương và bạn muốn hệ thống phát hiện được 900. Như vậy tỉ lệ là 900/1000=0.9. Bình thường thì minhitrate=0.999
• Bạn có 1000 ảnh âm và bạn không muốn hệ thống phát hiện chúng. Nhưng vì 1 số lỗi hệ thống lại phát hiện. Nếu phát hiện sai 490 mẫu thì falsealarm=490/1000=0.49. Bình thường nó là 0.5
– Đúng, bạn không thể đặt minhitrate=1.0 và maxfalsealarm =0.0
Đầu tiên, hệ thống xây dựng bộ phân lớp với hirate mong muốn, sau đó sẽ tính toán falsealarm. Nếu falsealarm cao hơn maxfalselarm, hệ thống sẽ bỏ qua và nhảy qua bước tiếp theo
Thông thường thì từ 14-18 stages:
– Nếu bạn dùng nhiều stage, thì bạn sẽ có tỉ lệ falsealarm tốt hơn nhưng tốn nhiều thời gian hơn.
– Nó sẽ không hiệu quả khi bạn đặt nhiều stages mà có ít ảnh dương và ít ảnh âm
– Những cái này liên quan tới Adaboost, tóm tắt:
• nonsym: nếu ảnh dương không đối xứng theo trục X hoặc Y thì đặt là -nonsym, mặc định là -sym
• eqw: nếu bạn có số lượng ảnh dương khác số lượng ảnh âm thì đặt no eqw sẽ tốt hơn
• weighttrimming: dùng cho tối ưu tính toán. Nó có thể giảm thời gian huấn luyện 1 chút nhưng chất lượng sẽ tệ hơn.
• bt: thuật toán Adaboost sẽ sử dụng: realAB, gentle AB,…
– Đây là những tham số liên quan tới gom cụm. Trong adaboost sự phân lớp yếu có thể sử dụng là: stump-based hoặc tree-based. Nếu bạn chọn nsplits>0, tree-based sẽ được sử dụng và bạn cần thiết lập minpos và maxtreeplits – Có công cụ opencv_performance.exe để kiểm tra. Bạn cần có có ảnh dương chưa được sử dụng để huấn luyện và file_chỉ_mục của những ảnh này. Cú pháp như sau: – Hoặc bạn sử dụng tool Cascada Analytics để đánh giá cũng được Tuỳ thuộc vào công việc và cấu hình máy tính của bạn. Có 1 số quy tắc sau:
• nsplits: số lượng nút trên cây
• maxtreesplits: số lượng nút tối đa. Nếu maxtreesplits
performance -data haarcascade -w 20 -h 20 -info positive_description.txt -ni
performance -data haarcascade.xml -info postive_description.txt -ni
+ Càng nhiều stages thì càng chính xác, ngược lại tốc độ huấn luyện và phát hiện chậm hơn
+ Càng nhiều ảnh thì càng chính xác, và ngược lại tốc độ huấn luyện và phát hiện chậm hơn
+ LBP feature nhanh hơn Haar feature, theo đánh giá thì LBP có độ chính xác gần bằng Haar
Các lỗi xảy ra khi train cascade
- Lỗi khi tạo file vectơ
- Lỗi crash chương trình
- Corrupt JPEG data: premature end of data segment
- Parameters can not be written, because file E:\HaarCascade\params.xml can not be opened.
- OpenCV Error: Assertion failed (elements_read == 1) in icvGetHaarTraininDataFromVecCallback….
- Train dataset for temp stage can not be filled. Branch training terminated
- Opencv Error: Assertion failed (elements_read==1)in unknown function, file c:\path\cvhaartraining.cpp, line 1858
Incorrect size of input array, 0 kb vec file
– Đầu tiên bạn phải kiểm tra file_chỉ_mục: tên_file_ảnh phải đúng
– Không được có dòng rỗng
– Độ phân giải của ảnh dương không được nhỏ hơn -w -h
– Kiểm tra ảnh có tồn tại hoặc có bị lỗi hay không
– Có thể định dạng ảnh không được chấp nhận. Loại được chấp nhận là jpg, bmp, ppm.
Note: từ opencv 3.x trở đi lỗi này được chỉ ra rõ ràng hơn, giúp bạn biết lỗi ở đâu
opencv_haarcascade has stoped working…
Lỗi này do nhiều nguyên nhân, chủ yếu là tham số sai. Các bạn comment câu lệnh lên đây mình sẽ tìm lỗi giùm.
Lỗi này do ảnh dương hoặc ảnh âm không đúng format. Bạn nên dùng 1 công cụ convert ảnh hàng loạt để chuyển ảnh đó sang ảnh đúng định dạng.
Lỗi này do thư mục E:\HaarCascade\ chưa được tạo ra
Khi bạn create_sample với n ảnh thì khi training bạn nên chọn npos ít hơn
Lỗi này là do đường dẫn ảnh âm trong file chỉ mục bị sai. Có 2 cách khắc phục:
1. Thay bằng đường dẫn ảnh tuyệt đối
2. Thêm vào 2 ký tự ./ trước mỗi ảnh, lưu ý ảnh và file chỉ mục phải chung folder. Ví dụ: bgimg1.jpg => ./bgimg1.jpg
Để khắc phục lỗi này bạn cần chỉ định npos (haartraining) nhỏ hơn num (create_samples) theo công thức sau: num >= (npos + (nstages-1) * (1 – minHitRate) * npos) + S. Với:
num là số sample trong file vec
nstages: số bước huấn luyện
minHitRate: độ chính xác
S: số file background
Ví dụ: tạo file vec có 2000 mẫu (-num 1000), có 1500 ảnh background (S), 14 stages, minHitRate là 0.995 thì tính được nPos là:
2000 >= (nPos + (14-1) * (1-0.995) * nPos) + 1500
<=> 500 >= (nPos + 13 * 0.005 * nPos)
<=> 500 >= 1.065 * nPos
<=> nPos = 470
Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file
Các bạn giảm numPos ở bước training xuống. Ví dụ khi tạo mẫu là 1749 ảnh thì khi huấn luyện khoảng 1700 ảnh thôi
Chào bạn,
Bạn có tài liệu tương tự thế nào nhưng dùng trêm hệ điều hành Mac OS hay không, nếu có bạn vui lòng chia sẻ cho mình nhé. Xin cảm ơn!
Anh ơi e làm sai bước nào vậy ạ
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Users\PC>E:\OpenCV2.1\bin\opencv_createsamples
Usage: E:\OpenCV2.1\bin\opencv_createsamples
[-info ]
[-img ]
[-vec ]
[-bg ]
[-num ]
[-bgcolor ]
[-inv] [-randinv] [-bgthresh ]
[-maxidev ]
[-maxxangle ]
[-maxyangle ]
[-maxzangle ]
[-show []]
[-w ]
[-h ]
C:\Users\PC>opencv_createsamples -info E:\GreenParking\location.txt -vec doan.vec -w 30 -h 20 -num 3500
Info file name: E:\GreenParking\location.txt
Img file name: (NULL)
Vec file name: doan.vec
BG file name: (NULL)
Num: 3500
BG color: 0
BG threshold: 80
Invert: FALSE
Max intensity deviation: 40
Max x angle: 1.1
Max y angle: 1.1
Max z angle: 0.5
Show samples: FALSE
Width: 30
Height: 20
Create training samples from images collection…
E:\GreenParking\location.txt(1) : parse errorDone. Created 0 samples
C:\Users\PC>
Chào bạn, mình gặp lỗi khi thực hiện việc train, nó báo lỗi :
Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file
Bạn giúp mình sửa lỗi này với, cám ơn bạn
Lỗi này là do đường dẫn ảnh âm không đúng nhé
Anh cho em hỏi sau khi tạo cascade thì mở rộng thêm mẫu như thế nào ạ
phải train lại từ đầu thôi chứ không mở rộng thêm được nhé
nhận dạng gương mặt để bám theo khuôn mặt có cần training không ạ? vì em cần tốc độ phát hiện nhanh ạ. em cảm ơn ạ
phần này gọi là phát hiện khuôn mặt- detection bạn nhé. Nếu bạn muốn nhanh tự train lại hoặc dùng model do mình train: https://github.com/thigiacmaytinh/FaceDetection/blob/master/bin/Data/lbpcascades/lbpcascade_face_viscom.xml
cd temp
haartraining.exe -data data/cascade -vec data/vector.vec -bg negative/negative.txt -npos 451 -nneg 1001 -nstages 10 -mem 1000 -mode ALL -w 24 -h 32 -nonsym
anh ơi, em bị lỗi là nó chạy train rất lâu. có khi chạy 1 lớp chờ mấy ngày không xong. Anh xem hộ e câu lệnh với
sử dụng haar rất lâu, bạn nên dùng OpenCV phiên bản mới có opencv_traincascade.exe với -LBP sẽ nhanh hơn
không phải anh ạ. Lỗi ở đây là có lúc cũng số lượng ảnh như vậy và số lớp như vậy mà có lần chỉ cần 2-3 tiếng là xong. có lần thì chờ mấy ngày không xong 1 lớp. mà em nghĩ nó cứ chạy thế không bao giờ xong ấy. không biết do đâu anh nhỉ
chắc chắn phải có cái gì đó thay đổi rồi nên kết quả mới khác nhau
Anh có thể làm một video hướng dẫn cụ thể việc tạo file xml phát hiện đối tượng được không ạ.
uhm, để rảnh mình làm, giờ bạn làm theo bài mẫu này đi: https://thigiacmaytinh.com/event-chia-se-kinh-nghiem-object-detection/