annotate scripts/learn-motion-patterns.py @ 1035:933588568bec

major update to learn motion pattern, see program description
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 20 Jun 2018 16:48:20 -0400
parents 8ffb3ae9f3d2
children 5621e4ad2428
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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: 980
diff changeset
1 #! /usr/bin/env python3
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
3 import sys, argparse
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
4
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
5 import numpy as np
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
6 import matplotlib.pyplot as plt
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
7
1028
cc5cb04b04b0 major update using the trafficintelligence package name and install through pip
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 998
diff changeset
8 from trafficintelligence import ml, utils, storage, moving
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
9
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
10 parser = argparse.ArgumentParser(description='''The program clusters trajectories, each cluster being represented by a trajectory. It can either work on the same dataset (database) or different ones, but only does learning or assignment at a time to avoid issues (the minimum cluster size argument is not used for now as it may change prototypes when assigning other trajectories)''') #, epilog = ''
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
11 #parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the configuration file')
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
12 parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file', required = True)
921
630934595871 work in progress with prototype class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 920
diff changeset
13 parser.add_argument('-o', dest = 'outputPrototypeDatabaseFilename', help = 'name of the Sqlite database file to save prototypes')
630934595871 work in progress with prototype class
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 920
diff changeset
14 parser.add_argument('-i', dest = 'inputPrototypeDatabaseFilename', help = 'name of the Sqlite database file for prototypes to start the algorithm with')
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
15 parser.add_argument('-t', dest = 'trajectoryType', help = 'type of trajectories to learn from', choices = ['objectfeature', 'feature', 'object'], default = 'objectfeatures')
920
499154254f37 improved prototype loading
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 919
diff changeset
16 parser.add_argument('--max-nobjectfeatures', dest = 'maxNObjectFeatures', help = 'maximum number of features per object to load', type = int, default = 1)
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
17 parser.add_argument('-n', dest = 'nTrajectories', help = 'number of the object or feature trajectories to load', type = int, default = None)
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
18 parser.add_argument('-e', dest = 'epsilon', help = 'distance for the similarity of trajectory points', type = float, required = True)
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
19 parser.add_argument('--metric', dest = 'metric', help = 'metric for the similarity of trajectory points', default = 'cityblock') # default is manhattan distance
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
20 parser.add_argument('-s', dest = 'minSimilarity', help = 'minimum similarity to put a trajectory in a cluster', type = float, required = True)
953
989917b1ed85 assign and learn work
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 952
diff changeset
21 parser.add_argument('-c', dest = 'minClusterSize', help = 'minimum cluster size', type = int, default = 0)
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
22 parser.add_argument('--learn', dest = 'learn', help = 'learn', action = 'store_true')
908
b297525b2cbf added options to the prototype cluster algorithm, work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 907
diff changeset
23 parser.add_argument('--optimize', dest = 'optimizeCentroid', help = 'recompute centroid at each assignment', action = 'store_true')
843
5dc7a507353e updated to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 835
diff changeset
24 parser.add_argument('--random', dest = 'randomInitialization', help = 'random initialization of clustering algorithm', action = 'store_true')
907
9fd7b18f75b4 re arranged motion pattern learning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 878
diff changeset
25 parser.add_argument('--subsample', dest = 'positionSubsamplingRate', help = 'rate of position subsampling (1 every n positions)', type = int)
843
5dc7a507353e updated to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 835
diff changeset
26 parser.add_argument('--display', dest = 'display', help = 'display trajectories', action = 'store_true')
5dc7a507353e updated to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 835
diff changeset
27 parser.add_argument('--save-similarities', dest = 'saveSimilarities', help = 'save computed similarities (in addition to prototypes)', action = 'store_true')
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
28 parser.add_argument('--save-assignments', dest = 'saveAssignments', help = 'saves the assignments of the objects to the prototypes', action = 'store_true')
1033
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
29 parser.add_argument('--assign', dest = 'assign', help = 'assigns the objects to the prototypes and saves the assignments', action = 'store_true')
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
30
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
31 args = parser.parse_args()
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
32
907
9fd7b18f75b4 re arranged motion pattern learning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 878
diff changeset
33 # use cases
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
34 # 1. learn proto from one file, save in same or another
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
35 # 2. load proto, load objects (from same or other db), update proto matchings, save proto
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
36 # TODO 3. on same dataset, learn and assign trajectories (could be done with min cluster size)
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
37 # TODO? 4. when assigning, allow min cluster size only to avoid assigning to small clusters (but prototypes are not removed even if in small clusters, can be done after assignment with nmatchings)
907
9fd7b18f75b4 re arranged motion pattern learning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 878
diff changeset
38
948
584b9405e494 added safety analysis parameters for motion patterns
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 927
diff changeset
39 # TODO add possibility to cluster with velocities
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
40 # TODO add possibility to load all trajectories and use minclustersize
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
41
979
cc89267b5ff9 work on learning and assigning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 953
diff changeset
42 # load trajectories to cluster or assign
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
43 if args.trajectoryType == 'objectfeature':
979
cc89267b5ff9 work on learning and assigning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 953
diff changeset
44 trajectoryType = 'feature'
910
b58a1061a717 loading is faster for longest object features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 908
diff changeset
45 objectFeatureNumbers = storage.loadObjectFeatureFrameNumbers(args.databaseFilename, objectNumbers = args.nTrajectories)
b58a1061a717 loading is faster for longest object features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 908
diff changeset
46 featureNumbers = []
b58a1061a717 loading is faster for longest object features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 908
diff changeset
47 for numbers in objectFeatureNumbers.values():
b58a1061a717 loading is faster for longest object features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 908
diff changeset
48 featureNumbers += numbers[:min(len(numbers), args.maxNObjectFeatures)]
b58a1061a717 loading is faster for longest object features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 908
diff changeset
49 objects = storage.loadTrajectoriesFromSqlite(args.databaseFilename, 'feature', objectNumbers = featureNumbers, timeStep = args.positionSubsamplingRate)
b58a1061a717 loading is faster for longest object features
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 908
diff changeset
50 else:
979
cc89267b5ff9 work on learning and assigning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 953
diff changeset
51 trajectoryType = args.trajectoryType
cc89267b5ff9 work on learning and assigning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 953
diff changeset
52 objects = storage.loadTrajectoriesFromSqlite(args.databaseFilename, trajectoryType, objectNumbers = args.nTrajectories, timeStep = args.positionSubsamplingRate)
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
53
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
54 trajectories = [o.getPositions().asArray().T for o in objects]
979
cc89267b5ff9 work on learning and assigning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 953
diff changeset
55
cc89267b5ff9 work on learning and assigning
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 953
diff changeset
56 # load initial prototypes, if any
949
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
57 if args.inputPrototypeDatabaseFilename is not None:
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
58 initialPrototypes = storage.loadPrototypesFromSqlite(args.inputPrototypeDatabaseFilename, True)
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
59 trajectories = [p.getMovingObject().getPositions().asArray().T for p in initialPrototypes]+trajectories
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
60 if len(initialPrototypes) > 0:
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: 980
diff changeset
61 initialPrototypeIndices = list(range(len(initialPrototypes)))
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
62 else:
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
63 initialPrototypeIndices = None
949
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
64 else:
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
65 initialPrototypes = []
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
66 initialPrototypeIndices = None
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
67
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
68 lcss = utils.LCSS(metric = args.metric, epsilon = args.epsilon)
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
69 nTrajectories = len(trajectories)
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
70
735
0e875a7f5759 modified prototypeCluster algorithm to enforce similarity when re-assigning and to compute only the necessary similarities
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 734
diff changeset
71 similarities = -np.ones((nTrajectories, nTrajectories))
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
72 similarityFunc = lambda x,y : lcss.computeNormalized(x, y)
949
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
73 # the next line can be called again without reinitializing similarities
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
74 if args.learn:
953
989917b1ed85 assign and learn work
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 952
diff changeset
75 prototypeIndices = ml.prototypeCluster(trajectories, similarities, args.minSimilarity, similarityFunc, args.optimizeCentroid, args.randomInitialization, initialPrototypeIndices)
989917b1ed85 assign and learn work
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 952
diff changeset
76 else:
989917b1ed85 assign and learn work
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 952
diff changeset
77 prototypeIndices = initialPrototypeIndices
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
78
1033
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
79 if args.assign: # TODO don't touch initial prototypes if not from same db as trajectories
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
80 #if not args.learn and args.minClusterSize >= 1: # allow only
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
81 # print('Warning: you did not learn the prototypes and you are using minimum cluster size of {}, which may lead to removing prototypes and assigning them to others'.format(args.minClusterSize))
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
82 # if args.minClusterSize >= 1:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
83 # if initialPrototypeIndices is None:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
84 # prototypeIndices, labels = ml.assignToPrototypeClusters(trajectories, prototypeIndices, similarities, args.minSimilarity, similarityFunc, args.minClusterSize)
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
85 # else:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
86 # print('Not assigning with non-zero minimum cluster size and initial prototypes (would remove initial prototypes based on other trajectories')
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
87 # else:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
88 # prototypeIndices, labels = ml.assignToPrototypeClusters(trajectories, prototypeIndices, similarities, args.minSimilarity, similarityFunc)
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
89 assignedPrototypeIndices, labels = ml.assignToPrototypeClusters(trajectories, prototypeIndices, similarities, args.minSimilarity, similarityFunc)
734
1d4dcb5c8708 first example script to learn prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
90
1033
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
91 if args.learn and not args.assign:
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
92 prototypes = []
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
93 for i in prototypeIndices:
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
94 if i<len(initialPrototypes):
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
95 prototypes.append(initialPrototypes[i])
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
96 else:
1033
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
97 prototypes.append(moving.Prototype(args.databaseFilename, objects[i-len(initialPrototypes)].getNum(), trajectoryType))
844
5a68779d7777 added capability to save prototypes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 843
diff changeset
98
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
99 if args.outputPrototypeDatabaseFilename is None:
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
100 outputPrototypeDatabaseFilename = args.databaseFilename
949
d6c1c05d11f5 modified multithreading at the interaction level for safety computations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 948
diff changeset
101 else:
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
102 outputPrototypeDatabaseFilename = args.outputPrototypeDatabaseFilename
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
103 if args.inputPrototypeDatabaseFilename == args.outputPrototypeDatabaseFilename:
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
104 storage.deleteFromSqlite(args.outputPrototypeDatabaseFilename, 'prototype')
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
105 storage.savePrototypesToSqlite(outputPrototypeDatabaseFilename, prototypes)
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
106 if args.display:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
107 plt.figure()
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
108 for p in prototypes:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
109 p.getMovingObject().plot()
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
110 plt.axis('equal')
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
111 plt.show()
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
112
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
113 if not args.learn and args.assign: # no modification to prototypes, can work with initialPrototypes
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
114 clusterSizes = ml.computeClusterSizes(labels, prototypeIndices, -1)
1033
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
115 for i in prototypeIndices:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
116 nMatchings = clusterSizes[i]-1
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
117 if initialPrototypes[i].nMatchings is None:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
118 initialPrototypes[i].nMatchings = nMatchings
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
119 else:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
120 initialPrototypes[i].nMatchings += nMatchings
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
121 if args.outputPrototypeDatabaseFilename is None:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
122 outputPrototypeDatabaseFilename = args.databaseFilename
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
123 else:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
124 outputPrototypeDatabaseFilename = args.outputPrototypeDatabaseFilename
1035
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
125 storage.setPrototypeMatchingsInSqlite(outputPrototypeDatabaseFilename, initialPrototypes)
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
126 if args.saveAssignments:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
127 if args.trajectoryType == 'objectfeature': # consider that the object is assigned through its longest features
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
128 objectNumbers = []
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
129 objectLabels = []
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
130 for objNum, objFeatureNumbers in objectFeatureNumbers.items():
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
131 objLabels = []
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
132 for i, o in enumerate(objects):
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
133 if o.getNum() in objFeatureNumbers:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
134 objLabels.append(labels[i+len(initialPrototypes)])
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
135 objectLabels.append(utils.mostCommon(objLabels))
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
136 objectNumbers.append(objNum)
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
137 storage.savePrototypeAssignmentsToSqlite(args.databaseFilename, objectNumbers, 'object', objectLabels, initialPrototypes)
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
138 else:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
139 storage.savePrototypeAssignmentsToSqlite(args.databaseFilename, [obj.getNum() for obj in objects], trajectoryType, labels[len(initialPrototypes):], initialPrototypes)
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
140 if args.display:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
141 plt.figure()
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
142 for i,o in enumerate(objects):
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
143 if labels[i+len(initialPrototypes)] < 0:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
144 o.plot('kx-')
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
145 else:
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
146 o.plot(utils.colors[labels[i+len(initialPrototypes)]])
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
147 for i,p in enumerate(initialPrototypes):
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
148 p.getMovingObject().plot(utils.colors[i]+'o')
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
149 plt.axis('equal')
933588568bec major update to learn motion pattern, see program description
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1033
diff changeset
150 plt.show()
952
a9b2beef0db4 loading and assigning motion patterns works
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 951
diff changeset
151
1033
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
152 if (args.learn or args.assign) and args.saveSimilarities:
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
153 np.savetxt(utils.removeExtension(args.databaseFilename)+'-prototype-similarities.txt.gz', similarities, '%.4f')
8ffb3ae9f3d2 work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1032
diff changeset
154