2017-06-15 3 views
1

Derzeit bin ich mit tf.image.per_image_standardization(image) aber es scheint, dass es viel länger dauert die folgende Methode konvergieren als die Verwendung von:Wie sollte ich das Bild im Tensorflow normalisieren?

image = image - image_mean 

wo image_mean = [meanR, meanG, meanB] des Datensatzes. Was mache ich falsch?

Antwort

0

Die Funktion führt einen anderen Prozess aus. Sie subtrahieren nur den Mittelwert, aber tf.image.per_image_standardization() auch dividiert durch die Varianz. Vom API docs:

This op computes (x - mean)/adjusted_stddev, where mean is the average of all values in image, and adjusted_stddev = max(stddev, 1.0/sqrt(image.NumElements())). 

Hier ist ihre vollständige Umsetzung von here:

def per_image_standardization(image): 
    """Linearly scales `image` to have zero mean and unit norm. 
    This op computes `(x - mean)/adjusted_stddev`, where `mean` is the average 
    of all values in image, and 
    `adjusted_stddev = max(stddev, 1.0/sqrt(image.NumElements()))`. 
    `stddev` is the standard deviation of all values in `image`. It is capped 
    away from zero to protect against division by 0 when handling uniform images. 
    Args: 
    image: 3-D tensor of shape `[height, width, channels]`. 
    Returns: 
    The standardized image with same shape as `image`. 
    Raises: 
    ValueError: if the shape of 'image' is incompatible with this function. 
    """ 
    image = ops.convert_to_tensor(image, name='image') 
    _Check3DImage(image, require_static=False) 
    num_pixels = math_ops.reduce_prod(array_ops.shape(image)) 

    image = math_ops.cast(image, dtype=dtypes.float32) 
    image_mean = math_ops.reduce_mean(image) 

    variance = (math_ops.reduce_mean(math_ops.square(image)) - 
       math_ops.square(image_mean)) 
    variance = gen_nn_ops.relu(variance) 
    stddev = math_ops.sqrt(variance) 

    # Apply a minimum normalization that protects us against uniform images. 
    min_stddev = math_ops.rsqrt(math_ops.cast(num_pixels, dtypes.float32)) 
    pixel_value_scale = math_ops.maximum(stddev, min_stddev) 
    pixel_value_offset = image_mean 

    image = math_ops.subtract(image, pixel_value_offset) 
    image = math_ops.div(image, pixel_value_scale) 
    return image 
Verwandte Themen