【发布时间】:2021-08-02 15:10:19
【问题描述】:
我在 OpenCV 4.5.2 中使用 SIFT 特征检测器。通过调整cv::SIFT::create() 中的nOctaveLayers 参数,我从detectAndCompute() 得到这些结果:
| nOctaveLayers | KeyPoints | Time Cost (ms) |
|---|---|---|
| 1 | 1026 | 63.41 |
| 2 | 1795 | 45.07 |
| 3 | 2043 | 45.74 |
| 4 | 2173 | 47.83 |
| 5 | 2224 | 51.86 |
据我了解,使用更少的 octave 层应该有更少的计算,但是为什么只有 1 个 octave 层 SIFT 会花费更多的时间?
我还分别测试了detect()和compute(),当nOctaveLayers为1时,它们都花费了更多的时间,这让我很困惑。
测试图像是here(来自 TUM 开放数据集)。提前感谢您的帮助。
[编辑@Micka]我的测试代码:
const int test_num = 100;
const int layers = 5;
cout << "layers: " << layers << endl;
auto sift = SIFT::create(0, layers);
vector<KeyPoint> kps;
Mat descs;
auto t1 = chrono::high_resolution_clock::now();
for (int i = 0; i < test_num; ++i)
sift->detectAndCompute(img_src, noArray(), kps, descs);
auto t2 = chrono::high_resolution_clock::now();
cout << "num of kps: " << kps.size() << endl;
cout << "avg time cost: " << chrono::duration<double>(t2 - t1).count() * 1e3 / test_num << endl;
对于每个nOctaveLayers配置,我在代码中更改layers的值,重新编译&运行&记录结果。
【问题讨论】:
-
你能展示你如何测试的代码吗?如果所有测试都在一个代码中,您可以按相反的顺序尝试(从 5 个八度音阶开始)吗?也许初始化时间目前仅在测试 1 中?此外,使用 N 次运行时的平均运行时间总是好的,因为毫秒测量质量完全取决于系统。
-
测试过程对我来说看起来不错。此外,时间成本在 nOctaves=2 到 5 之间增加,所以我也认为 nOctaves=1 应该有更少的时间成本。也许您将不得不检查 nOctaves=1 在此实现中是否具有特殊含义。您是否知道使用更多八度音程是否只会在更少八度音程的情况下增加额外的关键点,或者是否可以将某些关键点替换为更高的八度音程?如果是后者,可能更高倍频程的关键点更便宜(描述符窗口更小),并且 nOctaves=1 没有机会识别关键点的“真实”大小/倍频程。
-
我大致检查了这个code,但没有发现选择
nOctaves=1有什么特别之处。恕我直言,它应该像 Micka 所说的那样减少时间成本。也许你可以在 github 上提出一个问题并在那里提问。这些人更接近代码。
标签: opencv computer-vision time-complexity sift