Mercurial Hosting > traffic-intelligence
annotate trafficintelligence/processing.py @ 1067:092bd9c7deaf
corrected bug with multiprocessing and centiles
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 16 Jul 2018 01:24:26 -0400 |
parents | 862b55a87e63 |
children | c67f8c36ebc7 |
rev | line source |
---|---|
246
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
1 #! /usr/bin/env python |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
2 '''Algorithms to process trajectories and moving objects''' |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
3 |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
4 import numpy as np |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
5 |
1066
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
6 from trafficintelligence import ml, storage, utils |
246
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
7 |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
8 def extractSpeeds(objects, zone): |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
9 speeds = {} |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
10 objectsNotInZone = [] |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
11 import matplotlib.nxutils as nx |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
12 for o in objects: |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
13 inPolygon = nx.points_inside_poly(o.getPositions().asArray().T, zone.T) |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
14 if inPolygon.any(): |
998
933670761a57
updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
665
diff
changeset
|
15 objspeeds = [o.getVelocityAt(i).norm2() for i in range(int(o.length()-1)) if inPolygon[i]] |
246
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
16 speeds[o.num] = np.mean(objspeeds) # km/h |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
17 else: |
583a2c4622f9
created new module for algorithms with function to extract speeds
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
18 objectsNotInZone.append(o) |
998
933670761a57
updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
665
diff
changeset
|
19 return speeds, objectsNotInZone |
1044
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
20 |
1067
092bd9c7deaf
corrected bug with multiprocessing and centiles
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1066
diff
changeset
|
21 def extractVideoSequenceSpeeds(dbFilename, siteName, nObjects, startTime, frameRate, minUserDurationSeconds, aggMethods, aggCentiles): |
1066
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
22 data = [] |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
23 d = startTime.date() |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
24 t1 = startTime.time() |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
25 minUserDuration = minUserDurationSeconds*frameRate |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
26 print('Extracting speed from '+dbFilename) |
1067
092bd9c7deaf
corrected bug with multiprocessing and centiles
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1066
diff
changeset
|
27 aggFunctions, tmpheaders = utils.aggregationMethods(aggMethods, aggCentiles) |
1066
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
28 objects = storage.loadTrajectoriesFromSqlite(dbFilename, 'object', nObjects) |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
29 for o in objects: |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
30 if o.length() > minUserDuration: |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
31 row = [siteName, d, utils.framesToTime(o.getFirstInstant(), frameRate, t1), o.getUserType()] |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
32 tmp = o.getSpeeds() |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
33 for method,func in aggFunctions.items(): |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
34 aggSpeeds = frameRate*3.6*func(tmp) |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
35 if method == 'centile': |
1067
092bd9c7deaf
corrected bug with multiprocessing and centiles
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1066
diff
changeset
|
36 row.extend(aggSpeeds.tolist()) |
1066
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
37 else: |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
38 row.append(aggSpeeds) |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
39 data.append(row) |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
40 return data |
862b55a87e63
work on extracting information
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1045
diff
changeset
|
41 |
1044
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
42 def learnAssignMotionPatterns(learn, assign, objects, similarities, minSimilarity, similarityFunc, minClusterSize = 0, optimizeCentroid = False, randomInitialization = False, removePrototypesAfterAssignment = False, initialPrototypes = []): |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
43 '''Learns motion patterns |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
44 |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
45 During assignments, if using minClusterSize > 0, prototypes can change (be removed) |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
46 The argument removePrototypesAfterAssignment indicates whether the prototypes are removed or not''' |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
47 if len(initialPrototypes) > 0: |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
48 initialPrototypeIndices = list(range(len(initialPrototypes))) |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
49 trajectories = [p.getMovingObject().getPositions().asArray().T for p in initialPrototypes] |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
50 else: |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
51 initialPrototypeIndices = None |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
52 trajectories = [] |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
53 trajectories.extend([o.getPositions().asArray().T for o in objects]) |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
54 |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
55 if learn: |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
56 prototypeIndices = ml.prototypeCluster(trajectories, similarities, minSimilarity, similarityFunc, optimizeCentroid, randomInitialization, initialPrototypeIndices) |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
57 else: |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
58 prototypeIndices = initialPrototypeIndices |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
59 |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
60 if assign: |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
61 assignedPrototypeIndices, labels = ml.assignToPrototypeClusters(trajectories, prototypeIndices, similarities, minSimilarity, similarityFunc, minClusterSize) |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
62 if minClusterSize > 0 and removePrototypesAfterAssignment: # use prototypeIndices anyway |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
63 prototypeIndices = assignedPrototypeIndices |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
64 else: |
1045
25db2383e7ae
work in progress on process.py
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1044
diff
changeset
|
65 labels = None |
1044
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
66 |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
67 return prototypeIndices, labels |
75a6ad604cc5
work on motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
68 |