Почему быстрее пересчитать дескриптор ORB, чем загрузить его с диска? - PullRequest
2 голосов
/ 29 октября 2019

Я пытаюсь решить, будет ли интересно сохранять в локальных файлах или в базе данных вычисленные дескрипторы огромного количества изображений (каждое изображение .png имеет разрешение 500x500 и весит приблизительно 25 КБ).

При использовании ORB с дескрипторами Brief-32 один дескриптор весит около 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) 

Я честно подумалбыло бы быстрее загрузить данные, чем пересчитать весь дескриптор.

Вот результат моего теста:

benchmark plot

Так что теперь я в замешательстве. Я знаю, что ORB - это действительно быстрый алгоритм, но как быстрее «сгенерировать» дескриптор 3 МБ, чем читать его с диска ssd? Что-то не так с моим тестом?

Спасибо.

1 Ответ

2 голосов
/ 29 октября 2019

RAM-память действительно намного быстрее , чем дисковая память.

Однако 0,08 сек для файла 3 Мбайт дает скорость чтения 37,5 Мб / с, что выглядит как низкая для SSD. И вы должны упомянуть размер загружаемых изображений, поскольку вычисления ORB в вашем тесте включают чтение их с диска.

Дескриптор ORB сам по себе очень быстрый, так как вычисления тривиальны, а данные изображений могут хорошо кэшироваться в ЦП. Однако для достижения лучшей производительности вы должны попробовать реализацию C ++ вместо python. И может не быть причины хранить полные дескрипторы. Обычной практикой является сохранение хешей или частей дескрипторов в зависимости от вашего варианта использования (но в некоторых случаях могут понадобиться и полные дескрипторы).

...