Example #1
0
def analyzeTranslationInvariance():
    # setup model
    model = Model(open(Constants.fnCharList).read(),
                  DecoderType.BestPath,
                  must_restore=True)

    # read image and specify ground-truth text
    img = cv2.imread(Constants.fnAnalyze, cv2.IMREAD_GRAYSCALE)
    (w, h) = img.shape
    assert Model.imgSize[1] == w

    imgList = []
    for dy in range(Model.imgSize[0] - h + 1):
        targetImg = np.ones((Model.imgSize[1], Model.imgSize[0])) * 255
        targetImg[:, dy:h + dy] = img
        imgList.append(preprocess(targetImg, Model.imgSize))

    # put images and gt texts into batch
    batch = Batch([Constants.gtText] * len(imgList), imgList)

    # compute probabilities
    (texts, probs) = model.infer_batch(batch,
                                       calc_probability=True,
                                       probability_of_gt=True)

    # save results to file
    f = open(Constants.fnTranslationInvarianceTexts, 'wb')
    pickle.dump(texts, f)
    f.close()
    np.save(Constants.fnTranslationInvariance, probs)
Example #2
0
def analyzePixelRelevance():
    """simplified implementation of paper:
	Zintgraf et al -
	Visualizing Deep Neural Network Decisions: Prediction Difference Analysis"""

    # setup model
    model = Model(open(Constants.fnCharList).read(),
                  DecoderType.BestPath,
                  must_restore=True)

    # read image and specify ground-truth text
    img = cv2.imread(Constants.fnAnalyze, cv2.IMREAD_GRAYSCALE)
    (w, h) = img.shape
    assert Model.imgSize[1] == w

    # compute probability of gt text in original image
    batch = Batch([Constants.gtText], [preprocess(img, Model.imgSize)])
    (_, probs) = model.infer_batch(batch,
                                   calc_probability=True,
                                   probability_of_gt=True)
    origProb = probs[0]

    grayValues = [0, 63, 127, 191, 255]
    if Constants.distribution == 'histogram':
        bins = [0, 31, 95, 159, 223, 255]
        (hist, _) = np.histogram(img, bins=bins)
        pixelProb = hist / sum(hist)
    elif Constants.distribution == 'uniform':
        pixelProb = [1.0 / len(grayValues) for _ in grayValues]
    else:
        raise Exception('unknown value for Constants.distribution')

    # iterate over all pixels in image
    pixelRelevance = np.zeros(img.shape, np.float32)
    for x in range(w):
        for y in range(h):

            # try a subset of possible grayvalues of pixel (x,y)
            imgsMarginalized = []
            for g in grayValues:
                imgChanged = copy.deepcopy(img)
                imgChanged[x, y] = g
                imgsMarginalized.append(preprocess(imgChanged, Model.imgSize))

            # put them all into one batch
            batch = Batch([Constants.gtText] * len(imgsMarginalized),
                          imgsMarginalized)

            # compute probabilities
            (_, probs) = model.infer_batch(batch,
                                           calc_probability=True,
                                           probability_of_gt=True)

            # marginalize over pixel value (assume uniform distribution)
            margProb = sum(
                [probs[i] * pixelProb[i] for i in range(len(grayValues))])

            pixelRelevance[x, y] = weightOfEvidence(origProb, margProb)

            print(x, y, pixelRelevance[x, y], origProb, margProb)

    np.save(Constants.fnPixelRelevance, pixelRelevance)