|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Prepares the data used for DeepLab training/evaluation.""" |
|
import tensorflow as tf |
|
from deeplab.core import feature_extractor |
|
from deeplab.core import preprocess_utils |
|
|
|
|
|
|
|
|
|
_PROB_OF_FLIP = 0.5 |
|
|
|
|
|
def preprocess_image_and_label(image, |
|
label, |
|
crop_height, |
|
crop_width, |
|
min_resize_value=None, |
|
max_resize_value=None, |
|
resize_factor=None, |
|
min_scale_factor=1., |
|
max_scale_factor=1., |
|
scale_factor_step_size=0, |
|
ignore_label=255, |
|
is_training=True, |
|
model_variant=None): |
|
"""Preprocesses the image and label. |
|
|
|
Args: |
|
image: Input image. |
|
label: Ground truth annotation label. |
|
crop_height: The height value used to crop the image and label. |
|
crop_width: The width value used to crop the image and label. |
|
min_resize_value: Desired size of the smaller image side. |
|
max_resize_value: Maximum allowed size of the larger image side. |
|
resize_factor: Resized dimensions are multiple of factor plus one. |
|
min_scale_factor: Minimum scale factor value. |
|
max_scale_factor: Maximum scale factor value. |
|
scale_factor_step_size: The step size from min scale factor to max scale |
|
factor. The input is randomly scaled based on the value of |
|
(min_scale_factor, max_scale_factor, scale_factor_step_size). |
|
ignore_label: The label value which will be ignored for training and |
|
evaluation. |
|
is_training: If the preprocessing is used for training or not. |
|
model_variant: Model variant (string) for choosing how to mean-subtract the |
|
images. See feature_extractor.network_map for supported model variants. |
|
|
|
Returns: |
|
original_image: Original image (could be resized). |
|
processed_image: Preprocessed image. |
|
label: Preprocessed ground truth segmentation label. |
|
|
|
Raises: |
|
ValueError: Ground truth label not provided during training. |
|
""" |
|
if is_training and label is None: |
|
raise ValueError('During training, label must be provided.') |
|
if model_variant is None: |
|
tf.logging.warning('Default mean-subtraction is performed. Please specify ' |
|
'a model_variant. See feature_extractor.network_map for ' |
|
'supported model variants.') |
|
|
|
|
|
original_image = image |
|
|
|
processed_image = tf.cast(image, tf.float32) |
|
|
|
if label is not None: |
|
label = tf.cast(label, tf.int32) |
|
|
|
|
|
if min_resize_value or max_resize_value: |
|
[processed_image, label] = ( |
|
preprocess_utils.resize_to_range( |
|
image=processed_image, |
|
label=label, |
|
min_size=min_resize_value, |
|
max_size=max_resize_value, |
|
factor=resize_factor, |
|
align_corners=True)) |
|
|
|
original_image = tf.identity(processed_image) |
|
|
|
|
|
if is_training: |
|
scale = preprocess_utils.get_random_scale( |
|
min_scale_factor, max_scale_factor, scale_factor_step_size) |
|
processed_image, label = preprocess_utils.randomly_scale_image_and_label( |
|
processed_image, label, scale) |
|
processed_image.set_shape([None, None, 3]) |
|
|
|
|
|
image_shape = tf.shape(processed_image) |
|
image_height = image_shape[0] |
|
image_width = image_shape[1] |
|
|
|
target_height = image_height + tf.maximum(crop_height - image_height, 0) |
|
target_width = image_width + tf.maximum(crop_width - image_width, 0) |
|
|
|
|
|
mean_pixel = tf.reshape( |
|
feature_extractor.mean_pixel(model_variant), [1, 1, 3]) |
|
processed_image = preprocess_utils.pad_to_bounding_box( |
|
processed_image, 0, 0, target_height, target_width, mean_pixel) |
|
|
|
if label is not None: |
|
label = preprocess_utils.pad_to_bounding_box( |
|
label, 0, 0, target_height, target_width, ignore_label) |
|
|
|
|
|
if is_training and label is not None: |
|
processed_image, label = preprocess_utils.random_crop( |
|
[processed_image, label], crop_height, crop_width) |
|
|
|
processed_image.set_shape([crop_height, crop_width, 3]) |
|
|
|
if label is not None: |
|
label.set_shape([crop_height, crop_width, 1]) |
|
|
|
if is_training: |
|
|
|
processed_image, label, _ = preprocess_utils.flip_dim( |
|
[processed_image, label], _PROB_OF_FLIP, dim=1) |
|
|
|
return original_image, processed_image, label |
|
|