Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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()
Пример #5
0
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()
Пример #6
0
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()