python - 为什么重新计算 ORB 描述符比从磁盘加载它更快?

标签 python opencv orb feature-descriptor

我正在尝试确定将大量图片的计算描述符保留在本地文件或数据库中是否有趣(每个 .png 图片的分辨率为 500x500,权重约为 25kb)。

将 ORB 与 Brief-32 描述符结合使用,单个描述符的大小约为 3 MB。这样的大小将保持不变,因为我所有的图片都具有相同的尺寸。

为了找出最快的速度,我进行了以下两项测试:

## TEST : Import descriptor from file
listOfDec = list()
start = datetime.now()

for i in range(0, 100):
    listOfDec.append(np.loadtxt("DESC_TEST".txt"))

end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 
## TEST : Compute descriptor from source image
listOfDec = list()
start = datetime.now()

for i in range(0, 100):
    img1 = cv2.imread(dirPath+picture,0)
    a, desc = orb.detectAndCompute(img1, None)
    listOfDec.append(desc)

end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

老实说,我认为加载数据比重新计算整个描述符更快。

这是我的测试结果:

benchmark plot

所以现在我很困惑。我知道 ORB 是一种非常快的算法,但是“生成”3MB 描述符比从 SSD 磁盘读取它更快吗?我的基准测试有问题吗?

谢谢。

最佳答案

RAM内存确实是much faster比磁盘内存。

然而,3mb 文件的 0.08 秒读取速度为 37.5mb/s,这对于 SSD 来说似乎很低。而且您应该提及加载图像的大小,因为基准测试上的 ORB 计算包括从磁盘读取它们。

ORB 描述符本身非常快,因为计算很简单并且图像数据可以很好地缓存在 CPU 中。 然而,为了获得更好的性能,您应该尝试 C++ 实现而不是 python。并且可能没有理由存储完整的描述符。常见的做法是根据您的用例保存哈希或描述符部分(但在某些情况下也可能需要完整的描述符)。

关于python - 为什么重新计算 ORB 描述符比从磁盘加载它更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58605246/

相关文章:

python - Bash 中任何等效的 * 样式,用于作用于不匹配相同模式的多个文件

java - 将 Python 函数转换为 Java 应用蒙版到图像

c++ - Visual Studio 2012 : 'opencv2/opencv.hpp' : No such file or directory (C1083)

opencv - 消除特征描述符中的误报

php - 在 Laravel 中运行 python 脚本

python - 迭代嵌套字典

Python:处理包含一百万张图像的文件夹而不会出现错误

c++ - opencv c++比较不同图像中的关键点位置

python - 复杂 Numpy 脚本的矢量化实现

opencv - 在 OpenCV 上实现特征脸