2014-05-14 15 views
5

Tôi đang gặp sự cố về hiệu suất khi tôi sử dụng BRISK để phát hiện và mô tả tính năng trong OpenCV.Các vấn đề về hiệu suất khi sử dụng trình phát hiện/mô tả BRISK OpenCV

Về cơ bản tôi cố gắng để phù hợp với tất cả các mô tả tôi nhận được từ hình ảnh này: enter image description here

chống lại tất cả các mô tả tôi nhận được từ một cơ sở dữ liệu hình ảnh sử dụng Flann dựa khớp với các thuật toán LSH và nhanh để phát hiện tính năng và mô tả.

Cơ sở dữ liệu hình ảnh của tôi bao gồm 242 hình ảnh. Trong hình ảnh 242 này có ba hình ảnh tương ứng với từng đối tượng được chụp riêng trong truy vấn hình ảnh "phức tạp" ở trên.

Dưới đây là các tham số được sử dụng để phát hiện BRISK (tham số opencv mặc định): Ngưỡng: 30, Octaves: 4, Tỷ lệ mẫu: 1.0.

Sau khi flann khớp với kỹ thuật đối sánh tốt nhất (Mỗi bộ mô tả trong truy vấn hình ảnh được liên kết với vùng lân cận gần nhất trong bộ mô tả cơ sở dữ liệu), thuật toán của tôi xuất danh sách các hình ảnh cơ sở dữ liệu được sắp xếp theo tỷ lệ phần trăm phù hợp. Dưới đây là bốn kết quả đầu tiên:

  1. Hình ảnh tương ứng với bu lông trong cơ sở dữ liệu: 4 khớp/15 điểm phát hiện => Tỷ lệ phần trăm phù hợp: 26,7%.
  2. Hình ảnh tương ứng với chai trong cơ sở dữ liệu có 4 kết quả phù hợp/15 điểm phát hiện => Tỷ lệ phần trăm so khớp: 26,7%.
  3. Hình ảnh tương ứng với chốt trong cơ sở dữ liệu có 10 kết quả phù hợp/59 điểm phát hiện => Tỷ lệ phần trăm so khớp: 16,9%.
  4. Hình ảnh tương ứng với đối tượng không có trong truy vấn hình ảnh: 1 kết quả phù hợp/16 điểm phát hiện => Tỷ lệ phần trăm so khớp: 16,7%.

Tôi đã so sánh kết quả này bằng cách sử dụng ORB làm phát hiện và mô tả tính năng. Dưới đây là các thông số được sử dụng: Số các tính năng: năm 2000, yếu tố Quy mô: 1.2, Số lượng kim tự tháp: 8.

Dưới đây là kết quả tôi nhận được:

  1. hình ảnh tương ứng với tia trong cơ sở dữ liệu: 576 kết quả phù hợp/752 điểm phát hiện được phát hiện => Tỷ lệ phần trăm so khớp: 76,6%.
  2. Hình ảnh tương ứng với chai trong cơ sở dữ liệu có 111 lượt khớp/189 điểm phát hiện => Tỷ lệ phần trăm so khớp: 58,7%.
  3. Hình ảnh tương ứng với bút trong cơ sở dữ liệu có 124 lượt khớp/293 điểm phát hiện được => Tỷ lệ phần trăm so khớp: 42,3%.
  4. Hình ảnh tương ứng với đối tượng không có trong truy vấn hình ảnh: 2 kết quả phù hợp/66 điểm phát hiện => Tỷ lệ phần trăm so khớp: 3%.

Như bạn có thể thấy kết quả tốt hơn nhiều với ORB. Thứ nhất, có nhiều điểm phát hiện được phát hiện trên mỗi hình ảnh trong cơ sở dữ liệu và tỷ lệ phần trăm phù hợp là tốt hơn đáng kể cho các đối tượng tốt.Hơn nữa khoảng cách giữa tỷ lệ phần trăm phù hợp với các đối tượng tốt và tỷ lệ phần trăm phù hợp cho các đối tượng sai là quan trọng hơn.

Tôi tự hỏi tại sao máy phát hiện BRISK phát hiện điểm quan trọng ít hơn nhiều so với bộ dò ORB. Tôi đã thực hiện các bài kiểm tra khác nhau để tìm ra cách tôi có thể phát hiện nhiều điểm quan trọng hơn với bộ dò BRISK (Giảm ngưỡng, giảm số quãng tám). Tôi thực sự có thể phát hiện một ít điểm chính hơn nhưng sự khác biệt với bộ dò ORB vẫn thực sự quan trọng. Bạn có bất kỳ ý tưởng tại sao BRISK phát hiện có một hành vi như vậy?

phiên bản OpenCV của tôi là 2.4.8 nhưng tôi đã cố gắng phần phát hiện nhanh với 2.4.4 và phiên bản 2.4.9 theo các báo cáo:

http://code.opencv.org/issues/2491BRISK feature detector detects zero keypoints mà không cải tiến.

Tôi cũng đã cố gắng kết hợp thiết bị dò ORB với mô tả BRISK. Kết quả phù hợp tốt hơn so với phương pháp thứ nhất (đầy đủ BRISK) nhưng kém hơn phương thức thứ nhất (đầy đủ ORB):

  1. Hình ảnh tương ứng với bu lông trong cơ sở dữ liệu: 529 khớp/708 điểm phát hiện => Tỷ lệ phần trăm phù hợp: 74,7%.
  2. Hình ảnh tương ứng với chai trong cơ sở dữ liệu có 69 lượt khớp/134 điểm phát hiện => Tỷ lệ phần trăm so khớp: 51,5%.
  3. Hình ảnh tương ứng với bút trong cơ sở dữ liệu đã khớp với 93/247 điểm phát hiện được => Tỷ lệ phần trăm so khớp: 37,6%.
  4. Hình ảnh tương ứng với đối tượng không có trong truy vấn hình ảnh: 5 đối sánh/50 điểm phát hiện => Tỷ lệ phần trăm so khớp: 10%.

Lưu ý rằng số lượng keypoint phát hiện trên mỗi hình ảnh là không giống nhau trong phương pháp 2 và phương pháp 3. Thực ra khi tôi chạy mã này trên một hình ảnh thử nghiệm (ở đây hình ảnh của bolt):

// BRISK parameters 
int Threshl=30; 
int Octaves=4; 
float PatternScales=1.0f; 

// ORB parameters 
int nFeatures=2000; 
float scaleFactor=1.2f; 
int nLevels=8; 


BRISK BRISKD(Threshl, Octaves, PatternScales); 
ORB ORBD(nFeatures, scaleFactor, nLevels); 

vector<KeyPoint> kpts; 
Mat descriptors; 

Mat img = cv::imread("Path to the bolt image", IMREAD_GRAYSCALE); 
ORBD.detect(img,kpts); // Number of keypoints detected = 752 
BRISKD.compute(img, kpts, descriptors); // Number of descriptors = 708 

BRISK dường như không tính toán tất cả các điểm khóa được phát hiện trong bộ mô tả (752 điểm được phát hiện bởi bộ dò ORB => 708 mô tả được tính bằng bộ mô tả BRISK).

Tuy nhiên, ngay cả khi tất cả các điểm khóa được phát hiện bởi ORB đều không được tính toán trong các mô tả BRISK. Có vẻ như với những kết quả này BRISK không tốt hơn để mô tả một điểm chính hơn ORB? Hãy sửa tôi nếu tôi sai nhưng tôi chắc chắn rằng điều đó ngược lại ...

Nếu bạn có bất kỳ yếu tố nào có thể giúp tôi hiểu kết quả của mình hoặc nếu bạn đã gặp phải một số vấn đề với BRISK trong OpenCV làm ơn cho tôi biết. Mọi sự trợ giúp sẽ rất được trân trọng :).

Trả lời

8

Ok Tôi đã tìm hiểu cách nhận kết quả như mong đợi từ BRISK. Tôi đã thử các mã từ tác giả bộ nhanh ở đây: https://github.com/calihem/mavhub/tree/master/thirdparty

Dưới đây là kết quả tôi nhận được:

  1. hình ảnh tương ứng với tia trong cơ sở dữ liệu: 149 trận/288 phát hiện keypoint => tỷ lệ Matching: 51,7%.
  2. Hình ảnh tương ứng với chai trong cơ sở dữ liệu có 27 kết quả/57 điểm phát hiện => Tỷ lệ phần trăm phù hợp: 47,4%.
  3. Hình ảnh tương ứng với bút trong cơ sở dữ liệu có 38 đối sánh/101 điểm phát hiện => Tỷ lệ phần trăm phù hợp: 37,6%.
  4. Hình ảnh tương ứng với đối tượng không có trong truy vấn hình ảnh: 5 kết quả phù hợp/76 điểm phát hiện => Tỷ lệ phần trăm so khớp: 6.6%.

Kết quả này tốt hơn nhiều so với những gì tôi đã có trước đây. Trên thực tế, chúng không tốt hơn những gì thu được với ORB cho hình ảnh truy vấn cụ thể này. Tuy nhiên, tôi đã thử các hình ảnh truy vấn khác, đặc biệt hình ảnh phức tạp hơn và BRISK hoạt động tốt hơn ORB.

Dường như có vấn đề với việc triển khai BRISK trong opencv ít nhất là từ phiên bản 2.4.4 cho đến phiên bản hiện tại 2.4.9. Tôi nghĩ rằng lỗi này nên được sửa chữa sớm vì nó đã được báo cáo cho cộng đồng opencv (http://code.opencv.org/issues/2491).

Trong thời gian chờ đợi, tôi khuyên bạn nên sử dụng mã được viết bởi trình tạo BRISK hoạt động tốt;).

+1

cảm ơn bạn đã cung cấp câu trả lời cho vấn đề của mình! – Apolo

+0

Bạn có chạy mã BRISK gốc từ bên trong OpenCV hoặc bên ngoài không? –

+3

Tôi đã chạy mã Brisk ban đầu từ đây: https://github.com/rghunter/BRISK Lưu ý rằng bạn sẽ cần OpenCV 2.2 hoặc mới hơn để chạy mã này. Bạn sẽ có thể chạy mã Brisk ban đầu từ bên trong OpenCV nhưng trước tiên bạn sẽ cần phải tìm phiên bản OpenCV mã Brisk đã hoạt động ... Một nơi nào đó giữa 2.2 và 2.4.4. – Maximus

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