comparison trafficintelligence/storage.py @ 1077:3939ae415be0

Merging
author Wendlasida
date Fri, 20 Jul 2018 14:03:34 -0400
parents 67144f26609e d4d052a05337
children e53c6e87bb3f
comparison
equal deleted inserted replaced
1076:108c5dc4e34a 1077:3939ae415be0
68 cursor.execute('SELECT COUNT(*) FROM SQLITE_MASTER WHERE type = \'table\' AND name = \''+tableName+'\'') 68 cursor.execute('SELECT COUNT(*) FROM SQLITE_MASTER WHERE type = \'table\' AND name = \''+tableName+'\'')
69 return cursor.fetchone()[0] == 1 69 return cursor.fetchone()[0] == 1
70 except sqlite3.OperationalError as error: 70 except sqlite3.OperationalError as error:
71 printDBError(error) 71 printDBError(error)
72 72
73 def tableNames(filename):
74 'Lists the names of the tables in the SQLite file'
75 if Path(filename).is_file():
76 with sqlite3.connect(filename) as connection:
77 try:
78 cursor = connection.cursor()
79 cursor.execute('SELECT name FROM sqlite_master WHERE type = \'table\'')
80 return [row[0] for row in cursor]
81 except sqlite3.OperationalError as error:
82 printDBError(error)
83 return []
84
73 def createTrajectoryTable(cursor, tableName): 85 def createTrajectoryTable(cursor, tableName):
74 if tableName.endswith('positions') or tableName.endswith('velocities'): 86 if tableName.endswith('positions') or tableName.endswith('velocities'):
75 cursor.execute("CREATE TABLE IF NOT EXISTS "+tableName+" (trajectory_id INTEGER, frame_number INTEGER, x_coordinate REAL, y_coordinate REAL, PRIMARY KEY(trajectory_id, frame_number))") 87 cursor.execute("CREATE TABLE IF NOT EXISTS "+tableName+" (trajectory_id INTEGER, frame_number INTEGER, x_coordinate REAL, y_coordinate REAL, PRIMARY KEY(trajectory_id, frame_number))")
76 else: 88 else:
77 print('Unallowed name {} for trajectory table'.format(tableName)) 89 print('Unallowed name {} for trajectory table'.format(tableName))
257 if object, features can be loaded with withFeatures or nLongestObjectFeatures used to select the n longest features 269 if object, features can be loaded with withFeatures or nLongestObjectFeatures used to select the n longest features
258 270
259 The number loaded is either the first objectNumbers objects, 271 The number loaded is either the first objectNumbers objects,
260 or the indices in objectNumbers from the database''' 272 or the indices in objectNumbers from the database'''
261 objects = [] 273 objects = []
262 with sqlite3.connect(filename) as connection: 274 if Path(filename).is_file():
263 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) 275 with sqlite3.connect(filename) as connection:
264 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) 276 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep)
265 277 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep)
266 if len(objectVelocities) > 0: 278
267 for o,v in zip(objects, objectVelocities): 279 if len(objectVelocities) > 0:
268 if o.getNum() == v.getNum(): 280 for o,v in zip(objects, objectVelocities):
269 o.velocities = v.positions 281 if o.getNum() == v.getNum():
270 o.velocities.duplicateLastPosition() # avoid having velocity shorter by one position than positions 282 o.velocities = v.positions
271 else: 283 o.velocities.duplicateLastPosition() # avoid having velocity shorter by one position than positions
272 print('Could not match positions {0} with velocities {1}'.format(o.getNum(), v.getNum()))
273
274 if trajectoryType == 'object':
275 cursor = connection.cursor()
276 try:
277 # attribute feature numbers to objects
278 queryStatement = 'SELECT trajectory_id, object_id FROM objects_features'
279 if objectNumbers is not None:
280 queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers)
281 queryStatement += ' ORDER BY object_id' # order is important to group all features per object
282 logging.debug(queryStatement)
283 cursor.execute(queryStatement)
284
285 featureNumbers = {}
286 for row in cursor:
287 objId = row[1]
288 if objId not in featureNumbers:
289 featureNumbers[objId] = [row[0]]
290 else: 284 else:
291 featureNumbers[objId].append(row[0]) 285 print('Could not match positions {0} with velocities {1}'.format(o.getNum(), v.getNum()))
292 286
293 for obj in objects: 287 if trajectoryType == 'object':
294 obj.featureNumbers = featureNumbers[obj.getNum()] 288 cursor = connection.cursor()
295 289 try:
296 # load userType 290 # attribute feature numbers to objects
297 attributes = loadObjectAttributesFromTable(cursor, objectNumbers, True) 291 queryStatement = 'SELECT trajectory_id, object_id FROM objects_features'
298 for obj in objects: 292 if objectNumbers is not None:
299 userType, nObjects = attributes[obj.getNum()] 293 queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers)
300 obj.setUserType(userType) 294 queryStatement += ' ORDER BY object_id' # order is important to group all features per object
301 obj.setNObjects(nObjects) 295 logging.debug(queryStatement)
302 296 cursor.execute(queryStatement)
303 # add features 297
304 if withFeatures: 298 featureNumbers = {}
299 for row in cursor:
300 objId = row[1]
301 if objId not in featureNumbers:
302 featureNumbers[objId] = [row[0]]
303 else:
304 featureNumbers[objId].append(row[0])
305
305 for obj in objects: 306 for obj in objects:
306 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', obj.featureNumbers, timeStep = timeStep) 307 obj.featureNumbers = featureNumbers[obj.getNum()]
307 elif nLongestFeaturesPerObject is not None: 308
309 # load userType
310 attributes = loadObjectAttributesFromTable(cursor, objectNumbers, True)
308 for obj in objects: 311 for obj in objects:
309 queryStatement = 'SELECT trajectory_id, max(frame_number)-min(frame_number) AS length FROM positions WHERE trajectory_id '+getObjectCriteria(obj.featureNumbers)+' GROUP BY trajectory_id ORDER BY length DESC' 312 userType, nObjects = attributes[obj.getNum()]
310 logging.debug(queryStatement) 313 obj.setUserType(userType)
311 cursor.execute(queryStatement) 314 obj.setNObjects(nObjects)
312 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', [row[0] for i,row in enumerate(cursor) if i<nLongestFeaturesPerObject], timeStep = timeStep) 315
313 316 # add features
314 except sqlite3.OperationalError as error: 317 if withFeatures:
315 printDBError(error) 318 for obj in objects:
319 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', obj.featureNumbers, timeStep = timeStep)
320 elif nLongestFeaturesPerObject is not None:
321 for obj in objects:
322 queryStatement = 'SELECT trajectory_id, max(frame_number)-min(frame_number) AS length FROM positions WHERE trajectory_id '+getObjectCriteria(obj.featureNumbers)+' GROUP BY trajectory_id ORDER BY length DESC'
323 logging.debug(queryStatement)
324 cursor.execute(queryStatement)
325 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', [row[0] for i,row in enumerate(cursor) if i<nLongestFeaturesPerObject], timeStep = timeStep)
326
327 except sqlite3.OperationalError as error:
328 printDBError(error)
316 return objects 329 return objects
317 330
318 def loadObjectFeatureFrameNumbers(filename, objectNumbers = None): 331 def loadObjectFeatureFrameNumbers(filename, objectNumbers = None):
319 'Loads the feature frame numbers for each object' 332 'Loads the feature frame numbers for each object'
320 with sqlite3.connect(filename) as connection: 333 with sqlite3.connect(filename) as connection:
449 (format of SQLite output by the ground truth annotation tool 462 (format of SQLite output by the ground truth annotation tool
450 or Urban Tracker 463 or Urban Tracker
451 464
452 Load descriptions?''' 465 Load descriptions?'''
453 objects = [] 466 objects = []
454 with sqlite3.connect(filename) as connection: 467 if Path(filename).is_file():
455 if objectType == 'bb': 468 with sqlite3.connect(filename) as connection:
456 topCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbtop', objectNumbers, timeStep) 469 if objectType == 'bb':
457 bottomCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbbottom', objectNumbers, timeStep) 470 topCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbtop', objectNumbers, timeStep)
458 userTypes = loadObjectAttributesFromTable(connection.cursor(), objectNumbers) # string format is same as object 471 bottomCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbbottom', objectNumbers, timeStep)
459 472 userTypes = loadObjectAttributesFromTable(connection.cursor(), objectNumbers) # string format is same as object
460 for t, b in zip(topCorners, bottomCorners): 473
461 num = t.getNum() 474 for t, b in zip(topCorners, bottomCorners):
462 if t.getNum() == b.getNum(): 475 num = t.getNum()
463 annotation = moving.BBMovingObject(num, t.getTimeInterval(), t, b, userTypes[num]) 476 if t.getNum() == b.getNum():
464 objects.append(annotation) 477 annotation = moving.BBMovingObject(num, t.getTimeInterval(), t, b, userTypes[num])
465 else: 478 objects.append(annotation)
466 print ('Unknown type of bounding box {}'.format(objectType)) 479 else:
480 print ('Unknown type of bounding box {}'.format(objectType))
467 return objects 481 return objects
468 482
469 def saveInteraction(cursor, interaction): 483 def saveInteraction(cursor, interaction):
470 roadUserNumbers = list(interaction.getRoadUserNumbers()) 484 roadUserNumbers = list(interaction.getRoadUserNumbers())
471 cursor.execute('INSERT INTO interactions VALUES({}, {}, {}, {}, {})'.format(interaction.getNum(), roadUserNumbers[0], roadUserNumbers[1], interaction.getFirstInstant(), interaction.getLastInstant())) 485 cursor.execute('INSERT INTO interactions VALUES({}, {}, {}, {}, {})'.format(interaction.getNum(), roadUserNumbers[0], roadUserNumbers[1], interaction.getFirstInstant(), interaction.getLastInstant()))
507 def loadInteractionsFromSqlite(filename): 521 def loadInteractionsFromSqlite(filename):
508 '''Loads interaction and their indicators 522 '''Loads interaction and their indicators
509 523
510 TODO choose the interactions to load''' 524 TODO choose the interactions to load'''
511 interactions = [] 525 interactions = []
512 with sqlite3.connect(filename) as connection: 526 if Path(filename).is_file():
513 cursor = connection.cursor() 527 with sqlite3.connect(filename) as connection:
514 try: 528 cursor = connection.cursor()
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, IND.frame_number') 529 try:
516 interactionNum = -1 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')
517 indicatorTypeNum = -1 531 interactionNum = -1
518 tmpIndicators = {} 532 indicatorTypeNum = -1
519 for row in cursor: 533 tmpIndicators = {}
520 if row[0] != interactionNum: 534 for row in cursor:
521 interactionNum = row[0] 535 if row[0] != interactionNum:
522 interactions.append(events.Interaction(interactionNum, moving.TimeInterval(row[3],row[4]), row[1], row[2])) 536 interactionNum = row[0]
523 interactions[-1].indicators = {} 537 interactions.append(events.Interaction(interactionNum, moving.TimeInterval(row[3],row[4]), row[1], row[2]))
524 if indicatorTypeNum != row[5] or row[0] != interactionNum: 538 interactions[-1].indicators = {}
525 indicatorTypeNum = row[5] 539 if indicatorTypeNum != row[5] or row[0] != interactionNum:
526 indicatorName = events.Interaction.indicatorNames[indicatorTypeNum] 540 indicatorTypeNum = row[5]
527 indicatorValues = {row[6]:row[7]} 541 indicatorName = events.Interaction.indicatorNames[indicatorTypeNum]
528 interactions[-1].indicators[indicatorName] = indicators.SeverityIndicator(indicatorName, indicatorValues, mostSevereIsMax = not indicatorName in events.Interaction.timeIndicators) 542 indicatorValues = {row[6]:row[7]}
529 else: 543 interactions[-1].indicators[indicatorName] = indicators.SeverityIndicator(indicatorName, indicatorValues, mostSevereIsMax = not indicatorName in events.Interaction.timeIndicators)
530 indicatorValues[row[6]] = row[7] 544 else:
531 interactions[-1].indicators[indicatorName].timeInterval.last = row[6] 545 indicatorValues[row[6]] = row[7]
532 except sqlite3.OperationalError as error: 546 interactions[-1].indicators[indicatorName].timeInterval.last = row[6]
533 printDBError(error) 547 except sqlite3.OperationalError as error:
534 return [] 548 printDBError(error)
549 return []
535 return interactions 550 return interactions
536 # load first and last object instants 551 # load first and last object instants
537 # CREATE TEMP TABLE IF NOT EXISTS object_instants AS SELECT OF.object_id, min(frame_number) as first_instant, max(frame_number) as last_instant from positions P, objects_features OF WHERE P.trajectory_id = OF.trajectory_id group by OF.object_id order by OF.object_id 552 # CREATE TEMP TABLE IF NOT EXISTS object_instants AS SELECT OF.object_id, min(frame_number) as first_instant, max(frame_number) as last_instant from positions P, objects_features OF WHERE P.trajectory_id = OF.trajectory_id group by OF.object_id order by OF.object_id
538 553
539 def createBoundingBoxTable(filename, invHomography = None): 554 def createBoundingBoxTable(filename, invHomography = None):
552 connection.commit() 567 connection.commit()
553 568
554 def loadBoundingBoxTableForDisplay(filename): 569 def loadBoundingBoxTableForDisplay(filename):
555 '''Loads bounding boxes from bounding_boxes table for display over trajectories''' 570 '''Loads bounding boxes from bounding_boxes table for display over trajectories'''
556 boundingBoxes = {} # list of bounding boxes for each instant 571 boundingBoxes = {} # list of bounding boxes for each instant
557 with sqlite3.connect(filename) as connection: 572 if Path(filename).is_file():
558 cursor = connection.cursor() 573 with sqlite3.connect(filename) as connection:
559 try: 574 cursor = connection.cursor()
560 cursor.execute('SELECT name FROM sqlite_master WHERE type=\'table\' AND name=\'bounding_boxes\'') 575 try:
561 result = cursor.fetchall() 576 cursor.execute('SELECT name FROM sqlite_master WHERE type=\'table\' AND name=\'bounding_boxes\'')
562 if len(result) > 0: 577 result = cursor.fetchall()
563 cursor.execute('SELECT * FROM bounding_boxes') 578 if len(result) > 0:
564 for row in cursor: 579 cursor.execute('SELECT * FROM bounding_boxes')
565 boundingBoxes.setdefault(row[1], []).append([moving.Point(row[2], row[3]), moving.Point(row[4], row[5])]) 580 for row in cursor:
566 except sqlite3.OperationalError as error: 581 boundingBoxes.setdefault(row[1], []).append([moving.Point(row[2], row[3]), moving.Point(row[4], row[5])])
567 printDBError(error) 582 except sqlite3.OperationalError as error:
568 return boundingBoxes 583 printDBError(error)
569 return boundingBoxes 584 return boundingBoxes
570 585
571 ######################### 586 #########################
572 # saving and loading for scene interpretation: POIs and Prototypes 587 # saving and loading for scene interpretation: POIs and Prototypes
573 ######################### 588 #########################
622 except sqlite3.OperationalError as error: 637 except sqlite3.OperationalError as error:
623 printDBError(error) 638 printDBError(error)
624 connection.commit() 639 connection.commit()
625 640
626 def loadPrototypeAssignmentsFromSqlite(filename, objectType): 641 def loadPrototypeAssignmentsFromSqlite(filename, objectType):
627 with sqlite3.connect(filename) as connection: 642 prototypeAssignments = {}
628 cursor = connection.cursor() 643 if Path(filename).is_file():
629 try: 644 with sqlite3.connect(filename) as connection:
630 tableName, objectIdColumnName = prototypeAssignmentNames(objectType) 645 cursor = connection.cursor()
631 cursor.execute('SELECT * FROM '+tableName) 646 try:
632 prototypeAssignments = {} 647 tableName, objectIdColumnName = prototypeAssignmentNames(objectType)
633 for row in cursor: 648 cursor.execute('SELECT * FROM '+tableName)
634 p = moving.Prototype(row[1], row[2], row[3]) 649 for row in cursor:
635 if p in prototypeAssignments: 650 p = moving.Prototype(row[1], row[2], row[3])
636 prototypeAssignments[p].append(row[0]) 651 if p in prototypeAssignments:
637 else: 652 prototypeAssignments[p].append(row[0])
638 prototypeAssignments[p] = [row[0]] 653 else:
639 return prototypeAssignments 654 prototypeAssignments[p] = [row[0]]
640 except sqlite3.OperationalError as error: 655 return prototypeAssignments
641 printDBError(error) 656 except sqlite3.OperationalError as error:
642 657 printDBError(error)
658 return prototypeAssignments
659
643 def loadPrototypesFromSqlite(filename, withTrajectories = True): 660 def loadPrototypesFromSqlite(filename, withTrajectories = True):
644 'Loads prototype ids and matchings (if stored)' 661 'Loads prototype ids and matchings (if stored)'
645 prototypes = [] 662 prototypes = []
646 with sqlite3.connect(filename) as connection: 663 if Path(filename).is_file():
647 cursor = connection.cursor() 664 with sqlite3.connect(filename) as connection:
648 objects = [] 665 cursor = connection.cursor()
649 try: 666 objects = []
650 cursor.execute('SELECT * FROM prototypes') 667 try:
651 for row in cursor: 668 cursor.execute('SELECT * FROM prototypes')
652 prototypes.append(moving.Prototype(row[0], row[1], row[2], row[3])) 669 for row in cursor:
653 if withTrajectories: 670 prototypes.append(moving.Prototype(row[0], row[1], row[2], row[3]))
654 for p in prototypes: 671 if withTrajectories:
655 p.setMovingObject(loadTrajectoriesFromSqlite(p.getFilename(), p.getTrajectoryType(), [p.getNum()])[0]) 672 for p in prototypes:
656 # loadingInformation = {} # complicated slightly optimized 673 p.setMovingObject(loadTrajectoriesFromSqlite(p.getFilename(), p.getTrajectoryType(), [p.getNum()])[0])
657 # for p in prototypes: 674 # loadingInformation = {} # complicated slightly optimized
658 # dbfn = p.getFilename() 675 # for p in prototypes:
659 # trajType = p.getTrajectoryType() 676 # dbfn = p.getFilename()
660 # if (dbfn, trajType) in loadingInformation: 677 # trajType = p.getTrajectoryType()
661 # loadingInformation[(dbfn, trajType)].append(p) 678 # if (dbfn, trajType) in loadingInformation:
662 # else: 679 # loadingInformation[(dbfn, trajType)].append(p)
663 # loadingInformation[(dbfn, trajType)] = [p] 680 # else:
664 # for k, v in loadingInformation.iteritems(): 681 # loadingInformation[(dbfn, trajType)] = [p]
665 # objects += loadTrajectoriesFromSqlite(k[0], k[1], [p.getNum() for p in v]) 682 # for k, v in loadingInformation.iteritems():
666 except sqlite3.OperationalError as error: 683 # objects += loadTrajectoriesFromSqlite(k[0], k[1], [p.getNum() for p in v])
667 printDBError(error) 684 except sqlite3.OperationalError as error:
668 if len(set([p.getTrajectoryType() for p in prototypes])) > 1: 685 printDBError(error)
669 print('Different types of prototypes in database ({}).'.format(set([p.getTrajectoryType() for p in prototypes]))) 686 if len(set([p.getTrajectoryType() for p in prototypes])) > 1:
687 print('Different types of prototypes in database ({}).'.format(set([p.getTrajectoryType() for p in prototypes])))
670 return prototypes 688 return prototypes
671 689
672 def savePOIsToSqlite(filename, gmm, gmmType, gmmId): 690 def savePOIsToSqlite(filename, gmm, gmmType, gmmId):
673 '''Saves a Gaussian mixture model (of class sklearn.mixture.GaussianMixture) 691 '''Saves a Gaussian mixture model (of class sklearn.mixture.GaussianMixture)
674 gmmType is a type of GaussianMixture, learnt either from beginnings or ends of trajectories''' 692 gmmType is a type of GaussianMixture, learnt either from beginnings or ends of trajectories'''
701 def loadPOIsFromSqlite(filename): 719 def loadPOIsFromSqlite(filename):
702 'Loads all 2D Gaussians in the database' 720 'Loads all 2D Gaussians in the database'
703 from sklearn import mixture # todo if not avalaible, load data in duck-typed class with same fields 721 from sklearn import mixture # todo if not avalaible, load data in duck-typed class with same fields
704 from ast import literal_eval 722 from ast import literal_eval
705 pois = [] 723 pois = []
706 with sqlite3.connect(filename) as connection: 724 if Path(filename).is_file():
707 cursor = connection.cursor() 725 with sqlite3.connect(filename) as connection:
708 try: 726 cursor = connection.cursor()
709 cursor.execute('SELECT * from gaussians2d') 727 try:
710 gmmId = None 728 cursor.execute('SELECT * from gaussians2d')
711 gmm = [] 729 gmmId = None
712 for row in cursor: 730 gmm = []
713 if gmmId is None or row[0] != gmmId: 731 for row in cursor:
714 if len(gmm) > 0: 732 if gmmId is None or row[0] != gmmId:
715 tmp = mixture.GaussianMixture(len(gmm), covarianceType) 733 if len(gmm) > 0:
716 tmp.means_ = array([gaussian['mean'] for gaussian in gmm]) 734 tmp = mixture.GaussianMixture(len(gmm), covarianceType)
717 tmp.covariances_ = array([gaussian['covar'] for gaussian in gmm]) 735 tmp.means_ = array([gaussian['mean'] for gaussian in gmm])
718 tmp.weights_ = array([gaussian['weight'] for gaussian in gmm]) 736 tmp.covariances_ = array([gaussian['covar'] for gaussian in gmm])
719 tmp.gmmTypes = [gaussian['type'] for gaussian in gmm] 737 tmp.weights_ = array([gaussian['weight'] for gaussian in gmm])
720 tmp.precisions_cholesky_ = array([gaussian['precisions'] for gaussian in gmm]) 738 tmp.gmmTypes = [gaussian['type'] for gaussian in gmm]
721 pois.append(tmp) 739 tmp.precisions_cholesky_ = array([gaussian['precisions'] for gaussian in gmm])
722 gaussian = {'type': row[2], 740 pois.append(tmp)
723 'mean': row[3:5], 741 gaussian = {'type': row[2],
724 'covar': array(literal_eval(row[5])), 742 'mean': row[3:5],
725 'weight': row[7], 743 'covar': array(literal_eval(row[5])),
726 'precisions': array(literal_eval(row[8]))} 744 'weight': row[7],
727 gmm = [gaussian] 745 'precisions': array(literal_eval(row[8]))}
728 covarianceType = row[6] 746 gmm = [gaussian]
729 gmmId = row[0] 747 covarianceType = row[6]
730 else: 748 gmmId = row[0]
731 gmm.append({'type': row[2], 749 else:
732 'mean': row[3:5], 750 gmm.append({'type': row[2],
733 'covar': array(literal_eval(row[5])), 751 'mean': row[3:5],
734 'weight': row[7], 752 'covar': array(literal_eval(row[5])),
735 'precisions': array(literal_eval(row[8]))}) 753 'weight': row[7],
736 if len(gmm) > 0: 754 'precisions': array(literal_eval(row[8]))})
737 tmp = mixture.GaussianMixture(len(gmm), covarianceType) 755 if len(gmm) > 0:
738 tmp.means_ = array([gaussian['mean'] for gaussian in gmm]) 756 tmp = mixture.GaussianMixture(len(gmm), covarianceType)
739 tmp.covariances_ = array([gaussian['covar'] for gaussian in gmm]) 757 tmp.means_ = array([gaussian['mean'] for gaussian in gmm])
740 tmp.weights_ = array([gaussian['weight'] for gaussian in gmm]) 758 tmp.covariances_ = array([gaussian['covar'] for gaussian in gmm])
741 tmp.gmmTypes = [gaussian['type'] for gaussian in gmm] 759 tmp.weights_ = array([gaussian['weight'] for gaussian in gmm])
742 tmp.precisions_cholesky_ = array([gaussian['precisions'] for gaussian in gmm]) 760 tmp.gmmTypes = [gaussian['type'] for gaussian in gmm]
743 pois.append(tmp) 761 tmp.precisions_cholesky_ = array([gaussian['precisions'] for gaussian in gmm])
744 except sqlite3.OperationalError as error: 762 pois.append(tmp)
745 printDBError(error) 763 except sqlite3.OperationalError as error:
764 printDBError(error)
746 return pois 765 return pois
747 766
748 ######################### 767 #########################
749 # saving and loading for scene interpretation (Mohamed Gomaa Mohamed's PhD) 768 # saving and loading for scene interpretation (Mohamed Gomaa Mohamed's PhD)
750 ######################### 769 #########################
1324 self.scaleCyclistSpeed = config.getfloat(self.sectionHeader, 'cyc-speed-scale') 1343 self.scaleCyclistSpeed = config.getfloat(self.sectionHeader, 'cyc-speed-scale')
1325 self.meanVehicleSpeed = config.getfloat(self.sectionHeader, 'mean-veh-speed') 1344 self.meanVehicleSpeed = config.getfloat(self.sectionHeader, 'mean-veh-speed')
1326 self.stdVehicleSpeed = config.getfloat(self.sectionHeader, 'std-veh-speed') 1345 self.stdVehicleSpeed = config.getfloat(self.sectionHeader, 'std-veh-speed')
1327 1346
1328 def __init__(self, filename = None): 1347 def __init__(self, filename = None):
1329 if filename is not None and Path(filename).exists(): 1348 self.configFilename = filename
1349 if filename is not None and Path(filename).is_file():
1330 self.loadConfigFile(filename) 1350 self.loadConfigFile(filename)
1331 else: 1351 else:
1332 print('Configuration filename {} could not be loaded.'.format(filename)) 1352 print('Configuration filename {} could not be loaded.'.format(filename))
1333 1353
1334 def convertToFrames(self, frameRate, speedRatio = 3.6): 1354 def convertToFrames(self, frameRate, speedRatio = 3.6):
1384 self.sectionHeader = config.sections()[0] 1404 self.sectionHeader = config.sections()[0]
1385 # Tracking/display parameters 1405 # Tracking/display parameters
1386 self.videoFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'video-filename')) 1406 self.videoFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'video-filename'))
1387 self.databaseFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'database-filename')) 1407 self.databaseFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'database-filename'))
1388 self.homographyFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'homography-filename')) 1408 self.homographyFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'homography-filename'))
1389 if Path(self.homographyFilename).exists(): 1409 if Path(self.homographyFilename).is_file():
1390 self.homography = loadtxt(self.homographyFilename) 1410 self.homography = loadtxt(self.homographyFilename)
1391 else: 1411 else:
1392 self.homography = None 1412 self.homography = None
1393 self.intrinsicCameraFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'intrinsic-camera-filename')) 1413 self.intrinsicCameraFilename = utils.getRelativeFilename(parentPath, config.get(self.sectionHeader, 'intrinsic-camera-filename'))
1394 if Path(self.intrinsicCameraFilename).exists(): 1414 if Path(self.intrinsicCameraFilename).is_file():
1395 self.intrinsicCameraMatrix = loadtxt(self.intrinsicCameraFilename) 1415 self.intrinsicCameraMatrix = loadtxt(self.intrinsicCameraFilename)
1396 else: 1416 else:
1397 self.intrinsicCameraMatrix = None 1417 self.intrinsicCameraMatrix = None
1398 distortionCoefficients = getValuesFromINIFile(filename, 'distortion-coefficients', '=') 1418 distortionCoefficients = getValuesFromINIFile(filename, 'distortion-coefficients', '=')
1399 self.distortionCoefficients = [float(x) for x in distortionCoefficients] 1419 self.distortionCoefficients = [float(x) for x in distortionCoefficients]
1442 self.minFeatureDisplacement = config.getfloat(self.sectionHeader, 'min-feature-displacement') 1462 self.minFeatureDisplacement = config.getfloat(self.sectionHeader, 'min-feature-displacement')
1443 self.updateTimer = config.getint(self.sectionHeader, 'tracker-reload-time') 1463 self.updateTimer = config.getint(self.sectionHeader, 'tracker-reload-time')
1444 1464
1445 1465
1446 def __init__(self, filename = None): 1466 def __init__(self, filename = None):
1447 if filename is not None and Path(filename).exists(): 1467 self.configFilename = filename
1468 if filename is not None and Path(filename).is_file():
1448 self.loadConfigFile(filename) 1469 self.loadConfigFile(filename)
1449 else: 1470 else:
1450 print('Configuration filename {} could not be loaded.'.format(filename)) 1471 print('Configuration filename {} could not be loaded.'.format(filename))
1451 self.configFilename = filename
1452 1472
1453 def processVideoArguments(args): 1473 def processVideoArguments(args):
1454 '''Loads information from configuration file 1474 '''Loads information from configuration file
1455 then checks what was passed on the command line 1475 then checks what was passed on the command line
1456 for override (eg video filename and database filename''' 1476 for override (eg video filename and database filename'''