Mercurial Hosting > traffic-intelligence
changeset 961:ec1682ed999f
added computation of confusion matrix and improved default parameter for block normalization for SVM classification
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Sun, 05 Nov 2017 23:45:47 -0500 |
parents | 0c1d1eeef544 |
children | 64259b9885bf |
files | classifier.cfg python/ml.py scripts/train-object-classification.py |
diffstat | 3 files changed, 25 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/classifier.cfg Fri Oct 20 16:59:32 2017 -0400 +++ b/classifier.cfg Sun Nov 05 23:45:47 2017 -0500 @@ -15,7 +15,7 @@ # number of cells per block for HoG computation hog-ncells-block = 2 # block normalization method (L1, L1-sqrt, L2, L2-Hys) -hog-block-norm = L2-Hys +hog-block-norm = L1-sqrt # method to aggregate road user speed speed-aggregation-method = median # number of frames to ignore at both ends of a series (noisy)
--- a/python/ml.py Fri Oct 20 16:59:32 2017 -0400 +++ b/python/ml.py Sun Nov 05 23:45:47 2017 -0500 @@ -19,6 +19,14 @@ # OpenCV ML models ##################### +def computeConfusionMatrix(model, samples, responses): + 'computes the confusion matrix of the classifier (model)' + classifications = {} + for x,y in zip(samples, responses): + predicted = model.predict(x) + classifications[(y, predicted)] = classifications.get((y, predicted), 0)+1 + return classifications + class StatModel(object): '''Abstract class for loading/saving model''' def load(self, filename): @@ -46,8 +54,10 @@ # self.model.setNu(nu) # self.model.setP(p) - def train(self, samples, responses): + def train(self, samples, responses, computePerformance = False): self.model.train(samples, responses, params = self.params) + if computePerformance: + return computeConfusionMatrix(self, samples, responses) def predict(self, hog): return self.model.predict(hog)
--- a/scripts/train-object-classification.py Fri Oct 20 16:59:32 2017 -0400 +++ b/scripts/train-object-classification.py Sun Nov 05 23:45:47 2017 -0500 @@ -18,18 +18,11 @@ parser.add_argument('--nu', dest = 'nu', help = 'SVM nu', default = 0, type = int) parser.add_argument('--svmp', dest = 'svmP', help = 'SVM p', default = 0, type = int) parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the classifier configuration file', required = True) -# parser.add_argument('-s', dest = 'rescaleSize', help = 'rescale size of image samples', default = 64, type = int) -# parser.add_argument('-o', dest = 'nOrientations', help = 'number of orientations in HoG', default = 9, type = int) -# parser.add_argument('-p', dest = 'nPixelsPerCell', help = 'number of pixels per cell', default = 8, type = int) -# parser.add_argument('-c', dest = 'nCellsPerBlock', help = 'number of cells per block', default = 2, type = int) +parser.add_argument('--compute-classifications', dest = 'computeClassifications', help = 'compute the confusion matrix on the training data', action = 'store_true') args = parser.parse_args() classifierParams = storage.ClassifierParameters(args.configFilename) -# rescaleSize = (args.rescaleSize, args.rescaleSize) -# nPixelsPerCell = (args.nPixelsPerCell, args.nPixelsPerCell) -# nCellsPerBlock = (args.nCellsPerBlock, args.nCellsPerBlock) - imageDirectories = {'pedestrian': args.directoryName + "/Pedestrians/", 'bicycle': args.directoryName + "/Cyclists/", 'car': args.directoryName + "/Vehicles/"} @@ -57,20 +50,28 @@ # Training the Support Vector Machine print "Training Pedestrian-Cyclist-Vehicle Model" model = ml.SVM(args.svmType, args.kernelType, args.degree, args.gamma, args.coef0, args.cvalue, args.nu, args.svmP) -model.train(np.concatenate(trainingSamplesPBV.values()), np.concatenate(trainingLabelsPBV.values())) +classifications = model.train(np.concatenate(trainingSamplesPBV.values()), np.concatenate(trainingLabelsPBV.values()), True) +if args.computeClassifications: + print(classifications) model.save(args.directoryName + "/modelPBV.xml") print "Training Cyclist-Vehicle Model" model = ml.SVM(args.svmType, args.kernelType, args.degree, args.gamma, args.coef0, args.cvalue, args.nu, args.svmP) -model.train(np.concatenate(trainingSamplesBV.values()), np.concatenate(trainingLabelsBV.values())) +classifications = model.train(np.concatenate(trainingSamplesBV.values()), np.concatenate(trainingLabelsBV.values()), True) +if args.computeClassifications: + print(classifications) model.save(args.directoryName + "/modelBV.xml") print "Training Pedestrian-Cyclist Model" model = ml.SVM(args.svmType, args.kernelType, args.degree, args.gamma, args.coef0, args.cvalue, args.nu, args.svmP) -model.train(np.concatenate(trainingSamplesPB.values()), np.concatenate(trainingLabelsPB.values())) +classifications = model.train(np.concatenate(trainingSamplesPB.values()), np.concatenate(trainingLabelsPB.values()), True) +if args.computeClassifications: + print(classifications) model.save(args.directoryName + "/modelPB.xml") print "Training Pedestrian-Vehicle Model" model = ml.SVM(args.svmType, args.kernelType, args.degree, args.gamma, args.coef0, args.cvalue, args.nu, args.svmP) -model.train(np.concatenate(trainingSamplesPV.values()), np.concatenate(trainingLabelsPV.values())) +classifications = model.train(np.concatenate(trainingSamplesPV.values()), np.concatenate(trainingLabelsPV.values()), True) +if args.computeClassifications: + print(classifications) model.save(args.directoryName + "/modelPV.xml")