changeset 985:668a85c963c3

work on processing and managing large video datasets
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 06 Mar 2018 22:44:33 -0500
parents a69695d14e59
children 3be8aaa47651
files python/prediction.py scripts/display-synced-trajectories.py scripts/merge-features.py scripts/play-synced-videos.py scripts/process.py
diffstat 5 files changed, 57 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/python/prediction.py	Tue Mar 06 08:26:13 2018 -0500
+++ b/python/prediction.py	Tue Mar 06 22:44:33 2018 -0500
@@ -480,7 +480,7 @@
         p1 = obj1.getPositionAtInstant(currentInstant)
         p2 = obj2.getPositionAtInstant(currentInstant)
         if (p1-p2).norm2() <= collisionDistanceThreshold:
-            collisionPoints = [SafetyPoint((p1+p1)*0.5, 1., 0.)]
+            collisionPoints = [SafetyPoint((p1+p2)*0.5, 1., 0.)]
         else:
             v1 = obj1.getVelocityAtInstant(currentInstant)
             v2 = obj2.getVelocityAtInstant(currentInstant)
--- a/scripts/display-synced-trajectories.py	Tue Mar 06 08:26:13 2018 -0500
+++ b/scripts/display-synced-trajectories.py	Tue Mar 06 22:44:33 2018 -0500
@@ -5,7 +5,7 @@
 import numpy as np
 import cv2
 import cvutils, utils, storage
-from metadata import createDatabase, Site, CameraView, VideoSequence
+from metadata import connectDatabase, Site, CameraView, VideoSequence
 
 parser = argparse.ArgumentParser(description='The program displays several views of the same site synchronously.')
 parser.add_argument('--db', dest = 'metadataFilename', help = 'name of the metadata file', required = True)
@@ -19,7 +19,7 @@
 
 args = parser.parse_args()
 
-session = createDatabase(args.metadataFilename)
+session = connectDatabase(args.metadataFilename)
 
 mergedSequence = session.query(VideoSequence).filter(VideoSequence.databaseFilename == args.databaseFilename).first()
 if mergedSequence is None:
--- a/scripts/merge-features.py	Tue Mar 06 08:26:13 2018 -0500
+++ b/scripts/merge-features.py	Tue Mar 06 22:44:33 2018 -0500
@@ -2,7 +2,7 @@
 
 import sys, argparse, os.path, sqlite3
 import cvutils, utils, moving, storage
-from metadata import createDatabase, Site, VideoSequence, CameraView, getSite
+from metadata import connectDatabase, Site, VideoSequence, CameraView, getSite
 from datetime import datetime, timedelta
 
 timeConverter = utils.TimeConverter()
@@ -16,7 +16,7 @@
 
 args = parser.parse_args()
 
-session = createDatabase(args.metadataFilename)
+session = connectDatabase(args.metadataFilename)
 
 site = getSite(session, args.siteId)
 if site is None:
--- a/scripts/play-synced-videos.py	Tue Mar 06 08:26:13 2018 -0500
+++ b/scripts/play-synced-videos.py	Tue Mar 06 22:44:33 2018 -0500
@@ -2,7 +2,7 @@
 
 import sys, argparse, os.path
 import cvutils, utils
-from metadata import createDatabase, Site, CameraView, VideoSequence, getSite
+from metadata import connectDatabase, Site, CameraView, VideoSequence, getSite
 from datetime import datetime, timedelta
 
 timeConverter = utils.TimeConverter()
@@ -17,7 +17,7 @@
 
 args = parser.parse_args()
 
-session = createDatabase(args.metadataFilename)
+session = connectDatabase(args.metadataFilename)
 
 site = getSite(session, args.siteId)
 if site is None:
--- a/scripts/process.py	Tue Mar 06 08:26:13 2018 -0500
+++ b/scripts/process.py	Tue Mar 06 22:44:33 2018 -0500
@@ -10,6 +10,9 @@
 parser.add_argument('--db', dest = 'metadataFilename', help = 'name of the metadata file', required = True)
 parser.add_argument('--videos', dest = 'videoIds', help = 'indices of the video sequences', nargs = '*', type = int)
 parser.add_argument('--pet', dest = 'computePET', help = 'computes PET', action = 'store_true')
+parser.add_argument('--delete', dest = 'delete', help = 'data to delete', choices = ['feature', 'object', 'classification', 'interaction'])
+parser.add_argument('--process', dest = 'process', help = 'data to process', choices = ['feature', 'object', 'classification', 'interaction'])
+parser.add_argument('--analyze', dest = 'analyze', help = 'data to analyze (results)', choices = ['feature', 'object', 'classification', 'interaction'])
 
 # need way of selecting sites as similar as possible to sql alchemy syntax
 # override tracking.cfg from db
@@ -21,28 +24,53 @@
 args = parser.parse_args()
 # files are relative to metadata location
 
-session = createDatabase(args.metadataFilename)
+session = connectDatabase(args.metadataFilename)
 parentDir = Path(args.metadataFilename).parent
 
-# todo change prediction parameters
-predictionParameters = prediction.CVExactPredictionParameters()
+if args.delete is not None:
+    if args.delete in ['object', 'interaction']:
+        #parser.add_argument('-t', dest = 'dataType', help = 'type of the data to remove', required = True, choices = ['object','interaction', 'bb', 'pois', 'prototype'])
+        for videoId in args.videoIds:
+            vs = session.query(VideoSequence).get(videoId)
+            storage.deleteFromSqlite(str(parentDir/vs.getDatabaseFilename()), args.delete)
 
-for videoId in args.videoIds:
-    vs = session.query(VideoSequence).get(videoId)
-    print(vs.getDatabaseFilename())
-    objects = storage.loadTrajectoriesFromSqlite(str(parentDir/vs.getDatabaseFilename()), 'object')#, args.nObjects, withFeatures = (params.useFeaturesForPrediction or predictionMethod == 'ps' or predictionMethod == 'mp'))
-    interactions = events.createInteractions(objects)
-    #if args.nProcesses == 1:
-    params = storage.ProcessParameters(str(parentDir/vs.cameraView.getTrackingConfigurationFilename()))
-    #print(interactions, True, args.computePET, predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones)
-    processed = events.computeIndicators(interactions, True, args.computePET, predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, False, None)
-    storage.saveIndicatorsToSqlite(str(parentDir/vs.getDatabaseFilename()), processed)
-    
-# else:
-#     pool = Pool(processes = args.nProcesses)
-#     nInteractionPerProcess = int(np.ceil(len(interactions)/float(args.nProcesses)))
-#     jobs = [pool.apply_async(events.computeIndicators, args = (interactions[i*nInteractionPerProcess:(i+1)*nInteractionPerProcess], not args.noMotionPrediction, args.computePET, predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, False, None)) for i in range(args.nProcesses)]
-#     processed = []
-#     for job in jobs:
-#         processed += job.get()
-#     pool.close()
+if args.process == 'interaction':
+    # safety analysis TODO make function in safety analysis script
+    predictionParameters = prediction.CVExactPredictionParameters()
+    for videoId in args.videoIds:
+        vs = session.query(VideoSequence).get(videoId)
+        print('Processing '+vs.getDatabaseFilename())
+        objects = storage.loadTrajectoriesFromSqlite(str(parentDir/vs.getDatabaseFilename()), 'object')#, args.nObjects, withFeatures = (params.useFeaturesForPrediction or predictionMethod == 'ps' or predictionMethod == 'mp'))
+        interactions = events.createInteractions(objects)
+        #if args.nProcesses == 1:
+        #print(str(parentDir/vs.cameraView.getTrackingConfigurationFilename()))
+        params = storage.ProcessParameters(str(parentDir/vs.cameraView.getTrackingConfigurationFilename()))
+        #print(len(interactions), args.computePET, predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones)
+        processed = events.computeIndicators(interactions, True, args.computePET, predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, False, None)
+        storage.saveIndicatorsToSqlite(str(parentDir/vs.getDatabaseFilename()), processed)
+    # else:
+    #     pool = Pool(processes = args.nProcesses)
+    #     nInteractionPerProcess = int(np.ceil(len(interactions)/float(args.nProcesses)))
+    #     jobs = [pool.apply_async(events.computeIndicators, args = (interactions[i*nInteractionPerProcess:(i+1)*nInteractionPerProcess], not args.noMotionPrediction, args.computePET, predictionParameters, params.collisionDistance, params.predictionTimeHorizon, params.crossingZones, False, None)) for i in range(args.nProcesses)]
+    #     processed = []
+    #     for job in jobs:
+    #         processed += job.get()
+    #     pool.close()
+
+if args.analyze == 'interaction':
+    indicatorIds = [2,5,7,10]
+    indicators = {}
+    interactions = {}
+    for videoId in args.videoIds:
+        vs = session.query(VideoSequence).get(videoId)
+        if not vs.cameraView.siteIdx in interactions:
+            interactions[vs.cameraView.siteIdx] = []
+            for i in indicatorIds:
+                indicators[events.Interaction.indicatorNames[i]][vs.cameraView.siteIdx] = []
+        interactions[vs.cameraView.siteIdx].append(storage.loadInteractionsFromSqlite(str(parentDir/vs.getDatabaseFilename())))
+        print(vs.getDatabaseFilename(), len(interactions))
+        for inter in interactions[videoId]:
+            for i in indicatorIds:
+                indic = inter.getIndicator(events.Interaction.indicatorNames[i])
+                if indic is not None:
+                    indicators[events.Interaction.indicatorNames[i]][vs.cameraView.siteIdx].append(indic.getMostSevereValue())