Mercurial Hosting > traffic-intelligence
comparison python/storage.py @ 834:119c4efe6398
added option to load subsampled trajectories
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 30 Jun 2016 14:19:59 -0400 |
parents | a8ff35e6fb43 |
children | 5a68779d7777 |
comparison
equal
deleted
inserted
replaced
833:8d1dd771aeb3 | 834:119c4efe6398 |
---|---|
5 import utils, moving, events, indicators, shutil | 5 import utils, moving, events, indicators, shutil |
6 from base import VideoFilenameAddable | 6 from base import VideoFilenameAddable |
7 | 7 |
8 from os import path | 8 from os import path |
9 import sqlite3, logging | 9 import sqlite3, logging |
10 from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt | 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 |
11 from pandas import read_csv, merge | 11 from pandas import read_csv, merge |
12 | 12 |
13 | 13 |
14 commentChar = '#' | 14 commentChar = '#' |
15 | 15 |
143 else: | 143 else: |
144 print('objectNumbers {} are not a known type ({})'.format(objectNumbers, type(objectNumbers))) | 144 print('objectNumbers {} are not a known type ({})'.format(objectNumbers, type(objectNumbers))) |
145 query = '' | 145 query = '' |
146 return query | 146 return query |
147 | 147 |
148 def loadTrajectoriesFromTable(connection, tableName, trajectoryType, objectNumbers = None): | 148 def loadTrajectoriesFromTable(connection, tableName, trajectoryType, objectNumbers = None, timeStep = None): |
149 '''Loads trajectories (in the general sense) from the given table | 149 '''Loads trajectories (in the general sense) from the given table |
150 can be positions or velocities | 150 can be positions or velocities |
151 | 151 |
152 returns a moving object''' | 152 returns a moving object''' |
153 cursor = connection.cursor() | 153 cursor = connection.cursor() |
155 try: | 155 try: |
156 objectCriteria = getObjectCriteria(objectNumbers) | 156 objectCriteria = getObjectCriteria(objectNumbers) |
157 queryStatement = None | 157 queryStatement = None |
158 if trajectoryType == 'feature': | 158 if trajectoryType == 'feature': |
159 queryStatement = 'SELECT * from '+tableName | 159 queryStatement = 'SELECT * from '+tableName |
160 if objectNumbers is not None: | 160 if objectNumbers is not None and timeStep is not None: |
161 queryStatement += ' WHERE trajectory_id '+objectCriteria+' AND frame_number%{} = 0'.format(timeStep) | |
162 elif objectNumbers is not None: | |
161 queryStatement += ' WHERE trajectory_id '+objectCriteria | 163 queryStatement += ' WHERE trajectory_id '+objectCriteria |
164 elif timeStep is not None: | |
165 queryStatement += ' WHERE frame_number%{} = 0'.format(timeStep) | |
162 queryStatement += ' ORDER BY trajectory_id, frame_number' | 166 queryStatement += ' ORDER BY trajectory_id, frame_number' |
163 elif trajectoryType == 'object': | 167 elif trajectoryType == 'object': |
164 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' | 168 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' |
165 if objectNumbers is not None: | 169 if objectNumbers is not None: |
166 queryStatement += ' and OF.object_id '+objectCriteria | 170 queryStatement += ' AND OF.object_id '+objectCriteria |
171 if timeStep is not None: | |
172 queryStatement += ' AND P.frame_number%{} = 0'.format(timeStep) | |
167 queryStatement += ' GROUP BY OF.object_id, P.frame_number ORDER BY OF.object_id, P.frame_number' | 173 queryStatement += ' GROUP BY OF.object_id, P.frame_number ORDER BY OF.object_id, P.frame_number' |
168 elif trajectoryType in ['bbtop', 'bbbottom']: | 174 elif trajectoryType in ['bbtop', 'bbbottom']: |
169 if trajectoryType == 'bbtop': | 175 if trajectoryType == 'bbtop': |
170 corner = 'top_left' | 176 corner = 'top_left' |
171 elif trajectoryType == 'bbbottom': | 177 elif trajectoryType == 'bbbottom': |
172 corner = 'bottom_right' | 178 corner = 'bottom_right' |
173 queryStatement = 'SELECT object_id, frame_number, x_'+corner+', y_'+corner+' FROM '+tableName | 179 queryStatement = 'SELECT object_id, frame_number, x_'+corner+', y_'+corner+' FROM '+tableName |
174 if objectNumbers is not None: | 180 if objectNumbers is not None and timeStep is not None: |
181 queryStatement += ' WHERE object_id '+objectCriteria+' AND frame_number%{} = 0'.format(timeStep) | |
182 elif objectNumbers is not None: | |
175 queryStatement += ' WHERE object_id '+objectCriteria | 183 queryStatement += ' WHERE object_id '+objectCriteria |
184 elif timeStep is not None: | |
185 queryStatement += ' WHERE frame_number%{} = 0'.format(timeStep) | |
176 queryStatement += ' ORDER BY object_id, frame_number' | 186 queryStatement += ' ORDER BY object_id, frame_number' |
177 else: | 187 else: |
178 print('Unknown trajectory type {}'.format(trajectoryType)) | 188 print('Unknown trajectory type {}'.format(trajectoryType)) |
179 if queryStatement is not None: | 189 if queryStatement is not None: |
180 cursor.execute(queryStatement) | 190 cursor.execute(queryStatement) |
187 obj = None | 197 obj = None |
188 objects = [] | 198 objects = [] |
189 for row in cursor: | 199 for row in cursor: |
190 if row[0] != objId: | 200 if row[0] != objId: |
191 objId = row[0] | 201 objId = row[0] |
192 if obj is not None and obj.length() == obj.positions.length(): | 202 if obj is not None and (obj.length() == obj.positions.length() or (timeStep is not None and npceil(obj.length()/timeStep) == obj.positions.length())): |
193 objects.append(obj) | 203 objects.append(obj) |
194 elif obj is not None: | 204 elif obj is not None: |
195 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) | 205 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) |
196 obj = moving.MovingObject(row[0], timeInterval = moving.TimeInterval(row[1], row[1]), positions = moving.Trajectory([[row[2]],[row[3]]])) | 206 obj = moving.MovingObject(row[0], timeInterval = moving.TimeInterval(row[1], row[1]), positions = moving.Trajectory([[row[2]],[row[3]]])) |
197 else: | 207 else: |
198 obj.timeInterval.last = row[1] | 208 obj.timeInterval.last = row[1] |
199 obj.positions.addPositionXY(row[2],row[3]) | 209 obj.positions.addPositionXY(row[2],row[3]) |
200 | 210 |
201 if obj is not None and obj.length() == obj.positions.length(): | 211 if obj is not None and (obj.length() == obj.positions.length() or (timeStep is not None and npceil(obj.length()/timeStep) == obj.positions.length())): |
202 objects.append(obj) | 212 objects.append(obj) |
203 elif obj is not None: | 213 elif obj is not None: |
204 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) | 214 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) |
205 | 215 |
206 return objects | 216 return objects |
214 userTypes = {} | 224 userTypes = {} |
215 for row in cursor: | 225 for row in cursor: |
216 userTypes[row[0]] = row[1] | 226 userTypes[row[0]] = row[1] |
217 return userTypes | 227 return userTypes |
218 | 228 |
219 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False): | 229 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None): |
220 '''Loads the trajectories (in the general sense, | 230 '''Loads the trajectories (in the general sense, |
221 either features, objects (feature groups) or bounding box series) | 231 either features, objects (feature groups) or bounding box series) |
222 The number loaded is either the first objectNumbers objects, | 232 The number loaded is either the first objectNumbers objects, |
223 or the indices in objectNumbers from the database''' | 233 or the indices in objectNumbers from the database''' |
224 connection = sqlite3.connect(filename) | 234 connection = sqlite3.connect(filename) |
225 | 235 |
226 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers) | 236 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) |
227 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers) | 237 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) |
228 | 238 |
229 if len(objectVelocities) > 0: | 239 if len(objectVelocities) > 0: |
230 for o,v in zip(objects, objectVelocities): | 240 for o,v in zip(objects, objectVelocities): |
231 if o.getNum() == v.getNum(): | 241 if o.getNum() == v.getNum(): |
232 o.velocities = v.positions | 242 o.velocities = v.positions |
264 | 274 |
265 if withFeatures: | 275 if withFeatures: |
266 nFeatures = 0 | 276 nFeatures = 0 |
267 for obj in objects: | 277 for obj in objects: |
268 nFeatures = max(nFeatures, max(obj.featureNumbers)) | 278 nFeatures = max(nFeatures, max(obj.featureNumbers)) |
269 features = loadTrajectoriesFromSqlite(filename, 'feature', nFeatures+1) | 279 features = loadTrajectoriesFromSqlite(filename, 'feature', nFeatures+1, timeStep = timeStep) |
270 for obj in objects: | 280 for obj in objects: |
271 obj.setFeatures(features) | 281 obj.setFeatures(features) |
272 | 282 |
273 except sqlite3.OperationalError as error: | 283 except sqlite3.OperationalError as error: |
274 printDBError(error) | 284 printDBError(error) |
368 connection.close() | 378 connection.close() |
369 | 379 |
370 def loadPrototypesFromSqlite(filename): | 380 def loadPrototypesFromSqlite(filename): |
371 pass | 381 pass |
372 | 382 |
373 def loadBBMovingObjectsFromSqlite(filename, objectType = 'bb', objectNumbers = None): | 383 def loadBBMovingObjectsFromSqlite(filename, objectType = 'bb', objectNumbers = None, timeStep = None): |
374 '''Loads bounding box moving object from an SQLite | 384 '''Loads bounding box moving object from an SQLite |
375 (format of SQLite output by the ground truth annotation tool | 385 (format of SQLite output by the ground truth annotation tool |
376 or Urban Tracker | 386 or Urban Tracker |
377 | 387 |
378 Load descriptions?''' | 388 Load descriptions?''' |
379 connection = sqlite3.connect(filename) | 389 connection = sqlite3.connect(filename) |
380 objects = [] | 390 objects = [] |
381 | 391 |
382 if objectType == 'bb': | 392 if objectType == 'bb': |
383 topCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbtop', objectNumbers) | 393 topCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbtop', objectNumbers, timeStep) |
384 bottomCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbbottom', objectNumbers) | 394 bottomCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbbottom', objectNumbers, timeStep) |
385 userTypes = loadUserTypesFromTable(connection.cursor(), 'object', objectNumbers) # string format is same as object | 395 userTypes = loadUserTypesFromTable(connection.cursor(), 'object', objectNumbers) # string format is same as object |
386 | 396 |
387 for t, b in zip(topCorners, bottomCorners): | 397 for t, b in zip(topCorners, bottomCorners): |
388 num = t.getNum() | 398 num = t.getNum() |
389 if t.getNum() == b.getNum(): | 399 if t.getNum() == b.getNum(): |