Mercurial > hg > nsaunier > traffic-intelligence
comparison scripts/nomad/site-parameters-optimization.py @ 1186:7117a31555c1
Etienne Beauchamp s work on optimization with Nomad software
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 21 Jun 2022 17:06:06 -0400 |
| parents | |
| children | ccab20f85710 |
comparison
equal
deleted
inserted
replaced
| 1177:aa88acf06876 | 1186:7117a31555c1 |
|---|---|
| 1 #! /usr/bin/env python3 | |
| 2 import os | |
| 3 import sys | |
| 4 import glob | |
| 5 from trafficintelligence import storage, moving | |
| 6 import subprocess | |
| 7 import numpy as np | |
| 8 | |
| 9 | |
| 10 def loadParametersStartProcess(filename): | |
| 11 # load initial parameters from x.txt | |
| 12 f = open(filename, 'r+') | |
| 13 l = f.readline() | |
| 14 x = [s for s in l.strip().split(" ")] | |
| 15 f.close() | |
| 16 | |
| 17 # create para-value list | |
| 18 para = paraValueList(x) | |
| 19 | |
| 20 # run process including trackingfeature, groupfeature, load groundtruth, compute mota | |
| 21 print(process(para, intersections, optimizeGroupingOnly)) | |
| 22 | |
| 23 def paraValueList(x): | |
| 24 #create para-value list | |
| 25 #list of the 8 parameters and their values | |
| 26 pn = 8 | |
| 27 p = pn*[None] | |
| 28 p[0] = '--feature-quality' #]0.-0.4] | |
| 29 p[1] = '--min-feature-distanceklt' #]0.-6] | |
| 30 p[2] = '--window-size' #[1-10]integer | |
| 31 p[3] = '--min-tracking-error' #[0.01-0.3] | |
| 32 p[4] = '--min-feature-time' #[2-100]integer | |
| 33 p[5] = '--mm-connection-distance' #[0.5-100] | |
| 34 p[6] = '--mm-segmentation-distance' #[1-100] ~mm-connection-distance / 2.5 | |
| 35 p[7] = '--min-nfeatures-group' #[2-4] | |
| 36 | |
| 37 para = [] | |
| 38 for n in range(pn): | |
| 39 para = para + [p[n],x[n]] | |
| 40 | |
| 41 return para | |
| 42 | |
| 43 def process(para, intersections, optimizeGroupingOnly): | |
| 44 Mota = [] | |
| 45 gtDatabaseaAbsPaths = [] | |
| 46 configFileAbsPaths = [] | |
| 47 | |
| 48 cwd = os.getcwd() | |
| 49 # move to the location of the intersection | |
| 50 for intersectionPath in intersections: | |
| 51 intersectionAbsPath = os.path.abspath(intersectionPath) | |
| 52 os.chdir(intersectionAbsPath) | |
| 53 # iterate through all the subdirectories to find ground truth sqlite files | |
| 54 gtDatabaseaAbsPaths.extend([os.path.abspath(intersectionAbsPath + '/' + file) for file in glob.glob('**/*_gt.sqlite', recursive=True)]) | |
| 55 configFileAbsPaths.append(os.path.abspath(intersectionAbsPath + '/' + glob.glob('*.cfg', recursive=True)[0])) | |
| 56 os.chdir(cwd) | |
| 57 for gtDatabaseAbsPath, configFileAbsPath in zip(gtDatabaseaAbsPaths, configFileAbsPaths): | |
| 58 gtDatabaseBasename = gtDatabaseAbsPath[:-10] | |
| 59 videoFilename = gtDatabaseBasename + ".MP4" | |
| 60 databaseFilename = gtDatabaseBasename + ".sqlite" | |
| 61 gtDatabaseDirname = os.path.dirname(gtDatabaseAbsPath) | |
| 62 homographyFilename = gtDatabaseDirname + "/homography.txt" | |
| 63 maskFilename = gtDatabaseDirname + "/mask.png" | |
| 64 # Skip feature tracking if the user specified to optimize only grouping parameters | |
| 65 if not optimizeGroupingOnly: | |
| 66 # Track features | |
| 67 trackingFeature(para, configFileAbsPath, videoFilename, databaseFilename, homographyFilename, maskFilename) | |
| 68 # Group features | |
| 69 groupFeature(para, configFileAbsPath, videoFilename, databaseFilename, homographyFilename, maskFilename) | |
| 70 #load trajectory | |
| 71 objects = storage.loadTrajectoriesFromSqlite(databaseFilename, 'object') | |
| 72 #load ground truth | |
| 73 annotations = storage.loadTrajectoriesFromSqlite(gtDatabaseAbsPath, 'object') | |
| 74 # Appending negative mota because nomad minimizes the output | |
| 75 Mota.append(-computeMota(annotations, objects, Mota)) | |
| 76 | |
| 77 # Change to the previous directory | |
| 78 os.chdir(cwd) | |
| 79 | |
| 80 return np.mean(Mota) | |
| 81 | |
| 82 def trackingFeature(para, config, video, db, homo, mask): | |
| 83 # remove previous tracking | |
| 84 if os.path.exists(db): | |
| 85 os.remove(db) | |
| 86 # trackingfeature command parameters | |
| 87 tf = ['feature-based-tracking', config, '--tf', '--video-filename', video, '--database-filename', db, '--homography-filename', homo, '--mask-filename', mask] | |
| 88 # run in command line and print directly | |
| 89 subprocess.check_output(tf + para[0:10]) | |
| 90 | |
| 91 def groupFeature(para, config, video, db, homo, mask): | |
| 92 #remove previous grouping | |
| 93 storage.deleteFromSqlite(db, 'object') | |
| 94 #groupfeature command parameters | |
| 95 gf = ['feature-based-tracking', config, '--gf', '--video-filename', video, '--database-filename', db, '--homography-filename', homo, '--mask-filename', mask] | |
| 96 #run in command line and print directly | |
| 97 subprocess.check_output(gf + para[8:16]) # ['--min-feature-time', 'x', '--mm-connection-distance', 'x', '--mm-segmentation-distance', 'x', '--min-nfeatures-group', 'x'] | |
| 98 | |
| 99 def computeMota(annotations, objects, Mota): | |
| 100 matchingDistance = 500 | |
| 101 firstInstant = 0 | |
| 102 lastInstant = 50000 | |
| 103 return moving.computeClearMOT(annotations, objects, matchingDistance, firstInstant, lastInstant)[1] | |
| 104 | |
| 105 | |
| 106 if __name__ == "__main__": | |
| 107 # Load args that were given with select-arguments.py | |
| 108 with open('arguments.txt', 'r') as f: | |
| 109 args = f.read().split('\n') | |
| 110 intersections = args[0] | |
| 111 optimizeGroupingOnly = args[1] | |
| 112 # Convert string representation of list into list | |
| 113 intersections = eval(intersections) | |
| 114 | |
| 115 loadParametersStartProcess(sys.argv[1]) | |
| 116 sys.exit(0) | |
| 117 |
