annotate scripts/classify-objects.py @ 1242:4cd8ace3552f

major update for classification, allowing the use of neural network classification
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 07 Feb 2024 11:43:03 -0500
parents ab4c72b9475c
children 88eedf79f16a
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: 993
diff changeset
1 #! /usr/bin/env python3
522
ce40a89bd6ae added functions for classification refactored from Sohail s work for TRB/TRC (to be tested)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
2
1028
cc5cb04b04b0 major update using the trafficintelligence package name and install through pip
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1023
diff changeset
3 import sys, argparse
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
4
522
ce40a89bd6ae added functions for classification refactored from Sohail s work for TRB/TRC (to be tested)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
5 import numpy as np
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
6 import cv2
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
7 from scipy.stats import norm, lognorm
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
8 from pathlib import Path
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
9
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
10 try:
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
11 from ultralytics import YOLO
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
12 ultralyticsAvailable = True
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
13 except ImportError:
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
14 #print('OpenCV library could not be loaded (video replay functions will not be available)') # TODO change to logging module
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
15 ultralyticsAvailable = False
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
16
522
ce40a89bd6ae added functions for classification refactored from Sohail s work for TRB/TRC (to be tested)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
17
1028
cc5cb04b04b0 major update using the trafficintelligence package name and install through pip
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1023
diff changeset
18 from trafficintelligence import cvutils, moving, ml, storage, utils
cc5cb04b04b0 major update using the trafficintelligence package name and install through pip
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1023
diff changeset
19
788
5b970a5bc233 updated classifying code to OpenCV 3.x (bug in function to load classification models)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 687
diff changeset
20 # TODO add mode detection live, add choice of kernel and svm type (to be saved in future classifier format)
522
ce40a89bd6ae added functions for classification refactored from Sohail s work for TRB/TRC (to be tested)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
21
1240
bb14f919d1cb cleaned use of centile (np only) and added info in classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1228
diff changeset
22 parser = argparse.ArgumentParser(description='The program processes indicators for all pairs of road users in the scene', epilog='The integer ids for the categories are stored in the moving module:\n{}'.format(moving.userType2Num))
536
95276d310972 renamed TrackingParameters to ProcessParameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 529
diff changeset
23 parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the configuration file', required = True)
686
cdee6a3a47b4 allowing alternate database and filename for classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
24 parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file (overrides the configuration file)')
cdee6a3a47b4 allowing alternate database and filename for classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
25 parser.add_argument('-i', dest = 'videoFilename', help = 'name of the video file (overrides the configuration file)')
685
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 684
diff changeset
26 parser.add_argument('-n', dest = 'nObjects', help = 'number of objects to classify', type = int, default = None)
911
3dd5acfa1899 corrected potential issues with videos where one cannot reach a give frame from its number
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 905
diff changeset
27 parser.add_argument('--start-frame0', dest = 'startFrame0', help = 'starts with first frame for videos with index problem where frames cannot be reached', action = 'store_true')
683
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
28 parser.add_argument('--plot-speed-distributions', dest = 'plotSpeedDistribution', help = 'simply plots the distributions used for each user type', action = 'store_true')
854
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
29 parser.add_argument('--max-speed-distribution-plot', dest = 'maxSpeedDistributionPlot', help = 'if plotting the user distributions, the maximum speed to display (km/h)', type = float, default = 50.)
962
64259b9885bf verbose option to print classification information (more to add)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 947
diff changeset
30 parser.add_argument('--verbose', dest = 'verbose', help = 'verbose information', action = 'store_true')
536
95276d310972 renamed TrackingParameters to ProcessParameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 529
diff changeset
31
522
ce40a89bd6ae added functions for classification refactored from Sohail s work for TRB/TRC (to be tested)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff changeset
32 args = parser.parse_args()
901
753a081989e2 factorized some argument handling code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 899
diff changeset
33 params, videoFilename, databaseFilename, invHomography, intrinsicCameraMatrix, distortionCoefficients, undistortedImageMultiplication, undistort, firstFrameNum = storage.processVideoArguments(args)
812
21f10332c72b moved the classification parameters from tracking.cfg to a new classifier.cfg and made all classification parameters apparent
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
34 classifierParams = storage.ClassifierParameters(params.classifierFilename)
854
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
35 classifierParams.convertToFrames(params.videoFrameRate, 3.6) # conversion from km/h to m/frame
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
36
1169
9f7a4a026dab correcting bug in classify objects that ignored the parameter for centile aggregation of speed, if used in classifier.cfg (updated pip version)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1092
diff changeset
37 speedAggregationFunc = utils.aggregationFunction(classifierParams.speedAggregationMethod, classifierParams.speedAggregationCentile)
1023
a13f47c8931d work on processing large datasets (generate speed data)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1022
diff changeset
38 if speedAggregationFunc is None:
683
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
39 sys.exit()
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
40
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
41 if ultralyticsAvailable and Path(classifierParams.dlFilename).is_file(): # use Yolo
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
42 pedBikeCarSVM = None
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
43 bikeCarSVM = None
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
44 yolo = YOLO(classifierParams.dlFilename, task='detect')
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
45 useYolo = True
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
46 else:
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
47 useYolo = False
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
48 pedBikeCarSVM = ml.SVM_load(classifierParams.pedBikeCarSVMFilename)
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
49 bikeCarSVM = ml.SVM_load(classifierParams.bikeCarSVMFilename)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
50
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
51 # log logistic for ped and bik otherwise ((pedBeta/pedAlfa)*((sMean/pedAlfa)**(pedBeta-1)))/((1+(sMean/pedAlfa)**pedBeta)**2.)
854
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
52 carNorm = norm(classifierParams.meanVehicleSpeed, classifierParams.stdVehicleSpeed)
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
53 pedNorm = norm(classifierParams.meanPedestrianSpeed, classifierParams.stdPedestrianSpeed)
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
54 # numpy lognorm shape, loc, scale: shape for numpy is scale (std of the normal) and scale for numpy is exp(location) (loc=mean of the normal)
1242
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
55 cycLogNorm = lognorm(classifierParams.scaleCyclistSpeed, loc = 0., scale = np.exp(classifierParams.locationCyclistSpeed))
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
56 speedProbabilities = {moving.userType2Num['car']: lambda s: carNorm.pdf(s),
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
57 moving.userType2Num['pedestrian']: lambda s: pedNorm.pdf(s),
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
58 moving.userType2Num['cyclist']: lambda s: cycLogNorm.pdf(s)}
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
59 if useYolo: # consider other user types
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
60 for i in [3, 5, 6, 7]:
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
61 speedProbabilities[i] = speedProbabilities[moving.userType2Num['car']]
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
62
683
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
63 if args.plotSpeedDistribution:
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
64 import matplotlib.pyplot as plt
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
65 plt.figure()
1092
49c0bb6eacc2 minor modification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
66 speeds = np.arange(0.1, args.maxSpeedDistributionPlot, 0.1)
682
fbe29be25501 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
67 for k in speedProbabilities:
1092
49c0bb6eacc2 minor modification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
68 plt.plot(speeds, [speedProbabilities[k](s/(3.6*params.videoFrameRate)) for s in speeds], label = k) # the distribution parameters are in video intrinsic units, unit of distance per frame
854
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
69 maxProb = -1.
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
70 for k in speedProbabilities:
1092
49c0bb6eacc2 minor modification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
71 maxProb = max(maxProb, np.max([speedProbabilities[k](s/(3.6*params.videoFrameRate)) for s in speeds]))
854
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
72 plt.plot([classifierParams.minSpeedEquiprobable*3.6*params.videoFrameRate]*2, [0., maxProb], 'k-')
33d296984dd8 rework and more info on speed probabilities for classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 817
diff changeset
73 plt.text(classifierParams.minSpeedEquiprobable*3.6*params.videoFrameRate, maxProb, 'threshold for equiprobable class')
683
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
74 plt.xlabel('Speed (km/h)')
1092
49c0bb6eacc2 minor modification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
75 plt.ylabel('Probability density function')
683
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
76 plt.legend()
1092
49c0bb6eacc2 minor modification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1028
diff changeset
77 #plt.title('Probability Density Function')
683
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
78 plt.show()
f3a0b652b590 added function to display the speed distributions and optimize a little going through objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 682
diff changeset
79 sys.exit()
682
fbe29be25501 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
80
686
cdee6a3a47b4 allowing alternate database and filename for classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
81 objects = storage.loadTrajectoriesFromSqlite(databaseFilename, 'object', args.nObjects, withFeatures = True)
902
c69a8defe5c3 changed workflow of classify objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 901
diff changeset
82 timeInterval = moving.TimeInterval.unionIntervals([obj.getTimeInterval() for obj in objects])
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
83
686
cdee6a3a47b4 allowing alternate database and filename for classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
84 capture = cv2.VideoCapture(videoFilename)
993
e8eabef7857c update to OpenCV3 for python
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 962
diff changeset
85 width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
e8eabef7857c update to OpenCV3 for python
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 962
diff changeset
86 height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
87
935
0e63a918a1ca updated classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 928
diff changeset
88 #if undistort: # setup undistortion
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 912
diff changeset
89 # [map1, map2] = cvutils.computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients)
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 912
diff changeset
90 # height, width = map1.shape
935
0e63a918a1ca updated classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 928
diff changeset
91 # newImgSize = (int(round(width*undistortedImageMultiplication)), int(round(height*undistortedImageMultiplication)))
0e63a918a1ca updated classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 928
diff changeset
92 # newCameraMatrix = cv2.getDefaultNewCameraMatrix(intrinsicCameraMatrix, newImgSize, True)
0e63a918a1ca updated classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 928
diff changeset
93 #else:
0e63a918a1ca updated classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 928
diff changeset
94 # newCameraMatrix = None
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 902
diff changeset
95
684
6d2ece4aed7c bug forgot to svae objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 683
diff changeset
96 pastObjects = []
902
c69a8defe5c3 changed workflow of classify objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 901
diff changeset
97 currentObjects = []
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
98 if capture.isOpened():
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
99 ret = True
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
100 frameNum = timeInterval.first
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
101 capture.set(cv2.CAP_PROP_POS_FRAMES, frameNum)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
102 lastFrameNum = timeInterval.last
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
103
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
104 while ret and frameNum <= lastFrameNum:
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
105 ret, img = capture.read()
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
106 if ret:
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
107 if frameNum%50 == 0:
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
108 print('frame number: {}'.format(frameNum))
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 912
diff changeset
109 #if undistort:
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
110 # img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR)
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
111 if useYolo:
1242
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
112 results = yolo.predict(img, conf = classifierParams.confidence, classes=list(moving.cocoTypeNames.keys()), verbose=False)
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
113
947
053484e08947 found a more elegant solution, making a copy of the list to iterate
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 946
diff changeset
114 for obj in objects[:]:
912
fd057a6b04db corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 911
diff changeset
115 if obj.getFirstInstant() <= frameNum: # if images are skipped
935
0e63a918a1ca updated classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 928
diff changeset
116 obj.initClassifyUserTypeHoGSVM(speedAggregationFunc, pedBikeCarSVM, bikeCarSVM, classifierParams.maxPedestrianSpeed, classifierParams.maxCyclistSpeed, classifierParams.nFramesIgnoreAtEnds, invHomography, intrinsicCameraMatrix, distortionCoefficients)
902
c69a8defe5c3 changed workflow of classify objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 901
diff changeset
117 currentObjects.append(obj)
947
053484e08947 found a more elegant solution, making a copy of the list to iterate
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 946
diff changeset
118 objects.remove(obj)
902
c69a8defe5c3 changed workflow of classify objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 901
diff changeset
119
947
053484e08947 found a more elegant solution, making a copy of the list to iterate
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 946
diff changeset
120 for obj in currentObjects[:]:
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
121 if obj.getLastInstant() <= frameNum:
1242
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
122 obj.classifyUserTypeHoGSVM(classifierParams.minSpeedEquiprobable, speedProbabilities, classifierParams.maxPercentUnknown)
902
c69a8defe5c3 changed workflow of classify objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 901
diff changeset
123 pastObjects.append(obj)
947
053484e08947 found a more elegant solution, making a copy of the list to iterate
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 946
diff changeset
124 currentObjects.remove(obj)
817
b9ec0cc2677d corrected bug in classify-objects.py script
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 812
diff changeset
125 else:
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
126 if useYolo:
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
127 # if one feature falls in bike, it's a bike
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
128 # could one count all hits in various objects, or one takes majority at the instant?
1242
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
129 #print('yolo', len(results[0].boxes))
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
130 obj.classifyUserTypeYoloAtInstant(frameNum, results[0].boxes)
1241
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
131 else:
ab4c72b9475c work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1240
diff changeset
132 obj.classifyUserTypeHoGSVMAtInstant(img, frameNum, width, height, classifierParams.percentIncreaseCrop, classifierParams.percentIncreaseCrop, classifierParams.minNPixels, classifierParams.hogRescaleSize, classifierParams.hogNOrientations, classifierParams.hogNPixelsPerCell, classifierParams.hogNCellsPerBlock, classifierParams.hogBlockNorm)
962
64259b9885bf verbose option to print classification information (more to add)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 947
diff changeset
133 if args.verbose:
64259b9885bf verbose option to print classification information (more to add)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 947
diff changeset
134 print('obj {}@{}: {}'.format(obj.getNum(), frameNum, moving.userTypeNames[obj.userTypes[frameNum]]))
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
135 frameNum += 1
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 536
diff changeset
136
902
c69a8defe5c3 changed workflow of classify objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 901
diff changeset
137 for obj in currentObjects:
1242
4cd8ace3552f major update for classification, allowing the use of neural network classification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1241
diff changeset
138 obj.classifyUserTypeHoGSVM(classifierParams.minSpeedEquiprobable, speedProbabilities, classifierParams.maxPercentUnknown)
684
6d2ece4aed7c bug forgot to svae objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 683
diff changeset
139 pastObjects.append(obj)
6d2ece4aed7c bug forgot to svae objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 683
diff changeset
140 print('Saving user types')
686
cdee6a3a47b4 allowing alternate database and filename for classify-objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
141 storage.setRoadUserTypes(databaseFilename, pastObjects)