2

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

使用带有 Brief-32 描述符的 ORB,单个描述符的权重约为 3 兆字节。这样的大小将保持不变,因为我所有的照片都是相同的尺寸。

为了找出最快的我运行了以下两个测试:

## 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) 

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

这是我的测试结果:

基准图

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

谢谢你。

4

1 回答 1

2

RAM 内存确实比磁盘内存快得多。

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

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

于 2019-10-29T12:31:05.413 回答