Source code for menpofit.clm.expert.base

import warnings
import numpy as np

from menpo.feature import ndfeature
from menpofit.math.correlationfilter import mccf, imccf


@ndfeature
def probability_map(x, axes=(-2, -1)):
    r"""
    Generates the probability MAP of the image.

    Parameters
    ----------
    x : `menpo.image.Image` or subclass or `ndarray`
        The input image.
    axes : ``None`` or `int` or `tuple` of `int`, optional
        Axes along which the normalization is performed.

    Returns
    -------
    probability_map : `menpo.image.Image` or ``(C, X, Y, ..., Z)`` `ndarray`
        The probability MAP of the image.
    """
    x -= np.min(x, axis=axes, keepdims=True)
    total = np.sum(x, axis=axes, keepdims=True)
    nonzero = total > 0
    if np.any(~nonzero):
        warnings.warn('some of x axes have 0 variance - uniform probability '
                      'maps are used them.')
        x[nonzero] /= total[nonzero]
        x[~nonzero] = 1 / np.prod(axes)
    else:
        x /= total
    return x


[docs]class IncrementalCorrelationFilterThinWrapper(object): r""" Wrapper class for defining an Incremental Correlation Filter. Parameters ---------- cf_callable : `callable`, optional The correlation filter function. Possible options are: ============ =========================================== Class Method ============ =========================================== :map:`mccf` Multi-Channel Correlation Filter :map:`mosse` Minimum Output Sum of Squared Errors Filter ============ =========================================== icf_callable : `callable`, optional The incremental correlation filter function. Possible options are: ============= ======================================================= Class Method ============= ======================================================= :map:`imccf` Incremental Multi-Channel Correlation Filter :map:`imosse` Incremental Minimum Output Sum of Squared Errors Filter ============= ======================================================= """ def __init__(self, cf_callable=mccf, icf_callable=imccf): self.cf_callable = cf_callable self.icf_callable = icf_callable
[docs] def increment(self, A, B, n_x, Z, t): r""" Method that trains the correlation filter. Parameters ---------- A : ``(N,)`` `ndarray` The current auto-correlation array, where ``N = (patch_h+response_h-1) * (patch_w+response_w-1) * n_channels`` B : ``(N, N)`` `ndarray` The current cross-correlation array, where ``N = (patch_h+response_h-1) * (patch_w+response_w-1) * n_channels`` n_x : `int` The current number of images. Z : `list` or ``(n_images, n_channels, patch_h, patch_w)`` `ndarray` The training images (patches). If `list`, then it consists of `n_images` ``(n_channels, patch_h, patch_w)`` `ndarray` members. t : ``(1, response_h, response_w)`` `ndarray` The desired response. Returns ------- correlation_filter : ``(n_channels, response_h, response_w)`` `ndarray` The learned correlation filter. auto_correlation : ``(N,)`` `ndarray` The auto-correlation array, where ``N = (patch_h+response_h-1) * (patch_w+response_w-1) * n_channels`` cross_correlation : ``(N, N)`` `ndarray` The cross-correlation array, where ``N = (patch_h+response_h-1) * (patch_w+response_w-1) * n_channels`` """ # Turn list of X into ndarray if isinstance(Z, list): Z = np.asarray(Z) return self.icf_callable(A, B, n_x, Z, t)
[docs] def train(self, X, t): r""" Method that trains the correlation filter. Parameters ---------- X : `list` or ``(n_images, n_channels, patch_h, patch_w)`` `ndarray` The training images (patches). If `list`, then it consists of `n_images` ``(n_channels, patch_h, patch_w)`` `ndarray` members. t : ``(1, response_h, response_w)`` `ndarray` The desired response. Returns ------- correlation_filter : ``(n_channels, response_h, response_w)`` `ndarray` The learned correlation filter. auto_correlation : ``(N,)`` `ndarray` The auto-correlation array, where ``N = (patch_h+response_h-1) * (patch_w+response_w-1) * n_channels`` cross_correlation : ``(N, N)`` `ndarray` The cross-correlation array, where ``N = (patch_h+response_h-1) * (patch_w+response_w-1) * n_channels`` """ # Turn list of X into ndarray if isinstance(X, list): X = np.asarray(X) # Return linear svm filter and bias return self.cf_callable(X, t)