У меня есть папка с изображениями с файлами моделей, для которых я извлекаю ORB
ключевые точки и дескрипторы. Файлы моделей меняются не часто, и мне нужно сравнить их с изображениями с камеры и сравнить их (найти шаблон с ORB-соответствием) с файлами моделей.
В настоящее время мой код выглядит следующим образом:
def orb_compare(model_descriptors, img_kp, img_des, img_wpx, flann_matcher):
matches = flann_matcher.knnMatch(img_des, model_descriptors[0], k=2)
#calculate matches distance to get "good_matches"
good_matches = orb_calc_matches(matches, distance_range=0.65)
good_matches_count = len(good_matches)
#calculate match score, based on which we make best prediction
score = good_matches_count + int((good_matches_count / len(model_descriptors[0]) * 1000))
return (score, good_matches_count, model_descriptors[3], model_descriptors[4])
def orb_calc_matches(matches, distance_range=0.65):
good_matches = []
queried_matches = set() # quicker than lists (no indexes)/only unique elements
for match in matches:
if len(match) == 2:
if ((match[0].trainIdx not in queried_matches) and (match[0].distance < distance_range * match[1].distance)):
good_matches.append(match[0])
queried_matches.add(match[0].trainIdx)
return good_matches
И запускается параллельно для ускорения вещей, используя ThreadPoolExecutor
:
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
for result in executor.map(orb_compare, self.orb_descriptors, repeat(kp), repeat(des), repeat(img_wpx), repeat(self.matcher)):
model_results.append(result)
Может ли кто-нибудь объяснить, как преобразовать функцию orb_calc_matches
в ArrayFire по соображениям производительности? И подтвердить, что это будет быстрее с использованием CUDA / GPU?