Mercurial Hosting > traffic-intelligence
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())