changeset 948:584b9405e494

added safety analysis parameters for motion patterns
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 21 Jul 2017 12:11:55 -0400
parents 053484e08947
children d6c1c05d11f5
files python/prediction.py python/storage.py scripts/learn-motion-patterns.py scripts/safety-analysis.py tracking.cfg
diffstat 5 files changed, 20 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/python/prediction.py	Fri Jul 21 11:31:42 2017 -0400
+++ b/python/prediction.py	Fri Jul 21 12:11:55 2017 -0400
@@ -583,7 +583,6 @@
                 firstInstants.sort(key = lambda t: t[1])
                 for f,t1 in firstInstants[:min(self.nPredictedTrajectories, len(firstInstants), self.nPredictedTrajectories-len(obj.currentPredictionFeatures))]:
                     obj.currentPredictionFeatures.append(f)
-                print len(obj.currentPredictionFeatures), self.nPredictedTrajectories
                 for f in obj.currentPredictionFeatures:
                     self.addPredictedTrajectories(predictedTrajectories, f, instant)
             else:
--- a/python/storage.py	Fri Jul 21 11:31:42 2017 -0400
+++ b/python/storage.py	Fri Jul 21 12:11:55 2017 -0400
@@ -1366,11 +1366,13 @@
         self.firstFrameNum = config.getint(self.sectionHeader, 'frame1')
         self.videoFrameRate = config.getfloat(self.sectionHeader, 'video-fps')
 
+        self.minFeatureTime = config.getfloat(self.sectionHeader, 'min-feature-time')
+        
         self.classifierFilename = config.get(self.sectionHeader, 'classifier-filename')
         
         # Safety parameters
         self.maxPredictedSpeed = config.getfloat(self.sectionHeader, 'max-predicted-speed')/3.6/self.videoFrameRate
-        self.predictionTimeHorizon = config.getfloat(self.sectionHeader, 'prediction-time-horizon')*self.videoFrameRate
+        self.predictionTimeHorizon = config.getfloat(self.sectionHeader, 'prediction-time-horizon')
         self.collisionDistance = config.getfloat(self.sectionHeader, 'collision-distance')
         self.crossingZones = config.getboolean(self.sectionHeader, 'crossing-zones')
         self.predictionMethod = config.get(self.sectionHeader, 'prediction-method')
@@ -1382,6 +1384,9 @@
         self.maxExtremeSteering = config.getfloat(self.sectionHeader, 'max-extreme-steering')/self.videoFrameRate
         self.useFeaturesForPrediction = config.getboolean(self.sectionHeader, 'use-features-prediction')
         self.constantSpeedPrototypePrediction = config.getboolean(self.sectionHeader, 'constant-speed')
+        self.maxLcssDistance = config.getfloat(self.sectionHeader, 'max-lcss-distance')
+        self.lcssMetric = config.get(self.sectionHeader, 'lcss-metric')
+        self.minLcssSimilarity = config.getfloat(self.sectionHeader, 'min-lcss-similarity')
 
     def __init__(self, filename = None):
         if filename is not None and path.exists(filename):
--- a/scripts/learn-motion-patterns.py	Fri Jul 21 11:31:42 2017 -0400
+++ b/scripts/learn-motion-patterns.py	Fri Jul 21 12:11:55 2017 -0400
@@ -36,7 +36,7 @@
 # 4. load objects from several files, save in another -> see metadata: site with view and times
 # 5. keep prototypes, with positions/velocities, in separate db (keep link to original data through filename, type and index)
 
-# TODO add possibility to clutesr with velocities
+# TODO add possibility to cluster with velocities
 # TODO add possibility to start with saved prototypes so that one can incrementally learn from several databases
 # save the objects that match the prototypes
 # write an assignment function for objects
--- a/scripts/safety-analysis.py	Fri Jul 21 11:31:42 2017 -0400
+++ b/scripts/safety-analysis.py	Fri Jul 21 12:11:55 2017 -0400
@@ -56,7 +56,7 @@
         prototypes = storage.loadPrototypesFromSqlite(args.prototypeDatabaseFilename)
     for p in prototypes:
         p.getMovingObject().computeCumulativeDistances()
-    predictionParameters = prediction.PrototypePredictionParameters(prototypes, params.nPredictedTrajectories, 2., 0.4, 'cityblock', 10, params.constantSpeedPrototypePrediction, params.useFeaturesForPrediction)
+    predictionParameters = prediction.PrototypePredictionParameters(prototypes, params.nPredictedTrajectories, params.maxLcssDistance, params.minLcssSimilarity, params.lcssMetric, params.minFeatureTime, params.constantSpeedPrototypePrediction, params.useFeaturesForPrediction)
 # else:
 # no else required, since parameters is required as argument
 
@@ -68,16 +68,13 @@
 #                                                                                  params.useFeaturesForPrediction)
 
 objects = storage.loadTrajectoriesFromSqlite(params.databaseFilename, 'object', args.nObjects, withFeatures = (params.useFeaturesForPrediction or predictionMethod == 'ps' or predictionMethod == 'mp'))
-# if params.useFeaturesForPrediction:
-#     features = storage.loadTrajectoriesFromSqlite(params.databaseFilename,'feature') # needed if normal adaptation
-#     for obj in objects:
-#         obj.setFeatures(features)
 
 interactions = events.createInteractions(objects)
 for inter in interactions:
+    print('processing interaction {}'.format(inter.getNum())
     inter.computeIndicators()
     if not args.noMotionPrediction:
-        inter.computeCrossingsCollisions(predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, nProcesses = args.nProcesses, debug = True)
+        inter.computeCrossingsCollisions(predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, nProcesses = args.nProcesses)
 
 if args.computePET:
     for inter in interactions:
--- a/tracking.cfg	Fri Jul 21 11:31:42 2017 -0400
+++ b/tracking.cfg	Fri Jul 21 12:11:55 2017 -0400
@@ -75,7 +75,7 @@
 # segmentation distance in feature grouping (world distance unit or px)
 mm-segmentation-distance = 1.81511847456
 # maximum distance between features for grouping (world distance unit or px)
-max-distance = 5
+mm-max-distance = 5
 # minimum cosine of the angle between the velocity vectors for grouping
 min-velocity-cosine = 0.8
 # minimum average number of features per frame to create a vehicle hypothesis
@@ -86,7 +86,7 @@
 # maximum speed when predicting future motion (km/h)
 max-predicted-speed = 50
 # time horizon for collision prediction (s)
-prediction-time-horizon = 5
+prediction-time-horizon = 150
 # collision distance threshold (m)
 collision-distance = 1.8
 # option to compute crossing zones and predicted PET
@@ -108,4 +108,11 @@
 # use feature positions and velocities for prediction
 use-features-prediction = true
 # use constant speed (motion pattern based prediction)
-constant-speed = false
\ No newline at end of file
+constant-speed = false
+# point distance threshold, for the chosen metric for trajectory matching using LCSS
+max-lcss-distance = 2.
+# distance metric for trajectory matching using LCSS
+lcss-metric = cityblock
+# similarity threshold for trajectory matching on normalized LCSS
+min-lcss-similarity = 0.4
+# minimum past feature length for past trajectory matching for motion prediction -> using min-feature-time
\ No newline at end of file