Mercurial Hosting > traffic-intelligence
comparison 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 |
comparison
equal
deleted
inserted
replaced
1241:ab4c72b9475c | 1242:4cd8ace3552f |
---|---|
50 | 50 |
51 # log logistic for ped and bik otherwise ((pedBeta/pedAlfa)*((sMean/pedAlfa)**(pedBeta-1)))/((1+(sMean/pedAlfa)**pedBeta)**2.) | 51 # log logistic for ped and bik otherwise ((pedBeta/pedAlfa)*((sMean/pedAlfa)**(pedBeta-1)))/((1+(sMean/pedAlfa)**pedBeta)**2.) |
52 carNorm = norm(classifierParams.meanVehicleSpeed, classifierParams.stdVehicleSpeed) | 52 carNorm = norm(classifierParams.meanVehicleSpeed, classifierParams.stdVehicleSpeed) |
53 pedNorm = norm(classifierParams.meanPedestrianSpeed, classifierParams.stdPedestrianSpeed) | 53 pedNorm = norm(classifierParams.meanPedestrianSpeed, classifierParams.stdPedestrianSpeed) |
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) | 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) |
55 bicLogNorm = lognorm(classifierParams.scaleCyclistSpeed, loc = 0., scale = np.exp(classifierParams.locationCyclistSpeed)) | 55 cycLogNorm = lognorm(classifierParams.scaleCyclistSpeed, loc = 0., scale = np.exp(classifierParams.locationCyclistSpeed)) |
56 speedProbabilities = {moving.userTypeNames[1]: lambda s: carNorm.pdf(s), | 56 speedProbabilities = {moving.userType2Num['car']: lambda s: carNorm.pdf(s), |
57 moving.userTypeNames[2]: lambda s: pedNorm.pdf(s), | 57 moving.userType2Num['pedestrian']: lambda s: pedNorm.pdf(s), |
58 moving.userTypeNames[4]: lambda s: bicLogNorm.pdf(s)} | 58 moving.userType2Num['cyclist']: lambda s: cycLogNorm.pdf(s)} |
59 if useYolo: # consider other user types | |
60 for i in [3, 5, 6, 7]: | |
61 speedProbabilities[i] = speedProbabilities[moving.userType2Num['car']] | |
59 | 62 |
60 if args.plotSpeedDistribution: | 63 if args.plotSpeedDistribution: |
61 import matplotlib.pyplot as plt | 64 import matplotlib.pyplot as plt |
62 plt.figure() | 65 plt.figure() |
63 speeds = np.arange(0.1, args.maxSpeedDistributionPlot, 0.1) | 66 speeds = np.arange(0.1, args.maxSpeedDistributionPlot, 0.1) |
104 if frameNum%50 == 0: | 107 if frameNum%50 == 0: |
105 print('frame number: {}'.format(frameNum)) | 108 print('frame number: {}'.format(frameNum)) |
106 #if undistort: | 109 #if undistort: |
107 # img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR) | 110 # img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR) |
108 if useYolo: | 111 if useYolo: |
109 results = yolo.predict(img, classes=list(moving.cocoTypeNames.keys()), verbose=False) | 112 results = yolo.predict(img, conf = classifierParams.confidence, classes=list(moving.cocoTypeNames.keys()), verbose=False) |
110 | 113 |
111 for obj in objects[:]: | 114 for obj in objects[:]: |
112 if obj.getFirstInstant() <= frameNum: # if images are skipped | 115 if obj.getFirstInstant() <= frameNum: # if images are skipped |
113 obj.initClassifyUserTypeHoGSVM(speedAggregationFunc, pedBikeCarSVM, bikeCarSVM, classifierParams.maxPedestrianSpeed, classifierParams.maxCyclistSpeed, classifierParams.nFramesIgnoreAtEnds, invHomography, intrinsicCameraMatrix, distortionCoefficients) | 116 obj.initClassifyUserTypeHoGSVM(speedAggregationFunc, pedBikeCarSVM, bikeCarSVM, classifierParams.maxPedestrianSpeed, classifierParams.maxCyclistSpeed, classifierParams.nFramesIgnoreAtEnds, invHomography, intrinsicCameraMatrix, distortionCoefficients) |
114 currentObjects.append(obj) | 117 currentObjects.append(obj) |
115 objects.remove(obj) | 118 objects.remove(obj) |
116 | 119 |
117 for obj in currentObjects[:]: | 120 for obj in currentObjects[:]: |
118 if obj.getLastInstant() <= frameNum: | 121 if obj.getLastInstant() <= frameNum: |
119 obj.classifyUserTypeHoGSVM(minSpeedEquiprobable = classifierParams.minSpeedEquiprobable, speedProbabilities = speedProbabilities, maxPercentUnknown = classifierParams.maxPercentUnknown) | 122 obj.classifyUserTypeHoGSVM(classifierParams.minSpeedEquiprobable, speedProbabilities, classifierParams.maxPercentUnknown) |
120 pastObjects.append(obj) | 123 pastObjects.append(obj) |
121 currentObjects.remove(obj) | 124 currentObjects.remove(obj) |
122 else: | 125 else: |
123 if useYolo: | 126 if useYolo: |
124 # if one feature falls in bike, it's a bike | 127 # if one feature falls in bike, it's a bike |
125 # could one count all hits in various objects, or one takes majority at the instant? | 128 # could one count all hits in various objects, or one takes majority at the instant? |
126 # obj.classifyUserTypeYoloAtInstant(img, frameNum, width, height, classifierParams.percentIncreaseCrop, classifierParams.percentIncreaseCrop, results[0].boxes) | 129 #print('yolo', len(results[0].boxes)) |
127 pass | 130 obj.classifyUserTypeYoloAtInstant(frameNum, results[0].boxes) |
128 else: | 131 else: |
129 obj.classifyUserTypeHoGSVMAtInstant(img, frameNum, width, height, classifierParams.percentIncreaseCrop, classifierParams.percentIncreaseCrop, classifierParams.minNPixels, classifierParams.hogRescaleSize, classifierParams.hogNOrientations, classifierParams.hogNPixelsPerCell, classifierParams.hogNCellsPerBlock, classifierParams.hogBlockNorm) | 132 obj.classifyUserTypeHoGSVMAtInstant(img, frameNum, width, height, classifierParams.percentIncreaseCrop, classifierParams.percentIncreaseCrop, classifierParams.minNPixels, classifierParams.hogRescaleSize, classifierParams.hogNOrientations, classifierParams.hogNPixelsPerCell, classifierParams.hogNCellsPerBlock, classifierParams.hogBlockNorm) |
130 if args.verbose: | 133 if args.verbose: |
131 print('obj {}@{}: {}'.format(obj.getNum(), frameNum, moving.userTypeNames[obj.userTypes[frameNum]])) | 134 print('obj {}@{}: {}'.format(obj.getNum(), frameNum, moving.userTypeNames[obj.userTypes[frameNum]])) |
132 frameNum += 1 | 135 frameNum += 1 |
133 | 136 |
134 for obj in currentObjects: | 137 for obj in currentObjects: |
135 obj.classifyUserTypeHoGSVM(minSpeedEquiprobable = classifierParams.minSpeedEquiprobable, speedProbabilities = speedProbabilities, maxPercentUnknown = classifierParams.maxPercentUnknown) | 138 obj.classifyUserTypeHoGSVM(classifierParams.minSpeedEquiprobable, speedProbabilities, classifierParams.maxPercentUnknown) |
136 pastObjects.append(obj) | 139 pastObjects.append(obj) |
137 print('Saving user types') | 140 print('Saving user types') |
138 storage.setRoadUserTypes(databaseFilename, pastObjects) | 141 storage.setRoadUserTypes(databaseFilename, pastObjects) |