Mercurial > hg > nsaunier > traffic-intelligence
comparison trafficintelligence/storage.py @ 1054:d13f9bfbf3ff
Retry
| author | Wendlasida |
|---|---|
| date | Fri, 06 Jul 2018 18:42:58 -0400 |
| parents | 60cc87e824c4 c9c03c97ed9f |
| children | 9e4e80fc5943 67144f26609e |
comparison
equal
deleted
inserted
replaced
| 1053:60cc87e824c4 | 1054:d13f9bfbf3ff |
|---|---|
| 5 from pathlib import Path | 5 from pathlib import Path |
| 6 import shutil | 6 import shutil |
| 7 from copy import copy | 7 from copy import copy |
| 8 import sqlite3, logging | 8 import sqlite3, logging |
| 9 | 9 |
| 10 from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg | 10 from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg, int32, int64 |
| 11 from pandas import read_csv, merge | 11 from pandas import read_csv, merge |
| 12 | 12 |
| 13 from trafficintelligence import utils, moving, events, indicators | 13 from trafficintelligence import utils, moving, events, indicators |
| 14 from trafficintelligence.base import VideoFilenameAddable | 14 from trafficintelligence.base import VideoFilenameAddable |
| 15 | 15 |
| 19 'truck':3} | 19 'truck':3} |
| 20 | 20 |
| 21 tableNames = {'feature':'positions', | 21 tableNames = {'feature':'positions', |
| 22 'object': 'objects', | 22 'object': 'objects', |
| 23 'objectfeatures': 'positions'} | 23 'objectfeatures': 'positions'} |
| 24 | |
| 25 sqlite3.register_adapter(int64, lambda val: int(val)) | |
| 26 sqlite3.register_adapter(int32, lambda val: int(val)) | |
| 24 | 27 |
| 25 ######################### | 28 ######################### |
| 26 # Sqlite | 29 # Sqlite |
| 27 ######################### | 30 ######################### |
| 28 | 31 |
| 245 else: | 248 else: |
| 246 for row in cursor: | 249 for row in cursor: |
| 247 attributes[row[0]] = row[1] | 250 attributes[row[0]] = row[1] |
| 248 return attributes | 251 return attributes |
| 249 | 252 |
| 250 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None, maxNObjectFeatures = 1): | 253 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None, nLongestFeaturesPerObject = None): |
| 251 '''Loads the trajectories (in the general sense, | 254 '''Loads the trajectories (in the general sense, |
| 252 either features, objects (feature groups), longest features per object, or bounding box series) | 255 either features, objects (feature groups), longest features per object, or bounding box series) |
| 256 types are only feature or object | |
| 257 if object, features can be loaded with withFeatures or nLongestObjectFeatures used to select the n longest features | |
| 253 | 258 |
| 254 The number loaded is either the first objectNumbers objects, | 259 The number loaded is either the first objectNumbers objects, |
| 255 or the indices in objectNumbers from the database''' | 260 or the indices in objectNumbers from the database''' |
| 256 objects = [] | 261 objects = [] |
| 257 with sqlite3.connect(filename) as connection: | 262 with sqlite3.connect(filename) as connection: |
| 258 if trajectoryType == 'objectfeature': | 263 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) |
| 259 objectFeatureNumbers = loadObjectFeatureFrameNumbers(filename, objectNumbers) | 264 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) |
| 260 featureNumbers = [] | |
| 261 for numbers in objectFeatureNumbers.values(): | |
| 262 featureNumbers += numbers[:min(len(numbers), maxNObjectFeatures)] | |
| 263 objects = loadTrajectoriesFromTable(connection, 'positions', 'feature', featureNumbers, timeStep) | |
| 264 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', 'feature', featureNumbers, timeStep) | |
| 265 else: | |
| 266 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) | |
| 267 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) | |
| 268 | 265 |
| 269 if len(objectVelocities) > 0: | 266 if len(objectVelocities) > 0: |
| 270 for o,v in zip(objects, objectVelocities): | 267 for o,v in zip(objects, objectVelocities): |
| 271 if o.getNum() == v.getNum(): | 268 if o.getNum() == v.getNum(): |
| 272 o.velocities = v.positions | 269 o.velocities = v.positions |
| 281 queryStatement = 'SELECT trajectory_id, object_id FROM objects_features' | 278 queryStatement = 'SELECT trajectory_id, object_id FROM objects_features' |
| 282 if objectNumbers is not None: | 279 if objectNumbers is not None: |
| 283 queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers) | 280 queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers) |
| 284 queryStatement += ' ORDER BY object_id' # order is important to group all features per object | 281 queryStatement += ' ORDER BY object_id' # order is important to group all features per object |
| 285 logging.debug(queryStatement) | 282 logging.debug(queryStatement) |
| 286 cursor.execute(queryStatement) | 283 cursor.execute(queryStatement) |
| 287 | 284 |
| 288 featureNumbers = {} | 285 featureNumbers = {} |
| 289 for row in cursor: | 286 for row in cursor: |
| 290 objId = row[1] | 287 objId = row[1] |
| 291 if objId not in featureNumbers: | 288 if objId not in featureNumbers: |
| 301 for obj in objects: | 298 for obj in objects: |
| 302 userType, nObjects = attributes[obj.getNum()] | 299 userType, nObjects = attributes[obj.getNum()] |
| 303 obj.setUserType(userType) | 300 obj.setUserType(userType) |
| 304 obj.setNObjects(nObjects) | 301 obj.setNObjects(nObjects) |
| 305 | 302 |
| 303 # add features | |
| 306 if withFeatures: | 304 if withFeatures: |
| 307 nFeatures = 0 | |
| 308 for obj in objects: | 305 for obj in objects: |
| 309 nFeatures = max(nFeatures, max(obj.featureNumbers)) | 306 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', obj.featureNumbers, timeStep = timeStep) |
| 310 features = loadTrajectoriesFromSqlite(filename, 'feature', nFeatures+1, timeStep = timeStep) | 307 elif nLongestFeaturesPerObject is not None: |
| 311 for obj in objects: | 308 for obj in objects: |
| 312 obj.setFeatures(features) | 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' |
| 310 logging.debug(queryStatement) | |
| 311 cursor.execute(queryStatement) | |
| 312 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', [row[0] for i,row in enumerate(cursor) if i<nLongestFeaturesPerObject], timeStep = timeStep) | |
| 313 | 313 |
| 314 except sqlite3.OperationalError as error: | 314 except sqlite3.OperationalError as error: |
| 315 printDBError(error) | 315 printDBError(error) |
| 316 return objects | 316 return objects |
| 317 | 317 |
| 335 objectFeatureNumbers[objId] = [row[1]] | 335 objectFeatureNumbers[objId] = [row[1]] |
| 336 return objectFeatureNumbers | 336 return objectFeatureNumbers |
| 337 except sqlite3.OperationalError as error: | 337 except sqlite3.OperationalError as error: |
| 338 printDBError(error) | 338 printDBError(error) |
| 339 return None | 339 return None |
| 340 | |
| 341 def loadObjectTrajectoriesFromSqlite(): | |
| 342 '''Loads object trajectories | |
| 343 either simply objects or features (defaults to loadTrajectoriesFromSqlite) | |
| 344 or the longest features for each object ''' | |
| 345 | |
| 346 | 340 |
| 347 def addCurvilinearTrajectoriesFromSqlite(filename, objects): | 341 def addCurvilinearTrajectoriesFromSqlite(filename, objects): |
| 348 '''Adds curvilinear positions (s_coordinate, y_coordinate, lane) | 342 '''Adds curvilinear positions (s_coordinate, y_coordinate, lane) |
| 349 from a database to an existing MovingObject dict (indexed by each objects's num)''' | 343 from a database to an existing MovingObject dict (indexed by each objects's num)''' |
| 350 with sqlite3.connect(filename) as connection: | 344 with sqlite3.connect(filename) as connection: |
