Mercurial Hosting > traffic-intelligence
comparison scripts/dltrack.py @ 1247:439207b6c146
bug corrected
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 12 Feb 2024 16:47:33 -0500 |
parents | 2397de73770d |
children | 2aa56b101041 |
comparison
equal
deleted
inserted
replaced
1246:2397de73770d | 1247:439207b6c146 |
---|---|
56 elif args.configFilename is not None: | 56 elif args.configFilename is not None: |
57 lastFrameNum = params.lastFrameNum | 57 lastFrameNum = params.lastFrameNum |
58 else: | 58 else: |
59 lastFrameNum = inf | 59 lastFrameNum = inf |
60 | 60 |
61 # TODO use mask | 61 # TODO use mask, remove short objects, smooth |
62 | |
62 # TODO add option to refine position with mask for vehicles, to save different positions | 63 # TODO add option to refine position with mask for vehicles, to save different positions |
63 # TODO work with optical flow (farneback or RAFT) https://pytorch.org/vision/main/models/raft.html | 64 # TODO work with optical flow (farneback or RAFT) https://pytorch.org/vision/main/models/raft.html |
64 | 65 |
65 # use 2 x bytetrack track buffer to remove objects from existing ones | 66 # use 2 x bytetrack track buffer to remove objects from existing ones |
66 | 67 |
151 twCost.append(nmatches/tw.nBBoxes) | 152 twCost.append(nmatches/tw.nBBoxes) |
152 costs.append(twCost) | 153 costs.append(twCost) |
153 | 154 |
154 costs = -np.array(costs) | 155 costs = -np.array(costs) |
155 | 156 |
157 if costs.size > 0: | |
156 # before matching, scan for pedestrians with good non-overlapping temporal match with different bikes | 158 # before matching, scan for pedestrians with good non-overlapping temporal match with different bikes |
157 for pedInd in range(costs.shape[1]): | 159 for pedInd in range(costs.shape[1]): |
158 nMatchedBikes = (costs[:,pedInd] < -args.cyclistMatchingProportion).sum() | 160 nMatchedBikes = (costs[:,pedInd] < -args.cyclistMatchingProportion).sum() |
159 if nMatchedBikes == 0: # peds that have no bike matching: see if they have been classified as bikes sometimes | 161 if nMatchedBikes == 0: # peds that have no bike matching: see if they have been classified as bikes sometimes |
160 userTypeStats = Counter(obj.userTypes) | 162 userTypeStats = Counter(obj.userTypes) |
161 if (moving.userType2Num['cyclist'] in userTypeStats or (moving.userType2Num['motorcyclist'] in userTypeStats and moving.userType2Num['cyclist'] in userTypeStats and userTypeStats[moving.userType2Num['motorcyclist']]<=userTypeStats[moving.userType2Num['cyclist']])) and userTypeStats[moving.userType2Num['motorcyclist']]+userTypeStats[moving.userType2Num['cyclist']] > args.bikeProportion*userTypeStats.total(): # verif if not turning all motorbike into cyclists | 163 if (moving.userType2Num['cyclist'] in userTypeStats or (moving.userType2Num['motorcyclist'] in userTypeStats and moving.userType2Num['cyclist'] in userTypeStats and userTypeStats[moving.userType2Num['motorcyclist']]<=userTypeStats[moving.userType2Num['cyclist']])) and userTypeStats[moving.userType2Num['motorcyclist']]+userTypeStats[moving.userType2Num['cyclist']] > args.bikeProportion*userTypeStats.total(): # verif if not turning all motorbike into cyclists |
162 obj.setUserType(moving.userType2Num['cyclist']) | 164 obj.setUserType(moving.userType2Num['cyclist']) |
163 elif nMatchedBikes > 1: # try to merge bikes first | 165 elif nMatchedBikes > 1: # try to merge bikes first |
164 twIndices = np.nonzero(costs[:,pedInd] < -args.cyclistMatchingProportion)[0] | 166 twIndices = np.nonzero(costs[:,pedInd] < -args.cyclistMatchingProportion)[0] |
165 # we have to compute temporal overlaps of all 2 wheels among themselves, then remove the ones with the most overlap (sum over column) one by one until there is little left | 167 # we have to compute temporal overlaps of all 2 wheels among themselves, then remove the ones with the most overlap (sum over column) one by one until there is little left |
166 nTwoWheels = len(twIndices) | 168 nTwoWheels = len(twIndices) |
167 twTemporalOverlaps = np.zeros((nTwoWheels,nTwoWheels)) | 169 twTemporalOverlaps = np.zeros((nTwoWheels,nTwoWheels)) |
168 for i in range(nTwoWheels): | 170 for i in range(nTwoWheels): |
169 for j in range(i): | 171 for j in range(i): |
170 twi = objects[twowheels[twIndices[i]]] | 172 twi = objects[twowheels[twIndices[i]]] |
171 twj = objects[twowheels[twIndices[j]]] | 173 twj = objects[twowheels[twIndices[j]]] |
172 twTemporalOverlaps[i,j] = len(set(twi.bboxes).intersection(set(twj.bboxes)))/max(len(twi.bboxes), len(twj.bboxes)) | 174 twTemporalOverlaps[i,j] = len(set(twi.bboxes).intersection(set(twj.bboxes)))/max(len(twi.bboxes), len(twj.bboxes)) |
173 #twTemporalOverlaps[j,i] = twTemporalOverlaps[i,j] | 175 #twTemporalOverlaps[j,i] = twTemporalOverlaps[i,j] |
174 tw2merge = list(range(nTwoWheels)) | 176 tw2merge = list(range(nTwoWheels)) |
175 while len(tw2merge)>0 and (twTemporalOverlaps[np.ix_(tw2merge, tw2merge)] > args.maxTemporalOverlap).sum(0).max() >= 2: | 177 while len(tw2merge)>0 and (twTemporalOverlaps[np.ix_(tw2merge, tw2merge)] > args.maxTemporalOverlap).sum(0).max() >= 2: |
176 i = (twTemporalOverlaps[np.ix_(tw2merge, tw2merge)] > args.maxTemporalOverlap).sum(0).argmax() | 178 i = (twTemporalOverlaps[np.ix_(tw2merge, tw2merge)] > args.maxTemporalOverlap).sum(0).argmax() |
177 del tw2merge[i] | 179 del tw2merge[i] |
178 twIndices = [twIndices[i] for i in tw2merge] | 180 twIndices = [twIndices[i] for i in tw2merge] |
179 tw1 = objects[twowheels[twIndices[0]]] | 181 tw1 = objects[twowheels[twIndices[0]]] |
180 twCost = costs[twIndices[0],:]*tw1.nBBoxes | 182 twCost = costs[twIndices[0],:]*tw1.nBBoxes |
181 nBBoxes = tw1.nBBoxes | 183 nBBoxes = tw1.nBBoxes |
182 for twInd in twIndices[1:]: | 184 for twInd in twIndices[1:]: |
183 mergeObjects(tw1, objects[twowheels[twInd]]) | 185 mergeObjects(tw1, objects[twowheels[twInd]]) |
184 twCost = twCost + costs[twInd,:]*objects[twowheels[twInd]].nBBoxes | 186 twCost = twCost + costs[twInd,:]*objects[twowheels[twInd]].nBBoxes |
185 nBBoxes += objects[twowheels[twInd]].nBBoxes | 187 nBBoxes += objects[twowheels[twInd]].nBBoxes |
186 twIndicesToKeep = list(range(costs.shape[0])) | 188 twIndicesToKeep = list(range(costs.shape[0])) |
187 for twInd in twIndices[1:]: | 189 for twInd in twIndices[1:]: |
188 twIndicesToKeep.remove(twInd) | 190 twIndicesToKeep.remove(twInd) |
189 del objects[twowheels[twInd]] | 191 del objects[twowheels[twInd]] |
190 twowheels = [twowheels[i] for i in twIndicesToKeep] | 192 twowheels = [twowheels[i] for i in twIndicesToKeep] |
191 costs = costs[twIndicesToKeep,:] | 193 costs = costs[twIndicesToKeep,:] |
192 | 194 |
193 twIndices, matchingPedIndices = linear_sum_assignment(costs) | 195 twIndices, matchingPedIndices = linear_sum_assignment(costs) |
194 for twInd, pedInd in zip(twIndices, matchingPedIndices): # caution indices in the cost matrix | 196 for twInd, pedInd in zip(twIndices, matchingPedIndices): # caution indices in the cost matrix |
195 if -costs[twInd, pedInd] >= args.cyclistMatchingProportion: | 197 if -costs[twInd, pedInd] >= args.cyclistMatchingProportion: |
196 tw = objects[twowheels[twInd]] | 198 tw = objects[twowheels[twInd]] |
197 ped = objects[pedestrians[pedInd]] | 199 ped = objects[pedestrians[pedInd]] |
198 mergeObjects(tw, ped) | 200 mergeObjects(tw, ped) |
199 del objects[pedestrians[pedInd]] | 201 del objects[pedestrians[pedInd]] |
200 #TODO Verif overlap piéton vélo : si long hors overlap, changement mode (trouver exemples) | 202 #TODO Verif overlap piéton vélo : si long hors overlap, changement mode (trouver exemples) |
201 | 203 |
202 # interpolate and save image coordinates | 204 # interpolate and save image coordinates |
203 for num, obj in objects.items(): | 205 for num, obj in objects.items(): |
204 for f in obj.getFeatures(): | 206 for f in obj.getFeatures(): |
205 if f.length() != len(f.tmpPositions): # interpolate | 207 if f.length() != len(f.tmpPositions): # interpolate |