def main():
    glassLabel = 255
    thicknessForEvaluation = 20
    objects=('bank', 'bottle', 'bucket', 'glass', 'wineglass')
    basePath = '/media/2Tb/transparentBases/fixedOnTable/base/'

    base = utils.TODBase(basePath, objects)
    patchSizes = (5, 10, 20, 40, 100, 200, 400)
    fks = (10, 20, 50, 100, 200, 400, 800, 1600)

    allSamples = base.getSamples()
    evaluator = utils.Evaluator(len(patchSizes))
#    evaluator = utils.Evaluator(len(fks))
    for sample in allSamples:
        print sample.imageFilename
 
        groundTruthMask = sample.getGlassMask()
        if (groundTruthMask == None):
            continue
        [groundTruthDT, groundTruthEdgelsCount] = utils.mask2dtAndEdgelsCount(groundTruthMask)
        glassMask = groundTruthMask.copy()
        glassContours, hierarchy = cv2.findContours(glassMask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
        glassContoursImage = np.zeros(glassMask.shape, np.uint8)
        cv2.drawContours(glassContoursImage, glassContours, -1, (255), thicknessForEvaluation)

        image = sample.getImage()
        for idx, size in enumerate(patchSizes):
            segmentation = computeVeksler(image, size)
#        for idx, k in enumerate(fks):
#            segmentation = computeFelzenszwalb(image, k)
            minSegmentation = cv2.erode(segmentation.astype(np.float32), None)
            maxSegmentation = cv2.dilate(segmentation.astype(np.float32), None)
            boundaries = 255 * (maxSegmentation - minSegmentation != 0).astype(np.uint8)
            boundaries[glassContoursImage == 0] = 0
            boundariesEdgelsCount = len(np.nonzero(boundaries == 255)[0])
            boundariesDT = cv2.distanceTransform(~boundaries, cv2.cv.CV_DIST_L1, cv2.cv.CV_DIST_MASK_PRECISE)

            [recallEdgels, precisionEdgels] = utils.computeRecallPrecisionEdgels(groundTruthDT, boundariesDT)
            evaluator.addObservation(idx, recallEdgels, groundTruthEdgelsCount, precisionEdgels, boundariesEdgelsCount)
        evaluator.computeStatistics()
        evaluator.printStatistics()


    evaluator.plot('veksler')
#    evaluator.plot('felz')
    utils.plt.show()
        groundTruthFilename = imageFilename.replace(
            '/image_', '/' + groundTruthPrefix + '_')
        testFolder = imageFilename.replace('/image_' + fullImageIndex + '.png',
                                           '/')

        call([
            segmentImage, testFolder, fullImageIndex, classifierFilename,
            segmentationListFilename, propagationScalingsList, algorithmName
        ])

        groundTruth = cv2.imread(groundTruthFilename,
                                 cv2.CV_LOAD_IMAGE_GRAYSCALE)
        glassLabel = 255
        groundTruthGlassMask = (groundTruth == glassLabel).astype(np.uint8)
        [groundTruthDT, groundTruthEdgelsCount
         ] = utils.mask2dtAndEdgelsCount(groundTruthGlassMask)

        for (index, temporaryFile) in enumerate(segmentationTemporaryFiles):
            segmentationImage = cv2.imread(temporaryFile[1],
                                           cv2.CV_LOAD_IMAGE_GRAYSCALE)
            [segmentationImageDT, segmentationImageEdgelsCount
             ] = utils.mask2dtAndEdgelsCount(segmentationImage)
            [recallEdgelsCount, precisionEdgelsCount
             ] = utils.computeRecallPrecisionEdgels(groundTruthDT,
                                                    segmentationImageDT)

            trueGlassArea = len(np.nonzero(groundTruth == glassLabel)[0])
            predictedGlassArea = len(
                np.nonzero(segmentationImage == glassLabel)[0])
            validPredictedGlassArea = len(
                np.nonzero(
        if (match == None):
            match = re.search('_(0000(0))\.', imageFilename)
        assert match != None, 'Cannot parse an image index'

        fullImageIndex = match.group(1)
        imageIndex = match.group(2)

        groundTruthFilename = imageFilename.replace('/image_', '/' + groundTruthPrefix + '_')
        testFolder = imageFilename.replace('/image_' + fullImageIndex + '.png', '/')

        call([segmentImage, testFolder, fullImageIndex, classifierFilename, segmentationListFilename, propagationScalingsList, algorithmName])

        groundTruth = cv2.imread(groundTruthFilename, cv2.CV_LOAD_IMAGE_GRAYSCALE)
        glassLabel = 255
        groundTruthGlassMask = (groundTruth == glassLabel).astype(np.uint8)
        [groundTruthDT, groundTruthEdgelsCount] = utils.mask2dtAndEdgelsCount(groundTruthGlassMask)

        for (index, temporaryFile) in enumerate(segmentationTemporaryFiles):
            segmentationImage = cv2.imread(temporaryFile[1], cv2.CV_LOAD_IMAGE_GRAYSCALE)
            [segmentationImageDT, segmentationImageEdgelsCount] = utils.mask2dtAndEdgelsCount(segmentationImage)
            [recallEdgelsCount, precisionEdgelsCount] = utils.computeRecallPrecisionEdgels(groundTruthDT, segmentationImageDT)

            trueGlassArea = len(np.nonzero(groundTruth == glassLabel)[0])
            predictedGlassArea = len(np.nonzero(segmentationImage == glassLabel)[0])
            validPredictedGlassArea = len(np.nonzero(np.logical_and(groundTruth == glassLabel, segmentationImage == groundTruth))[0])

            boundaryEvaluator.addObservation(index, recallEdgelsCount, groundTruthEdgelsCount, precisionEdgelsCount, segmentationImageEdgelsCount)
            areaEvaluator.addObservation(index, validPredictedGlassArea, trueGlassArea, validPredictedGlassArea, predictedGlassArea)

        areaEvaluator.computeStatistics()
        areaEvaluator.printStatistics()