# HG changeset patch # User Nicolas Saunier # Date 1457042490 18000 # Node ID 3aa6102ccc12ea7f060b7ee0c00ba7c7162a5893 # Parent 30bd0f2223b71d3623d8aa77d121c3d2258b944a addressed issues with ground truth annotations shifted in time diff -r 30bd0f2223b7 -r 3aa6102ccc12 python/moving.py --- a/python/moving.py Thu Mar 03 14:31:13 2016 -0500 +++ b/python/moving.py Thu Mar 03 17:01:30 2016 -0500 @@ -61,6 +61,10 @@ '''Indicates if the temporal interval of self is comprised in interval2''' return (self.first >= interval2.first) and (self.last <= interval2.last) + def shift(self, offset): + self.first += offset + self.last += offset + @classmethod def union(cls, interval1, interval2): '''Smallest interval comprising self and interval2''' @@ -174,6 +178,9 @@ def commonTimeInterval(self, obj2): return TimeInterval.intersection(self.getTimeInterval(), obj2.getTimeInterval()) + def shiftTimeInterval(self, offset): + self.timeInterval.shift(offset) + class Point(object): def __init__(self, x, y): self.x = x diff -r 30bd0f2223b7 -r 3aa6102ccc12 scripts/compute-clearmot.py --- a/scripts/compute-clearmot.py Thu Mar 03 14:31:13 2016 -0500 +++ b/scripts/compute-clearmot.py Thu Mar 03 17:01:30 2016 -0500 @@ -20,6 +20,8 @@ parser.add_argument('--mask', dest = 'maskFilename', help = 'filename of the mask file used to define the where objects were tracked') parser.add_argument('-f', dest = 'firstInstant', help = 'first instant for measurement', required = True, type = int) parser.add_argument('-l', dest = 'lastInstant', help = 'last instant for measurement', required = True, type = int) +parser.add_argument('--offset', dest = 'nFramesOffsetAnnotations', help = 'number of frames to offset the ground truth annotations', type = int) +parser.add_argument('--displayOffset', dest = 'nFramesOffsetDisplay', help = 'number of frames to offset annotations and objects for display', type = int) parser.add_argument('--display', dest = 'display', help = 'display the ground truth to object matches (graphically)', action = 'store_true') parser.add_argument('-i', dest = 'videoFilename', help = 'name of the video file (for display)') args = parser.parse_args() @@ -45,6 +47,10 @@ for a in annotations: a.computeCentroidTrajectory(homography) +if args.nFramesOffsetAnnotations is not None: + for a in annotations: + a.shiftTimeInterval(args.nFramesOffsetAnnotations) + if args.display: motp, mota, mt, mme, fpt, gt, gtMatches, toMatches = moving.computeClearMOT(annotations, objects, args.matchingDistance, args.firstInstant, args.lastInstant, True) else: @@ -56,8 +62,24 @@ print 'Number of missed objects.frames: {}'.format(mt) print 'Number of mismatches: {}'.format(mme) print 'Number of false alarms.frames: {}'.format(fpt) + +def shiftMatches(matches, offset): + shifted = {} + for k in matches: + shifted[k] = {t+offset:v for t, v in matches[k].iteritems()} + return shifted + if args.display: - cvutils.displayTrajectories(args.videoFilename, objects, {}, inv(homography), args.firstInstant, args.lastInstant, annotations = annotations, gtMatches = gtMatches, toMatches = toMatches)#, rescale = args.rescale, nFramesStep = args.nFramesStep, saveAllImages = args.saveAllImages, undistort = (undistort or args.undistort), intrinsicCameraMatrix = intrinsicCameraMatrix, distortionCoefficients = distortionCoefficients, undistortedImageMultiplication = undistortedImageMultiplication) + if args.nFramesOffsetDisplay is not None: + firstInstant = args.firstInstant+args.nFramesOffsetDisplay + lastInstant = args.lastInstant+args.nFramesOffsetDisplay + for a in annotations: + a.shiftTimeInterval(args.nFramesOffsetDisplay) + for o in objects: + o.shiftTimeInterval(args.nFramesOffsetDisplay) + gtMatches = shiftMatches(gtMatches, args.nFramesOffsetDisplay) + toMatches = shiftMatches(toMatches, args.nFramesOffsetDisplay) + cvutils.displayTrajectories(args.videoFilename, objects, {}, inv(homography), firstInstant, lastInstant, annotations = annotations, gtMatches = gtMatches, toMatches = toMatches)#, rescale = args.rescale, nFramesStep = args.nFramesStep, saveAllImages = args.saveAllImages, undistort = (undistort or args.undistort), intrinsicCameraMatrix = intrinsicCameraMatrix, distortionCoefficients = distortionCoefficients, undistortedImageMultiplication = undistortedImageMultiplication) #print('Ground truth matches') #print(gtMatches)