Mercurial Hosting > traffic-intelligence
comparison python/storage.py @ 708:a37c565f4b68
merged dev
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Wed, 22 Jul 2015 14:17:44 -0400 |
parents | f83d125d0c55 |
children | 523eda2fafd4 |
comparison
equal
deleted
inserted
replaced
707:7efa36b9bcfd | 708:a37c565f4b68 |
---|---|
4 | 4 |
5 import utils, moving, events, indicators | 5 import utils, moving, events, indicators |
6 from base import VideoFilenameAddable | 6 from base import VideoFilenameAddable |
7 | 7 |
8 import sqlite3, logging | 8 import sqlite3, logging |
9 from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt | |
9 | 10 |
10 | 11 |
11 commentChar = '#' | 12 commentChar = '#' |
12 | 13 |
13 delimiterChar = '%'; | 14 delimiterChar = '%'; |
287 matched_indexes.append((row[0],row[1])) | 288 matched_indexes.append((row[0],row[1])) |
288 | 289 |
289 connection.close() | 290 connection.close() |
290 return matched_indexes | 291 return matched_indexes |
291 | 292 |
292 def getTrajectoryIdQuery(objectNumbers, trajectoryType): | 293 def getObjectCriteria(objectNumbers): |
293 if trajectoryType == 'feature': | |
294 statementBeginning = 'where trajectory_id ' | |
295 elif trajectoryType == 'object': | |
296 statementBeginning = 'and OF.object_id ' | |
297 elif trajectoryType == 'bbtop' or 'bbbottom': | |
298 statementBeginning = 'where object_id ' | |
299 else: | |
300 print('no trajectory type was chosen') | |
301 | |
302 if objectNumbers is None: | 294 if objectNumbers is None: |
303 query = '' | 295 query = '' |
304 elif type(objectNumbers) == int: | 296 elif type(objectNumbers) == int: |
305 query = statementBeginning+'between 0 and {0} '.format(objectNumbers) | 297 query = 'between 0 and {0}'.format(objectNumbers-1) |
306 elif type(objectNumbers) == list: | 298 elif type(objectNumbers) == list: |
307 query = statementBeginning+'in ('+', '.join([str(n) for n in objectNumbers])+') ' | 299 query = 'in ('+', '.join([str(n) for n in objectNumbers])+')' |
300 else: | |
301 print('objectNumbers {} are not a known type ({})'.format(objectNumbers, type(objectNumbers))) | |
302 query = '' | |
308 return query | 303 return query |
309 | 304 |
310 def loadTrajectoriesFromTable(connection, tableName, trajectoryType, objectNumbers = None): | 305 def loadTrajectoriesFromTable(connection, tableName, trajectoryType, objectNumbers = None): |
311 '''Loads trajectories (in the general sense) from the given table | 306 '''Loads trajectories (in the general sense) from the given table |
312 can be positions or velocities | 307 can be positions or velocities |
313 | 308 |
314 returns a moving object''' | 309 returns a moving object''' |
315 cursor = connection.cursor() | 310 cursor = connection.cursor() |
316 | 311 |
317 try: | 312 try: |
318 idQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) | 313 objectCriteria = getObjectCriteria(objectNumbers) |
319 if trajectoryType == 'feature': | 314 if trajectoryType == 'feature': |
320 queryStatement = 'SELECT * from '+tableName+' '+idQuery+'ORDER BY trajectory_id, frame_number' | 315 queryStatement = 'SELECT * from '+tableName |
316 if objectNumbers is not None: | |
317 queryStatement += ' where trajectory_id '+objectCriteria | |
318 queryStatement += ' ORDER BY trajectory_id, frame_number' | |
321 cursor.execute(queryStatement) | 319 cursor.execute(queryStatement) |
322 logging.debug(queryStatement) | 320 logging.debug(queryStatement) |
323 elif trajectoryType == 'object': | 321 elif trajectoryType == 'object': |
324 queryStatement = 'SELECT OF.object_id, P.frame_number, avg(P.x_coordinate), avg(P.y_coordinate) from '+tableName+' P, objects_features OF where P.trajectory_id = OF.trajectory_id '+idQuery+'group by OF.object_id, P.frame_number ORDER BY OF.object_id, P.frame_number' | 322 queryStatement = 'SELECT OF.object_id, P.frame_number, avg(P.x_coordinate), avg(P.y_coordinate) from '+tableName+' P, objects_features OF where P.trajectory_id = OF.trajectory_id' |
323 if objectNumbers is not None: | |
324 queryStatement += ' and OF.object_id '+objectCriteria | |
325 queryStatement += ' group by OF.object_id, P.frame_number ORDER BY OF.object_id, P.frame_number' | |
325 cursor.execute(queryStatement) | 326 cursor.execute(queryStatement) |
326 logging.debug(queryStatement) | 327 logging.debug(queryStatement) |
327 elif trajectoryType in ['bbtop', 'bbbottom']: | 328 elif trajectoryType in ['bbtop', 'bbbottom']: |
328 if trajectoryType == 'bbtop': | 329 if trajectoryType == 'bbtop': |
329 corner = 'top_left' | 330 corner = 'top_left' |
330 elif trajectoryType == 'bbbottom': | 331 elif trajectoryType == 'bbbottom': |
331 corner = 'bottom_right' | 332 corner = 'bottom_right' |
332 queryStatement = 'SELECT object_id, frame_number, x_'+corner+', y_'+corner+' FROM '+tableName+' '+idQuery+'ORDER BY object_id, frame_number' | 333 queryStatement = 'SELECT object_id, frame_number, x_'+corner+', y_'+corner+' FROM '+tableName |
334 if objectNumbers is not None: | |
335 queryStatement += ' where object_id '+objectCriteria | |
336 queryStatement += ' ORDER BY object_id, frame_number' | |
333 cursor.execute(queryStatement) | 337 cursor.execute(queryStatement) |
334 logging.debug(queryStatement) | 338 logging.debug(queryStatement) |
335 else: | 339 else: |
336 print('no trajectory type was chosen') | 340 print('no trajectory type was chosen') |
337 except sqlite3.OperationalError as error: | 341 except sqlite3.OperationalError as error: |
359 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) | 363 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) |
360 | 364 |
361 return objects | 365 return objects |
362 | 366 |
363 def loadUserTypesFromTable(cursor, trajectoryType, objectNumbers): | 367 def loadUserTypesFromTable(cursor, trajectoryType, objectNumbers): |
364 objectIdQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) | 368 objectCriteria = getObjectCriteria(objectNumbers) |
365 if objectIdQuery == '': | 369 queryStatement = 'SELECT object_id, road_user_type from objects' |
366 cursor.execute('SELECT object_id, road_user_type from objects') | 370 if objectNumbers is not None: |
367 else: | 371 queryStatement += ' where object_id '+objectCriteria |
368 cursor.execute('SELECT object_id, road_user_type from objects where '+objectIdQuery[7:]) | 372 cursor.execute(queryStatement) |
369 userTypes = {} | 373 userTypes = {} |
370 for row in cursor: | 374 for row in cursor: |
371 userTypes[row[0]] = row[1] | 375 userTypes[row[0]] = row[1] |
372 return userTypes | 376 return userTypes |
373 | 377 |
374 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None): | 378 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False): |
375 '''Loads the first objectNumbers objects or the indices in objectNumbers from the database''' | 379 '''Loads the first objectNumbers objects or the indices in objectNumbers from the database''' |
376 connection = sqlite3.connect(filename) | 380 connection = sqlite3.connect(filename) |
377 | 381 |
378 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers) | 382 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers) |
379 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers) | 383 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers) |
388 | 392 |
389 if trajectoryType == 'object': | 393 if trajectoryType == 'object': |
390 cursor = connection.cursor() | 394 cursor = connection.cursor() |
391 try: | 395 try: |
392 # attribute feature numbers to objects | 396 # attribute feature numbers to objects |
393 objectIdQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) | 397 objectCriteria = getObjectCriteria(objectNumbers) |
394 queryStatement = 'SELECT P.trajectory_id, OF.object_id from positions P, objects_features OF where P.trajectory_id = OF.trajectory_id '+objectIdQuery+'group by P.trajectory_id order by OF.object_id' # order is important to group all features per object | 398 queryStatement = 'SELECT P.trajectory_id, OF.object_id from positions P, objects_features OF where P.trajectory_id = OF.trajectory_id' |
399 if objectNumbers is not None: | |
400 queryStatement += ' and OF.object_id '+objectCriteria | |
401 queryStatement += ' group by P.trajectory_id order by OF.object_id' # order is important to group all features per object | |
395 cursor.execute(queryStatement) | 402 cursor.execute(queryStatement) |
396 logging.debug(queryStatement) | 403 logging.debug(queryStatement) |
397 | 404 |
398 featureNumbers = {} | 405 featureNumbers = {} |
399 for row in cursor: | 406 for row in cursor: |
408 | 415 |
409 # load userType | 416 # load userType |
410 userTypes = loadUserTypesFromTable(cursor, trajectoryType, objectNumbers) | 417 userTypes = loadUserTypesFromTable(cursor, trajectoryType, objectNumbers) |
411 for obj in objects: | 418 for obj in objects: |
412 obj.userType = userTypes[obj.getNum()] | 419 obj.userType = userTypes[obj.getNum()] |
420 | |
421 if withFeatures: | |
422 nFeatures = 0 | |
423 for obj in objects: | |
424 nFeatures = max(nFeatures, max(obj.featureNumbers)) | |
425 features = loadTrajectoriesFromSqlite(filename, 'feature', nFeatures+1) | |
426 for obj in objects: | |
427 obj.setFeatures(features) | |
413 | 428 |
414 except sqlite3.OperationalError as error: | 429 except sqlite3.OperationalError as error: |
415 printDBError(error) | 430 printDBError(error) |
416 objects = [] | 431 objects = [] |
417 | 432 |
510 TODO choose the interactions to load''' | 525 TODO choose the interactions to load''' |
511 interactions = [] | 526 interactions = [] |
512 connection = sqlite3.connect(filename) | 527 connection = sqlite3.connect(filename) |
513 cursor = connection.cursor() | 528 cursor = connection.cursor() |
514 try: | 529 try: |
515 cursor.execute('select INT.id, INT.object_id1, INT.object_id2, INT.first_frame_number, INT.last_frame_number, IND.indicator_type, IND.frame_number, IND.value from interactions INT, indicators IND where INT.id = IND.interaction_id ORDER BY INT.id, IND.indicator_type') | 530 cursor.execute('select INT.id, INT.object_id1, INT.object_id2, INT.first_frame_number, INT.last_frame_number, IND.indicator_type, IND.frame_number, IND.value from interactions INT, indicators IND where INT.id = IND.interaction_id ORDER BY INT.id, IND.indicator_type, IND.frame_number') |
516 interactionNum = -1 | 531 interactionNum = -1 |
517 indicatorTypeNum = -1 | 532 indicatorTypeNum = -1 |
518 tmpIndicators = {} | 533 tmpIndicators = {} |
519 for row in cursor: | 534 for row in cursor: |
520 if row[0] != interactionNum: | 535 if row[0] != interactionNum: |
521 interactionNum = row[0] | 536 interactionNum = row[0] |
522 interactions.append(events.Interaction(interactionNum, moving.TimeInterval(row[3],row[4]), row[1], row[2])) | 537 interactions.append(events.Interaction(interactionNum, moving.TimeInterval(row[3],row[4]), row[1], row[2])) |
523 interactions[-1].indicators = {} | 538 interactions[-1].indicators = {} |
524 if indicatorTypeNum != row[5]: | 539 if indicatorTypeNum != row[5] or row[0] != interactionNum: |
540 indicatorTypeNum = row[5] | |
525 indicatorName = events.Interaction.indicatorNames[indicatorTypeNum] | 541 indicatorName = events.Interaction.indicatorNames[indicatorTypeNum] |
526 indicatorValues = {row[6]:row[7]} | 542 indicatorValues = {row[6]:row[7]} |
527 interactions[-1].indicators[indicatorName] = indicators.SeverityIndicator(indicatorName, indicatorValues) | 543 interactions[-1].indicators[indicatorName] = indicators.SeverityIndicator(indicatorName, indicatorValues, mostSevereIsMax = not indicatorName in events.Interaction.timeIndicators) |
528 indicatorTypeNum = row[5] | |
529 else: | 544 else: |
530 indicatorValues[row[6]] = row[7] | 545 indicatorValues[row[6]] = row[7] |
546 interactions[-1].indicators[indicatorName].timeInterval.last = row[6] | |
531 except sqlite3.OperationalError as error: | 547 except sqlite3.OperationalError as error: |
532 printDBError(error) | 548 printDBError(error) |
533 return [] | 549 return [] |
534 connection.close() | 550 connection.close() |
535 return interactions | 551 return interactions |
654 Assumed to be sorted over time''' | 670 Assumed to be sorted over time''' |
655 objects = {} # dictionary of objects index by their id | 671 objects = {} # dictionary of objects index by their id |
656 | 672 |
657 if usePandas: | 673 if usePandas: |
658 from pandas import read_csv | 674 from pandas import read_csv |
659 from numpy import min, max, round | |
660 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1) | 675 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1) |
661 generatePDLaneColumn(data) | 676 generatePDLaneColumn(data) |
662 data['TIME'] = data['$VEHICLE:SIMSEC']*simulationStepsPerTimeUnit | 677 data['TIME'] = data['$VEHICLE:SIMSEC']*simulationStepsPerTimeUnit |
663 if warmUpLastInstant is not None: | 678 if warmUpLastInstant is not None: |
664 data = data[data['TIME']>=warmUpLastInstant] | 679 data = data[data['TIME']>=warmUpLastInstant] |
665 grouped = data.loc[:,['NO','TIME']].groupby(['NO'], as_index = False) | 680 grouped = data.loc[:,['NO','TIME']].groupby(['NO'], as_index = False) |
666 instants = grouped['TIME'].agg({'first': min, 'last': max}) | 681 instants = grouped['TIME'].agg({'first': npmin, 'last': npmax}) |
667 for row_index, row in instants.iterrows(): | 682 for row_index, row in instants.iterrows(): |
668 objNum = int(row['NO']) | 683 objNum = int(row['NO']) |
669 tmp = data[data['NO'] == objNum] | 684 tmp = data[data['NO'] == objNum] |
670 objects[objNum] = moving.MovingObject(num = objNum, timeInterval = moving.TimeInterval(row['first'], row['last'])) | 685 objects[objNum] = moving.MovingObject(num = objNum, timeInterval = moving.TimeInterval(row['first'], row['last'])) |
671 # positions should be rounded to nDecimals decimals only | 686 # positions should be rounded to nDecimals decimals only |
672 objects[objNum].curvilinearPositions = moving.CurvilinearTrajectory(S = round(tmp['POS'].tolist(), nDecimals), Y = round(tmp['POSLAT'].tolist(), nDecimals), lanes = tmp['LANE'].tolist()) | 687 objects[objNum].curvilinearPositions = moving.CurvilinearTrajectory(S = npround(tmp['POS'].tolist(), nDecimals), Y = npround(tmp['POSLAT'].tolist(), nDecimals), lanes = tmp['LANE'].tolist()) |
688 if nObjects > 0 and len(objects) >= nObjects: | |
689 break | |
673 return objects.values() | 690 return objects.values() |
674 else: | 691 else: |
675 inputfile = openCheck(filename, quitting = True) | 692 inputfile = openCheck(filename, quitting = True) |
676 # data = pd.read_csv(filename, skiprows=15, delimiter=';') | 693 # data = pd.read_csv(filename, skiprows=15, delimiter=';') |
677 # skip header: 15 lines + 1 | 694 # skip header: 15 lines + 1 |
716 Vehicles are considered finally stationary | 733 Vehicles are considered finally stationary |
717 if more than proportionStationaryTime of their total time | 734 if more than proportionStationaryTime of their total time |
718 If lanes is not None, only the data for the selected lanes will be provided | 735 If lanes is not None, only the data for the selected lanes will be provided |
719 (format as string x_y where x is link index and y is lane index)''' | 736 (format as string x_y where x is link index and y is lane index)''' |
720 from pandas import read_csv | 737 from pandas import read_csv |
721 from numpy import array, sum as npsum | |
722 columns = ['NO', '$VEHICLE:SIMSEC', 'POS'] | 738 columns = ['NO', '$VEHICLE:SIMSEC', 'POS'] |
723 if lanes is not None: | 739 if lanes is not None: |
724 columns += ['LANE\LINK\NO', 'LANE\INDEX'] | 740 columns += ['LANE\LINK\NO', 'LANE\INDEX'] |
725 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, usecols = columns) | 741 data = read_csv(filename, delimiter=';', comment='*', header=0, skiprows = 1, usecols = columns) |
726 data = selectPDLanes(data, lanes) | 742 data = selectPDLanes(data, lanes) |
727 data.sort(['$VEHICLE:SIMSEC'], inplace = True) | 743 data.sort(['$VEHICLE:SIMSEC'], inplace = True) |
728 | 744 |
729 nStationary = 0 | 745 nStationary = 0 |
730 from matplotlib.pyplot import plot, figure | |
731 nVehicles = 0 | 746 nVehicles = 0 |
732 for name, group in data.groupby(['NO'], sort = False): | 747 for name, group in data.groupby(['NO'], sort = False): |
733 nVehicles += 1 | 748 nVehicles += 1 |
734 positions = array(group['POS']) | 749 positions = array(group['POS']) |
735 diff = positions[1:]-positions[:-1] | 750 diff = positions[1:]-positions[:-1] |
752 merged = merge(data, data, how='inner', left_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], right_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], sort = False) | 767 merged = merge(data, data, how='inner', left_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], right_on=['LANE\LINK\NO', 'LANE\INDEX', '$VEHICLE:SIMSEC'], sort = False) |
753 merged = merged[merged['NO_x']>merged['NO_y']] | 768 merged = merged[merged['NO_x']>merged['NO_y']] |
754 | 769 |
755 nCollisions = 0 | 770 nCollisions = 0 |
756 for name, group in merged.groupby(['LANE\LINK\NO', 'LANE\INDEX', 'NO_x', 'NO_y']): | 771 for name, group in merged.groupby(['LANE\LINK\NO', 'LANE\INDEX', 'NO_x', 'NO_y']): |
757 diff = group['POS_x']-group['POS_y'] | 772 diff = group['POS_x'].convert_objects(convert_numeric=True)-group['POS_y'].convert_objects(convert_numeric=True) |
758 if len(diff) >= 2 and min(diff) < 0 and max(diff) > 0: | 773 # diff = group['POS_x']-group['POS_y'] # to check the impact of convert_objects and the possibility of using type conversion in read_csv or function to convert strings if any |
774 if len(diff) >= 2 and npmin(diff) < 0 and npmax(diff) > 0: | |
759 xidx = diff[diff < 0].argmax() | 775 xidx = diff[diff < 0].argmax() |
760 yidx = diff[diff > 0].argmin() | 776 yidx = diff[diff > 0].argmin() |
761 if abs(group.loc[xidx, '$VEHICLE:SIMSEC'] - group.loc[yidx, '$VEHICLE:SIMSEC']) <= collisionTimeDifference: | 777 if abs(group.loc[xidx, '$VEHICLE:SIMSEC'] - group.loc[yidx, '$VEHICLE:SIMSEC']) <= collisionTimeDifference: |
762 nCollisions += 1 | 778 nCollisions += 1 |
763 return nCollisions | 779 return nCollisions |
872 | 888 |
873 Note: framerate is already taken into account''' | 889 Note: framerate is already taken into account''' |
874 | 890 |
875 def loadConfigFile(self, filename): | 891 def loadConfigFile(self, filename): |
876 from ConfigParser import ConfigParser | 892 from ConfigParser import ConfigParser |
877 from numpy import loadtxt | |
878 from os import path | 893 from os import path |
879 | 894 |
880 config = ConfigParser() | 895 config = ConfigParser() |
881 config.readfp(FakeSecHead(openCheck(filename))) | 896 config.readfp(FakeSecHead(openCheck(filename))) |
882 self.sectionHeader = config.sections()[0] | 897 self.sectionHeader = config.sections()[0] |
899 self.undistort = config.getboolean(self.sectionHeader, 'undistort') | 914 self.undistort = config.getboolean(self.sectionHeader, 'undistort') |
900 self.firstFrameNum = config.getint(self.sectionHeader, 'frame1') | 915 self.firstFrameNum = config.getint(self.sectionHeader, 'frame1') |
901 self.videoFrameRate = config.getfloat(self.sectionHeader, 'video-fps') | 916 self.videoFrameRate = config.getfloat(self.sectionHeader, 'video-fps') |
902 | 917 |
903 # Classification parameters | 918 # Classification parameters |
904 | 919 self.speedAggregationMethod = config.get(self.sectionHeader, 'speed-aggregation-method') |
920 self.nFramesIgnoreAtEnds = config.getint(self.sectionHeader, 'nframes-ignore-at-ends') | |
921 self.speedAggregationQuantile = config.getint(self.sectionHeader, 'speed-aggregation-quantile') | |
922 self.minSpeedEquiprobable = config.getfloat(self.sectionHeader, 'min-speed-equiprobable') | |
923 self.minNPixels = config.getint(self.sectionHeader, 'min-npixels-crop') | |
924 self.pedBikeCarSVMFilename = config.get(self.sectionHeader, 'pbv-svm-filename') | |
925 self.bikeCarSVMFilename = config.get(self.sectionHeader, 'bv-svm-filename') | |
926 self.maxPedestrianSpeed = config.getfloat(self.sectionHeader, 'max-ped-speed') | |
927 self.maxCyclistSpeed = config.getfloat(self.sectionHeader, 'max-cyc-speed') | |
928 self.meanPedestrianSpeed = config.getfloat(self.sectionHeader, 'mean-ped-speed') | |
929 self.stdPedestrianSpeed = config.getfloat(self.sectionHeader, 'std-ped-speed') | |
930 self.locationCyclistSpeed = config.getfloat(self.sectionHeader, 'cyc-speed-loc') | |
931 self.scaleCyclistSpeed = config.getfloat(self.sectionHeader, 'cyc-speed-scale') | |
932 self.meanVehicleSpeed = config.getfloat(self.sectionHeader, 'mean-veh-speed') | |
933 self.stdVehicleSpeed = config.getfloat(self.sectionHeader, 'std-veh-speed') | |
905 | 934 |
906 # Safety parameters | 935 # Safety parameters |
907 self.maxPredictedSpeed = config.getfloat(self.sectionHeader, 'max-predicted-speed')/3.6/self.videoFrameRate | 936 self.maxPredictedSpeed = config.getfloat(self.sectionHeader, 'max-predicted-speed')/3.6/self.videoFrameRate |
908 self.predictionTimeHorizon = config.getfloat(self.sectionHeader, 'prediction-time-horizon')*self.videoFrameRate | 937 self.predictionTimeHorizon = config.getfloat(self.sectionHeader, 'prediction-time-horizon')*self.videoFrameRate |
909 self.collisionDistance = config.getfloat(self.sectionHeader, 'collision-distance') | 938 self.collisionDistance = config.getfloat(self.sectionHeader, 'collision-distance') |
918 self.useFeaturesForPrediction = config.getboolean(self.sectionHeader, 'use-features-prediction') | 947 self.useFeaturesForPrediction = config.getboolean(self.sectionHeader, 'use-features-prediction') |
919 | 948 |
920 def __init__(self, filename = None): | 949 def __init__(self, filename = None): |
921 if filename is not None: | 950 if filename is not None: |
922 self.loadConfigFile(filename) | 951 self.loadConfigFile(filename) |
952 | |
953 def convertToFrames(self, speedRatio = 3.6): | |
954 '''Converts parameters with a relationship to time in 'native' frame time | |
955 speedRatio is the conversion from the speed unit in the config file | |
956 to the distance per second | |
957 | |
958 ie param(config file) = speedRatio x fps x param(used in program) | |
959 eg km/h = 3.6 (m/s to km/h) x frame/s x m/frame''' | |
960 denominator = self.videoFrameRate*speedRatio | |
961 denominator2 = denominator**2 | |
962 self.minSpeedEquiprobable = self.minSpeedEquiprobable/denominator | |
963 self.maxPedestrianSpeed = self.maxPedestrianSpeed/denominator | |
964 self.maxCyclistSpeed = self.maxCyclistSpeed/denominator | |
965 self.meanPedestrianSpeed = self.meanPedestrianSpeed/denominator | |
966 self.stdPedestrianSpeed = self.stdPedestrianSpeed/denominator | |
967 self.meanVehicleSpeed = self.meanVehicleSpeed/denominator | |
968 self.stdVehicleSpeed = self.stdVehicleSpeed/denominator | |
969 # special case for the lognormal distribution | |
970 self.locationCyclistSpeed = self.locationCyclistSpeed-log(denominator) | |
971 #self.scaleCyclistSpeed = self.scaleCyclistSpeed | |
923 | 972 |
924 class SceneParameters(object): | 973 class SceneParameters(object): |
925 def __init__(self, config, sectionName): | 974 def __init__(self, config, sectionName): |
926 from ConfigParser import NoOptionError | 975 from ConfigParser import NoOptionError |
927 from ast import literal_eval | 976 from ast import literal_eval |