-
Notifications
You must be signed in to change notification settings - Fork 895
Expand file tree
/
Copy pathdetect_features.py
More file actions
66 lines (52 loc) · 2.06 KB
/
detect_features.py
File metadata and controls
66 lines (52 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import logging
from multiprocessing import Pool
import time
import numpy as np
from opensfm import dataset
from opensfm import features
logger = logging.getLogger(__name__)
class Command:
name = 'detect_features'
help = 'Compute features for all images'
def add_arguments(self, parser):
parser.add_argument('dataset', help='dataset to process')
def run(self, args):
data = dataset.DataSet(args.dataset)
images = data.images()
arguments = [(image, data) for image in images]
start = time.time()
processes = data.config.get('processes', 1)
if processes == 1:
for arg in arguments:
detect(arg)
else:
p = Pool(processes)
p.map(detect, arguments)
end = time.time()
with open(data.profile_log(), 'a') as fout:
fout.write('detect_features: {0}\n'.format(end - start))
def detect(args):
image, data = args
if not data.feature_index_exists(image):
logger.info('Extracting {} features for image {}'.format(
data.feature_type().upper(), image))
mask = data.mask_as_array(image)
if mask is not None:
logger.info('Found mask to apply for image {}'.format(image))
preemptive_max = data.config.get('preemptive_max', 200)
p_unsorted, f_unsorted, c_unsorted = features.extract_features(
data.image_as_array(image), data.config, mask)
if len(p_unsorted) == 0:
return
size = p_unsorted[:, 2]
order = np.argsort(size)
p_sorted = p_unsorted[order, :]
f_sorted = f_unsorted[order, :]
c_sorted = c_unsorted[order, :]
p_pre = p_sorted[-preemptive_max:]
f_pre = f_sorted[-preemptive_max:]
data.save_features(image, p_sorted, f_sorted, c_sorted)
data.save_preemptive_features(image, p_pre, f_pre)
if data.config.get('matcher_type', 'FLANN') == 'FLANN':
index = features.build_flann_index(f_sorted, data.config)
data.save_feature_index(image, index)