-
Notifications
You must be signed in to change notification settings - Fork 14
/
__init__.py
60 lines (50 loc) · 2.55 KB
/
__init__.py
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
"""Feature extractor module."""
import importlib
import re
import numpy as np
from laserchicken import keys,utils
#from .gijs_elena_feature import MyFeatureExtractor
def _feature_map(module_name = __name__):
"""Construct a mapping from feature names to feature extractor classes."""
module = importlib.import_module(module_name)
return {
feature_name: extractor
for name, extractor in vars(module).items() if re.match('^[A-Z][a-zA-Z0-9_]*FeatureExtractor$', name)
for feature_name in extractor.provides()
}
FEATURES = _feature_map()
def compute_features(env_point_cloud, neighborhoods, target_point_cloud, feature_names, overwrite = False):
ordered_features = _make_feature_list(feature_names)
targetsize = len(target_point_cloud[keys.point]["x"]["data"])
for feature in ordered_features:
if((not overwrite) and (feature in target_point_cloud[keys.point])):
continue # Skip feature calc if it is already there and we do not overwrite
extractor = FEATURES[feature]()
providedfeatures = extractor.provides()
numfeatures = len(providedfeatures)
featurevalues = [np.empty(targetsize,dtype = np.float64) for i in range(numfeatures)]
for target_index in range(targetsize):
pointvalues = extractor.extract(env_point_cloud, neighborhoods[target_index], target_point_cloud, target_index)
if(numfeatures > 1):
for i in range(numfeatures):
featurevalues[i][target_index] = pointvalues[i]
else:
featurevalues[0][target_index] = pointvalues
for i in range(numfeatures):
fname = providedfeatures[i]
if(overwrite or (not fname in target_point_cloud[keys.point])):
# Set feature values if it is not there (or we want to overwrite)
target_point_cloud[keys.point][fname] = {"type" : np.float64, "data" : featurevalues[i]}
utils.add_metadata(target_point_cloud,type(extractor).__module__,extractor.get_params())
def _make_feature_list(feature_names):
feature_list = reversed(_make_feature_list_helper(feature_names))
seen = set()
return [f for f in feature_list if not (f in seen or seen.add(f))]
def _make_feature_list_helper(feature_names):
feature_list = feature_names
for feature_name in feature_names:
extractor = FEATURES[feature_name]()
dependencies = extractor.requires()
feature_list.extend(dependencies)
feature_list.extend(_make_feature_list_helper(dependencies))
return feature_list