def AnalyzeTrackings(simName, simParams, skillNames, trackRuns, path='.', tag_filters=None): dirName = os.path.join(path, simName) trackFile = os.path.join(dirName, simParams['noisyTrackFile']) tagFile = os.path.join(dirName, simParams['simTagFile']) simTags = ParamUtils.ReadSimTagFile(tagFile) keeperIDs = ParamUtils.process_tag_filters(simTags, tag_filters) (true_tracks, true_falarms) = FilterMHTTracks(*ReadTracks(trackFile)) lastFrame = (max(trk['frameNums'][-1] for trk in (true_tracks + true_falarms)) if len(true_tracks) + len(true_falarms) > 0 else 0) true_AssocSegs, trackIndices = CreateSegments(true_tracks, retindices=True, lastFrame=lastFrame) # TODO: need to filter trackIndices as well! true_AssocSegs = FilterSegments(keeperIDs, true_AssocSegs) true_FAlarmSegs, falarmIndices = CreateSegments(true_falarms, retindices=True, lastFrame=lastFrame) true_FAlarmSegs = FilterSegments(keeperIDs, true_FAlarmSegs) # Initializing the analysis data, which will hold a table of analysis # results for this simulation analysis = np.empty((len(skillNames), len(trackRuns))) labels = [skillNames, trackRuns] for trackerIndex, tracker in enumerate(trackRuns): obvFilename = os.path.join(dirName, simParams['result_file'] + "_" + tracker) (obvTracks, obvFAlarms) = FilterMHTTracks(*ReadTracks(obvFilename)) trk_segs = CreateSegments(obvTracks + obvFAlarms, lastFrame=lastFrame) trk_segs = FilterSegments(keeperIDs, trk_segs) truthTable = MakeContingency(true_AssocSegs + true_FAlarmSegs, trk_segs) #print("Margin Sums: %d" % (len(truthTable['assocs_Correct']) + # len(truthTable['assocs_Wrong']) + # len(truthTable['falarms_Wrong']) + # len(truthTable['falarms_Correct']))) for skillIndex, skill in enumerate(skillNames): analysis[skillIndex, trackerIndex] = Analyzers.skillcalcs[skill]( tracks=obvTracks, falarms=obvFAlarms, truthTable=truthTable, true_tracks=true_tracks, true_falarms=true_falarms, track_indices=trackIndices, falarm_indices=falarmIndices) # (Skills x TrackRuns) return larry(analysis, labels)
def main(args) : dirName = os.path.join(args.directory, args.simName) simParams = ParamUtils.ReadSimulationParams(os.path.join(dirName, 'simParams.conf')) volData = ReadCorners(os.path.join(dirName, simParams['inputDataFile']), path=dirName)['volume_data'] if args.doTracks : origTrackData = FilterMHTTracks(*ReadTracks(os.path.join(dirName, simParams['simTrackFile']))) noisyTrackData = FilterMHTTracks(*ReadTracks(os.path.join(dirName, simParams['noisyTrackFile']))) DownsampleTracks(args.skipCnt, args.simName, args.newName, simParams, volData, origTrackData, noisyTrackData, path=args.directory) else : DownsampleCorners(args.skipCnt, args.simName, args.newName, simParams, volData, path=args.directory)
if __name__ == '__main__': import os.path import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid from ZigZag.TrackPlot import PlotPlainTracks, PlotSegments from ZigZag.TrackUtils import CleanupTracks, FilterMHTTracks,\ CreateSegments, CompareSegments from ZigZag.TrackFileUtils import ReadCorners, ReadTracks dirPath = "/home/ben/Programs/Tracking/NewSim1" #dirPath = "/home/bvr/TrackingStudy/SquallSim" cornerVol = ReadCorners(os.path.join(dirPath, "InputDataFile"), dirPath)['volume_data'] true_tracks, true_falarms = FilterMHTTracks( *ReadTracks(os.path.join(dirPath, "noise_tracks"))) frameLims = (0, len(cornerVol)) print frameLims[1] t = TITAN(distThresh=5) for aVol in cornerVol: t.TrackStep(aVol) t.finalize() tracks = t.tracks falarms = [] CleanupTracks(tracks, falarms)
def main(args): if args.bw_mode: BW_mode() if len(args.trackFiles) == 0: print "WARNING: No trackFiles given!" if args.trackTitles is None: args.trackTitles = args.trackFiles else: if len(args.trackTitles) != len(args.trackFiles): raise ValueError("The number of TITLEs do not match the" " number of TRACKFILEs.") if args.statName is not None and args.statLonLat is None: statData = ByName(args.statName)[0] args.statLonLat = (statData['LON'], statData['LAT']) if args.layout is None: args.layout = (1, len(args.trackFiles)) if args.figsize is None: args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) trackerData = [ FilterMHTTracks(*ReadTracks(trackFile)) for trackFile in args.trackFiles ] polyData = [ _load_verts(f, tracks + falarms) for f, (tracks, falarms) in zip(polyfiles, trackerData) ] if args.statLonLat is not None: for aTracker in trackerData: CoordinateTransform(aTracker[0] + aTracker[1], args.statLonLat[0], args.statLonLat[1]) for polys in polyData: CoordinateTrans_lists(polys, args.statLonLat[0], args.statLonLat[1]) if args.simTagFiles is None: args.simTagFiles = [None] multiTags = [ ReadSimTagFile(fname) if fname is not None else None for fname in args.simTagFiles ] if len(trackerData) > len(multiTags): # Very rudimentary broadcasting of multiTags to match trackerData tagMult = max(int(len(trackerData) // len(multiTags)), 1) multiTags = multiTags * tagMult theFig = plt.figure(figsize=args.figsize) grid = AxesGrid(theFig, 111, nrows_ncols=args.layout, aspect=False, share_all=True, axes_pad=0.45) showMap = (args.statLonLat is not None and args.displayMap) # Can only do this if all other data being displayed will be in # lon/lat coordinates if args.radarFile is not None and args.statLonLat is not None: if len(args.radarFile) > 1 and args.endFrame is not None: args.radarFile = args.radarFile[args.endFrame] else: args.radarFile = args.radarFile[-1] data = LoadRastRadar(args.radarFile) for ax in grid: MakeReflectPPI(data['vals'][0], data['lats'], data['lons'], meth='pcmesh', ax=ax, colorbar=False, axis_labels=False, zorder=0, alpha=0.6) MakeTrackPlots(grid, trackerData, args.trackTitles, showMap, endFrame=args.endFrame, tail=args.tail, fade=args.fade, multiTags=multiTags, tag_filters=args.filters) for ax, verts in zip(grid, polyData): _to_polygons(verts[args.endFrame:args.endFrame + 1], ax) if args.xlims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_xlim(args.xlims) if args.ylims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_ylim(args.ylims) if args.saveImgFile is not None: theFig.savefig(args.saveImgFile) if args.doShow: plt.show()
def main(args): for afile in args.trackfiles: tracks, falarms = FilterMHTTracks(*ReadTracks(afile)) trackSegs, trkIndices = CreateSegments(tracks, retindices=True) flatDists_x = np.array( [np.diff(aSeg['xLocs']) for aSeg in trackSegs if len(aSeg) > 1]) flatDists_y = np.array( [np.diff(aSeg['yLocs']) for aSeg in trackSegs if len(aSeg) > 1]) flatDists = np.hypot(flatDists_x, flatDists_y) flatdeltaFrames = np.array([ np.diff(aSeg['frameNums']) for aSeg in trackSegs if len(aSeg) > 1 ]) flatspeeds = flatDists / flatdeltaFrames dists = defaultdict(float) lens = defaultdict(int) for segDist, segDelta, trkIndex in zip(flatDists, flatdeltaFrames, trkIndices): dists[trkIndex] += segDist lens[trkIndex] += segDelta trkDensity = defaultdict(int) for seg in trackSegs: trkDensity[seg['frameNums'][0]] += 1 falrmDensity = defaultdict(int) for seg in falarms: falrmDensity[seg['frameNums'][0]] += 1 # Convert to a list dists = [dists[trkIndex] for trkIndex in xrange(len(tracks))] lens = [lens[trkIndex] for trkIndex in xrange(len(tracks))] startFrames = [np.min(aTrack['frameNums']) for aTrack in tracks] startDensity = defaultdict(int) for f in startFrames: startDensity[f] += 1 endFrames = [np.max(aTrack['frameNums']) for aTrack in tracks] endDensity = defaultdict(int) for f in endFrames: endDensity[f] += 1 startXs = [aTrack['xLocs'][0] for aTrack in tracks] startYs = [aTrack['yLocs'][0] for aTrack in tracks] endXs = [aTrack['xLocs'][-1] for aTrack in tracks] endYs = [aTrack['yLocs'][-1] for aTrack in tracks] devs = [ np.std( np.hypot( np.diff(trk['xLocs']) / np.diff(trk['frameNums']), np.diff(trk['yLocs']) / np.diff(trk['frameNums']))) for trk in tracks if len(trk) > 2 ] xLims, yLims, fLims = DomainFromTracks(tracks, falarms) frames = np.arange(fLims[0], fLims[1] + 1) trkDensity = [trkDensity[frame] for frame in frames] falrmDensity = [falrmDensity[frame] for frame in frames] startDensity = [startDensity[frame] for frame in frames] endDensity = [endDensity[frame] for frame in frames] plt.figure() plt.plot(frames, trkDensity, label='tracks') plt.plot(frames, falrmDensity, label="falarms") plt.plot(frames, startDensity, '--', label="starts") plt.plot(frames, endDensity, '--', label="ends") plt.legend() plt.xlabel('Frame Index') plt.ylabel('# of detections') print print afile, ':' print "Track Cnt: %4d" % len(tracks) print "False Alarm Cnt: %4d" % len(falarms) print "Track SegCnt:", len(trackSegs) print "Limits: X", xLims, " Y", yLims, " Frames", fLims print print "Max Length: %4d Frames, %8.3f" % (np.max(lens), np.max(dists)) print "Mean Length: %4d Frames, %8.3f" % (np.mean(lens), np.mean(dists)) print "Median Len : %4d Frames, %8.3f" % (np.median(lens), np.median(dists)) print "Min Length: %4d Frames, %8.3f" % (np.min(lens), np.min(dists)) print print "Max StdDev: %8.3f" % np.max(devs) print "Mean StdDev: %8.3f" % np.mean(devs) print "Median Dev: %8.3f" % np.median(devs) print "Min StdDev: %8.3f" % np.min(devs) print for name, func in zip(["Max ", "Mean ", "Median", "Min "], [np.max, np.mean, np.median, np.min]): print name, ("Start: X %8.3f Y %8.3f Frame %4d" % (func(startXs), func(startYs), func(startFrames))) print(" End: X %8.3f Y %8.3f Frame %4d" % (func(endXs), func(endYs), func(endFrames))) print print "Max Frame-to-Frame Dist: %4d Frames, %8.3f" % \ (np.max(flatdeltaFrames), np.max(flatDists)) print "Mean Frame-to-Frame Dist: %4d Frames, %8.3f" % \ (np.mean(flatdeltaFrames), np.mean(flatDists)) print "Med Frame-to-Frame Dist: %4d Frames, %8.3f" % \ (np.median(flatdeltaFrames), np.median(flatDists)) print "Min Frame-to-Frame Dist: %4d Frames, %8.3f" % \ (np.min(flatdeltaFrames), np.min(flatDists)) print "Speed:", flatspeeds.min(), flatspeeds.mean(), flatspeeds.max() plt.show()
def main(args): if args.bw_mode: BW_mode() if len(args.trackFiles) == 0: print "WARNING: No trackFiles given!" if len(args.truthTrackFile) == 0: print "WARNING: No truth trackFiles given!" if args.trackTitles is None: args.trackTitles = args.trackFiles else: if len(args.trackTitles) != len(args.trackFiles): raise ValueError("The number of TITLEs does not match the number" " of TRACKFILEs") if args.statName is not None and args.statLonLat is None: statData = ByName(args.statName)[0] args.statLonLat = (statData['LON'], statData['LAT']) if args.layout is None: args.layout = (1, max(len(args.trackFiles), len(args.truthTrackFile))) if args.figsize is None: args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) if args.simTagFiles is None: args.simTagFiles = [] trackerData = [ FilterMHTTracks(*ReadTracks(trackFile)) for trackFile in args.trackFiles ] truthData = [ FilterMHTTracks(*ReadTracks(trackFile)) for trackFile in args.truthTrackFile ] multiTags = [ReadSimTagFile(fname) for fname in args.simTagFiles] if len(multiTags) == 0: multiTags = [None] if args.statLonLat is not None: for aTracker in trackerData + truthData: CoordinateTransform(aTracker[0] + aTracker[1], args.statLonLat[0], args.statLonLat[1]) if len(trackerData) != len(truthData): # Basic broadcasting needed! if len(truthData) > len(trackerData): # Need to extend track data to match with the number of truth sets if len(truthData) % len(trackerData) != 0: raise ValueError("Can't extend TRACKFILE list to match with" " the TRUTHFILE list!") else: # Need to extend truth sets to match with the number of track data if len(trackerData) % len(truthData) != 0: raise ValueError("Can't extend TRUTHFILE list to match with" " the TRACKFILE list!") trkMult = max(int(len(truthData) // len(trackerData)), 1) trthMult = max(int(len(trackerData) // len(truthData)), 1) trackerData = trackerData * trkMult truthData = truthData * trthMult tagMult = max(int(len(truthData) // len(multiTags)), 1) multiTags = multiTags * tagMult args.trackTitles = args.trackTitles * trkMult theFig = plt.figure(figsize=args.figsize) grid = AxesGrid(theFig, 111, nrows_ncols=args.layout, aspect=False, share_all=True, axes_pad=0.45) showMap = (args.statLonLat is not None and args.displayMap) if args.radarFile is not None and args.statLonLat is not None: if len(args.radarFile) > 1 and args.endFrame is not None: args.radarFile = args.radarFile[args.endFrame] else: args.radarFile = args.radarFile[-1] data = LoadRastRadar(args.radarFile) for ax in grid: MakeReflectPPI(data['vals'][0], data['lats'], data['lons'], meth='pcmesh', ax=ax, colorbar=False, axis_labels=False, zorder=0, alpha=0.6) MakeComparePlots(grid, trackerData, truthData, args.trackTitles, showMap, endFrame=args.endFrame, tail=args.tail, fade=args.fade, multiTags=multiTags, tag_filters=args.filters) if args.xlims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_xlim(args.xlims) if args.ylims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_ylim(args.ylims) if args.saveImgFile is not None: theFig.savefig(args.saveImgFile) if args.doShow: plt.show()