【发布时间】:2015-08-23 16:50:17
【问题描述】:
我目前正在研究对象分类问题。我的目标是使用 SURF 描述符在 opencv 中训练基于 MLP 的人工神经网络并生成对象分类模型。到目前为止,我已经实现了以下目标:
我正在使用以下代码计算 SURF 关键点:
vector<KeyPoint> computeSURFKeypoints(Mat image) {
SurfFeatureDetector surfdetector(400, 4, 2, true, false);
vector<KeyPoint> keypoints;
surfdetector.detect(image, keypoints);
return keypoints;
}
我使用以下代码在这些关键点上计算 SURF 描述符:
Mat computeSURFDescriptors(Mat image, vector<KeyPoint> keypoints) {
SurfDescriptorExtractor extractor;
Mat descriptors;
extractor.compute(image, keypoints, descriptors);
return descriptors;
}
我面临的问题是描述符的大小因图像而异。对于每个特征点,描述符包含 64 个元素。为了训练神经网络,我希望描述符的大小是固定的。为此,我使用 PCA 来减小描述符大小,如下所示:
Mat projection_result;
PCA pca(descriptors, Mat(), CV_PCA_DATA_AS_COL, 64);
pca.project(descriptors,projection_result);
return projection_result;
这样做,我可以减少描述符的维度,但是选择的特征点不能代表图像,它们会导致匹配结果不佳。如何通过保留好的特征点来降低描述符的维度?任何帮助将不胜感激。
【问题讨论】:
-
你说“......描述符的大小因图像而异。描述符包含每个特征点的 64 个元素”这是没有意义的。SURF 描述符是 64 或 128 个元素。您将扩展标志标记为 True,因此您应该获得 128 个元素。我猜你在谈论不同数量的功能?
-
描述符 count 因图像而异(不是大小)。为了克服这个问题,通常会应用 Bag-of-Words 聚类(最终,将包含到您的字典的距离的固定 N-dim 向量输入到您的 ml 中)
-
@berak:请详细说明一下?也许发布您的想法的答案?
-
例如看看here
标签: opencv neural-network pca feature-extraction surf