Exemple #1
0
    def __init__(self, bagFilename):

        self.scriptPath = os.path.dirname(__file__)
        self.cameraImagePixBuf = None
        self.bagFilename = bagFilename
        self.lastImageGray = None

        # Read in sequence
        t1 = time.time()

        self.inputSequence = InputSequence(bagFilename)

        distractors = [
            Distractor(radius=24,
                       startPos=(25, 35),
                       endPos=(100, 100),
                       frequency=2.0),
            Distractor(radius=24,
                       startPos=(200, 200),
                       endPos=(150, 50),
                       frequency=0.25),
            Distractor(radius=24,
                       startPos=(188, 130),
                       endPos=(168, 258),
                       frequency=0.6),
            Distractor(radius=24,
                       startPos=(63, 94),
                       endPos=(170, 81),
                       frequency=1.5),
            Distractor(radius=24,
                       startPos=(40, 287),
                       endPos=(50, 197),
                       frequency=3.0)
        ]
        #self.inputSequence.addDistractorObjects( distractors )

        self.inputSequence.calculateOpticalFlow(self.OPTICAL_FLOW_BLOCK_WIDTH,
                                                self.OPTICAL_FLOW_BLOCK_HEIGHT,
                                                self.OPTICAL_FLOW_RANGE_WIDTH,
                                                self.OPTICAL_FLOW_RANGE_HEIGHT,
                                                self.OPTICAL_FLOW_METHOD)

        t2 = time.time()
        print 'Processing sequence took %0.3f ms' % ((t2 - t1) * 1000.0)

        # Resample sequence
        t1 = time.time()

        self.regularisedInputSequence = RegularisedInputSequence(
            self.inputSequence, self.SAMPLES_PER_SECOND)

        t2 = time.time()
        print 'Resampling took %0.3f ms' % ((t2 - t1) * 1000.0)

        t1 = time.time()

        self.crossCorrelatedSequence = CrossCorrelatedSequence(
            self.regularisedInputSequence, self.MAX_CORRELATION_LAG,
            self.COMBINATION_METHOD)

        t2 = time.time()
        print 'Correlation took %0.3f ms' % ((t2 - t1) * 1000.0)

        # Detect the input signal based on the correlation in the x and y axis
        self.inputSignalDetectedArray = \
            self.crossCorrelatedSequence.detectInputSequence( self.CORRELATION_THRESHOLD )

        # Build a histogram for the gripper
        self.gripperHistogram = cv.CreateHist([256 / 8, 256 / 8, 256 / 8],
                                              cv.CV_HIST_ARRAY, [(0, 255),
                                                                 (0, 255),
                                                                 (0, 255)], 1)

        firstImage = self.inputSequence.cameraImages[0]
        imageRGB = cv.CreateImageHeader(
            (firstImage.shape[1], firstImage.shape[0]), cv.IPL_DEPTH_8U, 3)
        cv.SetData(imageRGB, firstImage.data, firstImage.shape[1] * 3)

        r_plane = cv.CreateMat(imageRGB.height, imageRGB.width, cv.CV_8UC1)
        g_plane = cv.CreateMat(imageRGB.height, imageRGB.width, cv.CV_8UC1)
        b_plane = cv.CreateMat(imageRGB.height, imageRGB.width, cv.CV_8UC1)
        cv.Split(imageRGB, r_plane, g_plane, b_plane, None)
        planes = [r_plane, g_plane, b_plane]

        maskArray = np.zeros(shape=(imageRGB.height, imageRGB.width),
                             dtype=np.uint8)
        for rowIdx in range(self.inputSignalDetectedArray.shape[0]):
            for colIdx in range(self.inputSignalDetectedArray.shape[1]):

                if self.inputSignalDetectedArray[rowIdx, colIdx]:
                    rowStartIdx = rowIdx * self.OPTICAL_FLOW_BLOCK_HEIGHT
                    rowEndIdx = rowStartIdx + self.OPTICAL_FLOW_BLOCK_HEIGHT
                    colStartIdx = colIdx * self.OPTICAL_FLOW_BLOCK_WIDTH
                    colEndIdx = colStartIdx + self.OPTICAL_FLOW_BLOCK_WIDTH

                    maskArray[rowStartIdx:rowEndIdx,
                              colStartIdx:colEndIdx] = 255

        cv.CalcHist([cv.GetImage(i) for i in planes],
                    self.gripperHistogram,
                    0,
                    mask=cv.fromarray(maskArray))

        markerBuffer = MarkerBuffer.loadMarkerBuffer(
            self.scriptPath + self.GROUND_TRUTH_FILENAME)
        if markerBuffer == None:
            raise Exception("Unable to load marker buffer")

        self.rocCurve = GripperDetectorROCCurve(self.crossCorrelatedSequence,
                                                markerBuffer)

        # Create the matplotlib graph
        self.figure = Figure(figsize=(8, 6), dpi=72)
        self.axisX = self.figure.add_subplot(311)
        self.axisY = self.figure.add_subplot(312)
        self.axisROC = self.figure.add_subplot(313)

        self.canvas = None  # Wait for GUI to be created before creating canvas
        self.navToolbar = None

        # Setup the GUI
        builder = gtk.Builder()
        builder.add_from_file(self.scriptPath +
                              "/GUI/OpticalFlowExplorer.glade")

        self.dwgCameraImage = builder.get_object("dwgCameraImage")
        self.window = builder.get_object("winMain")
        self.vboxMain = builder.get_object("vboxMain")
        self.hboxWorkArea = builder.get_object("hboxWorkArea")
        self.adjTestPointX = builder.get_object("adjTestPointX")
        self.adjTestPointY = builder.get_object("adjTestPointY")
        self.adjTestPointX.set_upper(self.MAX_TEST_POINT_X)
        self.adjTestPointY.set_upper(self.MAX_TEST_POINT_Y)
        self.sequenceControls = builder.get_object("sequenceControls")
        self.sequenceControls.setNumFrames(len(
            self.inputSequence.cameraImages))
        self.sequenceControls.setOnFrameIdxChangedCallback(
            self.onSequenceControlsFrameIdxChanged)
        self.setFrameIdx(0)
        self.processOpticalFlowData()

        builder.connect_signals(self)

        updateLoop = self.update()
        gobject.idle_add(updateLoop.next)

        self.window.show()
        self.window.maximize()
def evaluateClassifier(markerFilename,
                       bagFilenames,
                       rocGraphFilename=None,
                       accuracyGraphFilename=None,
                       gaussianStdDev=0.0):
    '''Takes a list of bag files in as data for the classifier and evaluates
       the classifer against a ground truth marker file. Returns the average AUC
       and optimal threshold for the classifier.'''

    # Load in marker buffer for evaluating classifier
    markerBuffer = MarkerBuffer.loadMarkerBuffer(markerFilename)
    if markerBuffer == None:
        print "Error: Unable to load marker buffer -", markerFilename

    # Process each bag file in turn
    dataList = []
    for bagFilename in bagFilenames:
        print "Reading in bag file -", bagFilename
        inputSequence = InputSequence(bagFilename)

        if ADD_DISTRACTORS:
            distractors = [
                Distractor(radius=24,
                           startPos=(25, 35),
                           endPos=(100, 100),
                           frequency=2.0),
                Distractor(radius=24,
                           startPos=(200, 200),
                           endPos=(150, 50),
                           frequency=0.25),
                Distractor(radius=24,
                           startPos=(188, 130),
                           endPos=(168, 258),
                           frequency=0.6),
                Distractor(radius=24,
                           startPos=(63, 94),
                           endPos=(170, 81),
                           frequency=1.5),
                Distractor(radius=24,
                           startPos=(40, 287),
                           endPos=(50, 197),
                           frequency=3.0)
            ]
            inputSequence.addDistractorObjects(distractors)

        inputSequence.calculateOpticalFlow(OPTICAL_FLOW_BLOCK_WIDTH,
                                           OPTICAL_FLOW_BLOCK_HEIGHT,
                                           OPTICAL_FLOW_RANGE_WIDTH,
                                           OPTICAL_FLOW_RANGE_HEIGHT,
                                           OPTICAL_FLOW_METHOD)

        #print "Resampling data"
        regularisedInputSequence = RegularisedInputSequence(
            inputSequence, SAMPLES_PER_SECOND)
        if gaussianStdDev > 0.0:
            regularisedInputSequence.smoothOpticalFlow(gaussianStdDev)

        #print "Performing cross correlation"
        crossCorrelatedSequence = CrossCorrelatedSequence(
            regularisedInputSequence, MAX_CORRELATION_LAG, COMBINATION_METHOD)

        #print "Building ROC Curve"
        rocCurve = GripperDetectorROCCurve(crossCorrelatedSequence,
                                           markerBuffer)

        print "__AUC =", rocCurve.areaUnderCurve

        dataList.append(
            WorkingData(bagFilename, inputSequence, regularisedInputSequence,
                        crossCorrelatedSequence, rocCurve))

    # Average results
    if len(dataList) > 1:

        curveList = [data.rocCurve for data in dataList]
        averageROCCurve, varianceROCCurve = ROCCurve.averageROCCurves(
            curveList)

    else:

        averageROCCurve = dataList[0].rocCurve
        varianceROCCurve = None

    # Plot ROC Curve
    figureROC = Figure(figsize=(8, 6), dpi=72)
    canvasROC = FigureCanvas(figureROC)
    axisROC = figureROC.add_subplot(111)

    axisROC.plot(averageROCCurve.falsePositiveRates,
                 averageROCCurve.truePositiveRates)
    axisROC.set_xlabel('False Positive Rate')
    axisROC.set_ylabel('True Positive Rate')

    # Add error bars
    if varianceROCCurve != None:

        diffBetweenErrorBars = 0.025  #1.0/(NUM_ERROR_BARS)
        lastFPRValue = averageROCCurve.falsePositiveRates[0]

        errorFPR = []
        errorTPR = []
        errorErrFPR = []
        errorErrTPR = []
        for i in range(len(averageROCCurve.falsePositiveRates)):

            curFPRValue = averageROCCurve.falsePositiveRates[i]
            if abs(curFPRValue - lastFPRValue) >= diffBetweenErrorBars:
                lastFPRValue = curFPRValue

                errorFPR.append(averageROCCurve.falsePositiveRates[i])
                errorTPR.append(averageROCCurve.truePositiveRates[i])
                errorErrFPR.append(
                    math.sqrt(varianceROCCurve.falsePositiveRates[i]) * 2.571)
                errorErrTPR.append(
                    math.sqrt(varianceROCCurve.truePositiveRates[i]) * 2.571)

        axisROC.errorbar(errorFPR,
                         errorTPR,
                         yerr=errorErrTPR,
                         linestyle='None')
        #xerr=errorErrFPR, yerr=errorErrTPR, linestyle='None' )

        #print errorFPR
        #print errorTPR
        #print lastFPRValue, averageROCCurve.falsePositiveRates[ -1 ]

    axisROC.set_xlim(0.0, 1.0)
    axisROC.set_ylim(0.0, 1.0)

    # Plot accuracy
    figureAccuracy = Figure(figsize=(8, 6), dpi=72)
    canvasAccuracy = FigureCanvas(figureAccuracy)
    axisAccuracy = figureAccuracy.add_subplot(111)

    thresholds = averageROCCurve.calculateThresholds()
    axisAccuracy.plot(thresholds, averageROCCurve.accuracy)

    #for data in dataList:
    #    axisAccuracy.plot( thresholds, data.rocCurve.accuracy )

    # Add error bars
    if varianceROCCurve != None:

        diffBetweenErrorBars = 1.0 / (NUM_ERROR_BARS)
        lastThresholdValue = thresholds[0]

        errorThreshold = []
        errorAccuracy = []
        errorErrAccuracy = []
        for i in range(len(thresholds)):

            curThresholdValue = thresholds[i]
            if abs(curThresholdValue -
                   lastThresholdValue) >= diffBetweenErrorBars:
                lastThresholdValue = curThresholdValue

                errorThreshold.append(curThresholdValue)
                errorAccuracy.append(averageROCCurve.accuracy[i])
                errorErrAccuracy.append(
                    math.sqrt(varianceROCCurve.accuracy[i]) * 2.571)

        axisAccuracy.errorbar(errorThreshold,
                              errorAccuracy,
                              yerr=errorErrAccuracy,
                              linestyle='None')

    # Mark the threshold with the maximum accuracy
    maxAccuracyThreshold = thresholds[np.argsort(averageROCCurve.accuracy)[-1]]
    axisAccuracy.axvline(x=float(maxAccuracyThreshold), color='red')

    axisAccuracy.set_xlabel('Threshold')
    axisAccuracy.set_ylabel('Accuracy')

    # Save the graphs
    if rocGraphFilename != None:
        figureROC.savefig(rocGraphFilename)
    if accuracyGraphFilename != None:
        figureAccuracy.savefig(accuracyGraphFilename)

    return averageROCCurve.areaUnderCurve, maxAccuracyThreshold