2013-08-26 39 views
5

Mục tiêu của tôi là huấn luyện SVM và nhận các vectơ hỗ trợ mà tôi có thể cắm vào HOGdescriptor của opencv để phát hiện đối tượng.Đào tạo cvSVM tạo ra kết quả kém cho HOGDescriptor

Tôi đã thu thập được 4000 ~ tích cực và 15000 ~ âm và tôi đào tạo bằng SVM do opencv cung cấp. kết quả cho tôi quá nhiều kết quả dương tính giả (tối đa 20 ảnh) tôi sẽ trích ra các kết quả dương tính giả và thêm chúng vào nhóm âm bản để đào tạo lại. và tôi sẽ kết thúc với nhiều lần tích cực sai hơn! Tôi đã thử điều chỉnh L2HysThreshold của hogdescriptor của tôi lên đến 300 mà không cải thiện đáng kể. hồ bơi tích cực và âm bản của tôi có đủ lớn không?

đào tạo SVM cũng nhanh hơn nhiều so với dự kiến. Tôi đã thử với kích thước vector tính năng là 2916 và 12996, sử dụng hình ảnh màu xám và hình ảnh màu trên các lần thử riêng biệt. Đào tạo SVM chưa bao giờ kéo dài hơn 20 phút. Tôi sử dụng auto_train. Tôi mới học máy nhưng từ những gì tôi nghe đào tạo với một tập dữ liệu lớn như tôi nên mất ít nhất một ngày không?

Tôi tin rằng cvSVM không học nhiều và theo số http://opencv-users.1802565.n2.nabble.com/training-a-HOG-descriptor-td6363437.html, nó không phù hợp cho mục đích này. có ai có kinh nghiệm với cvSVM có đầu vào nhiều hơn về điều này?

Tôi đang xem xét sử dụng SVMLight http://svmlight.joachims.org/ nhưng có vẻ như không có cách nào để hình dung siêu đa giác SVM. Những lựa chọn của tôi là gì?

tôi sử dụng opencv2.4.3 và đã thử các setsups sau cho hogdescriptor

hog.winSize = cv::Size(100,100); 
hog.cellSize = cv::Size(5,5); 
hog.blockSize = cv::Size(10,10); 
hog.blockStride = cv::Size(5,5); //12996 feature vector 

hog.winSize = cv::Size(100,100); 
hog.cellSize = cv::Size(10,10); 
hog.blockSize = cv::Size(20,20); 
hog.blockStride = cv::Size(10,10); //2916 feature vector 
+0

Nếu bạn đang sử dụng bộ mô tả kích thước khoảng 3000 hoặc 10.000, bạn có nên sử dụng nhiều dữ liệu đào tạo hơn không? Khi tôi nhớ lại, quy tắc ngón tay cái nói rằng kích thước của dữ liệu đào tạo phải gấp khoảng 10 lần kích thước của vấn đề. Đúng không? – GilLevi

Trả lời

6
  1. Thứ nguyên mô tả đầu tiên của bạn quá lớn để có thể hữu ích. Để tạo bất kỳ siêu dữ liệu SVM đáng tin cậy nào, bạn cần ít nhất cùng một số mẫu dương và âm với kích thước mô tả của bạn. Điều này là do lý tưởng bạn cần tách thông tin trong mọi kích thước của siêu máy bay.
  2. Số lượng mẫu dương và âm ít nhiều giống nhau trừ khi bạn cung cấp huấn luyện viên SVM với tham số thiên vị (có thể không có sẵn trong cvSVM).
  3. Không đảm bảo rằng HOG là bộ mô tả tốt cho loại sự cố bạn đang cố giải quyết. Bạn có thể trực quan xác nhận rằng đối tượng bạn đang cố gắng phát hiện có hình dạng riêng biệt với định hướng tương tự trong tất cả các mẫu không? Ví dụ, một loại hoa duy nhất có thể có hình dạng độc đáo, tuy nhiên nhiều loại hoa cùng nhau không có cùng một hình dạng độc đáo. Một cây tre có hình dạng độc đáo nhưng có thể không phân biệt dễ dàng với các đối tượng khác hoặc có thể không có cùng hướng trong tất cả các hình ảnh mẫu.
  4. cvSVM thường không phải là công cụ được sử dụng để đào tạo SVM cho HOG OpenCV. Sử dụng dạng nhị phân của SVMLight (không miễn phí cho các mục đích thương mại) hoặc libSVM (ok cho các mục đích thương mại). Tính toán HOG cho tất cả các mẫu sử dụng mã C++/OpenCV của bạn và ghi nó vào một tệp văn bản theo định dạng đầu vào chính xác cho SVMLight/libSVM. Sử dụng một trong hai chương trình để đào tạo một mô hình sử dụng hạt nhân tuyến tính với mức tối ưu C. Tìm số tối ưu C bằng cách tìm kiếm độ chính xác tốt nhất trong khi thay đổi C trong một vòng lặp.Tính toán vector phát hiện (vector N+1 chiều trong đó N là thứ nguyên của bộ mô tả) bằng cách tìm tất cả các vectơ hỗ trợ, nhân giá trị alpha cho mỗi vectơ hỗ trợ tương ứng, sau đó cho mỗi thứ nguyên thêm tất cả các giá trị alpha * kết quả để tìm một số N D vector. Phần tử cuối cùng thêm -b trong đó b là độ lệch siêu phẳng (bạn có thể tìm thấy nó trong tệp mô hình sắp ra của chương trình đào tạo SVMLight/libSVM). Cấp nguồn phát hiện này N+1 chiều đến HOGDescriptor::setSVMDetector() và sử dụng HOGDescriptor::detect() hoặc HOGDescriptor::detectMultiScale() để phát hiện.
+0

cảm ơn câu trả lời. bạn có thể giải thích tại sao cvSVM không phải là công cụ chính xác không? Tôi tò mò. – tzl

+0

Không có gì sai với cvSVM như một công cụ SVM, nhưng nếu bạn định sử dụng 'HOGDescriptor :: detectMultiScale()', bạn cần một vector dò mà cvSVM không cung cấp. Nếu bạn sử dụng cvSVM, bạn phải thực hiện việc đào tạo, sau đó cho mọi hình ảnh thử nghiệm, bạn phải trích xuất các tính năng HOG theo cách thủ công cho cửa sổ trượt, nạp nó vào cvSVM, nhận kết quả, quy mô lại, thực hiện lại. HOGDescriptor tính toán trước một số HOG để cửa sổ trượt hiệu quả hơn. – Bee

+0

ai đó dường như đã tìm ra cách để có được nó ra khỏi cvSVM. bạn có thể thấy câu trả lời cho http://stackoverflow.com/questions/15339657/training-custom-svm-to-use-with-hogdescriptor-in-opencv Tôi nghĩ rằng vấn đề của tôi rất có thể là điểm 3 trong câu trả lời của bạn. Tôi đã không sắp xếp các đối tượng của tôi trong những hình ảnh tích cực nhất quán. Tôi sẽ thử với một tập hợp các hình ảnh tích cực với cvSVM trước khi chuyển sang SVMLight. Cảm ơn bạn đã giúp đỡ – tzl

2

tôi đã có kết quả thành công sử dụng SVMLight học mô hình SVM khi đào tạo từ OpenCV, nhưng đã không được sử dụng cvSVM, vì vậy có thể' t so sánh.

Chức năng hogDraw từ http://vision.ucsd.edu/~pdollar/toolbox/doc/index.html sẽ trực quan hóa trình mô tả của bạn.

+0

cảm ơn bạn đã chia sẻ. làm thế nào về hình dung hyperplane (chỉnh sửa để làm cho bản thân mình rõ ràng hơn) cho SVM? Tôi muốn kiểm tra loại hạt nhân nào mà tập dữ liệu của tôi phù hợp hơn. – tzl

Các vấn đề liên quan