Source code for preprocessing.extract_feature
import os
import numpy as np
import h5py
import tqdm
from feature_extractor.utils import build_feature_extractor
from src import const
from src.trajdata import load_trajdata, get_corresponding_roadway
from envs.utils import max_n_objects
from src.Record.frame import Frame
from src.Record.record import SceneRecord, get_scene
[docs]def extract_features(ext, trajdata, roadway, timestep_delta, record_length, offset, prime, maxframes):
'''
:param ext: feature extractor
:param trajdata: trajectory data
:param roadway: roadway object
:param timestep_delta: time step interval
:param record_length: length of the record
:param offset: offset frame
:param prime: prime step
:param maxframes: maximum frames
:return: extracted features
'''
n_features = len(ext)
scene_length = max_n_objects([trajdata])
scene = Frame()
scene.init(scene_length)
rec = SceneRecord()
rec.init(record_length, 0.1, scene_length)
features = dict()
ctr = 0
n_frames = trajdata.nframes
for frame in range(offset - prime, offset):
scene = get_scene(scene, trajdata, frame)
rec.update(scene)
print("offset")
print(offset)
print("n_frames-offset")
print(n_frames - offset)
veh_list = dict()
for frame in range(offset, (n_frames - offset)):
scene = get_scene(scene, trajdata, frame)
for vidx in range(scene.n):
veh = scene[vidx]
veh_list[veh.id] = 0
# print(list(veh_list.keys()))
for frame in tqdm.tqdm(range(offset, n_frames)):
ctr += 1
if maxframes is not None and ctr >= maxframes:
break
# print("\rframe {} / {}\n".format(frame, (n_frames - offset)))
# update the rec
scene = get_scene(scene, trajdata, frame)
rec.update(scene)
# every timestep_delta step, extract features
if frame % timestep_delta == 0:
for vidx in range(scene.n):
veh = scene[vidx]
# extract features
veh_features = ext.pull_features(rec, roadway, vidx)
veh_features = np.array(veh_features)
# print("frame id: {}, vidx: {}, vehicle id: {}".format(frame, vidx, veh.id))
# print(" feature: ", veh_features)
if veh.id not in features.keys():
features[veh.id] = np.zeros((0, n_features))
features[veh.id] = np.concatenate((features[veh.id], veh_features.reshape(1, n_features)), axis=0)
for veh_id in veh_list.keys():
if scene.findfirst(veh_id) is None:
if veh_id not in features.keys():
features[veh_id] = np.zeros((0, n_features))
features[veh_id] = np.concatenate((features[veh_id], np.zeros((1, n_features))), axis=0)
return features
[docs]def write_features(features, output_filepath, ext):
'''
:param features: features
:param output_filepath: output file path
:param ext: feature extractor
:return: no return, write feature to file
'''
n_features = len(ext)
# compute max length across samples
maxlen = 0
for (traj_idx, feature_dict) in features.items():
for (veh_id, veh_features) in feature_dict.items():
maxlen = max(maxlen, veh_features.shape[0])
print("max length across samples: {}".format(maxlen))
# write trajectory features
h5file = h5py.File(output_filepath, "w")
for (traj_idx, feature_dict) in features.items():
feature_array = np.zeros((len(feature_dict), maxlen, n_features))
veh_2_index = list()
for (idx, (veh_id, veh_features)) in enumerate(feature_dict.items()):
veh_2_index.append(veh_id)
# print(idx, veh_id)
feature_array[[idx], 0:veh_features.shape[0], :] = veh_features.reshape(1, veh_features.shape[0], n_features)
# print(veh_2_index)
print("writing features: ")
h5file["{}_feature".format(traj_idx)] = feature_array
h5file["{}_index".format(traj_idx)] = np.array(veh_2_index)
# write feature names
feature_names_encode = []
for subext in ext.feature_names():
feature_names_encode.append(subext.encode())
h5file.attrs["feature_names"] = feature_names_encode
h5file.close()
[docs]def extract_ngsim_features(timestep_delta=1, record_length=10, offset=50, prime=10, maxframes=None,
output_filename="ngsim_holo_new.h5", n_expert_files=1):
'''
:param timestep_delta: timesteps between feature extractions
:param record_length: number of frames for record to track in the past
:param offset: from ends of the trajectories TODO: offset was 500, holo data is too short
:param prime:
:param maxframes: nothing for no max
:param output_filename:
:param n_expert_files: number of time periods for which to extract.
:return: no return, write features to output file
'''
ext = build_feature_extractor()
features = dict()
# extract
for traj_idx in range(n_expert_files):
data_name = const.TRAJDATA_PATHS[traj_idx]
trajdata = load_trajdata(data_name)
scene_length = max_n_objects([trajdata])
scene = Frame()
scene.init(scene_length)
roadway = get_corresponding_roadway(data_name)
features[traj_idx] = extract_features(
ext,
trajdata,
roadway,
timestep_delta,
record_length,
offset,
prime,
maxframes
)
output_filepath = os.path.join(const.DIR, "../data/trajectories/", output_filename)
print("output filepath: {}".format(output_filepath))
write_features(features, output_filepath, ext)