NCTCMumbai's picture
Upload 2571 files
0b8359d
raw
history blame
4.71 kB
# Copyright 2018 The TensorFlow Authors All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Utility functions for evaluations."""
import numpy as np
import PIL
import tensorflow as tf
pascal_colormap = [
0, 0, 0,
0.5020, 0, 0,
0, 0.5020, 0,
0.5020, 0.5020, 0,
0, 0, 0.5020,
0.5020, 0, 0.5020,
0, 0.5020, 0.5020,
0.5020, 0.5020, 0.5020,
0.2510, 0, 0,
0.7529, 0, 0,
0.2510, 0.5020, 0,
0.7529, 0.5020, 0,
0.2510, 0, 0.5020,
0.7529, 0, 0.5020,
0.2510, 0.5020, 0.5020,
0.7529, 0.5020, 0.5020,
0, 0.2510, 0,
0.5020, 0.2510, 0,
0, 0.7529, 0,
0.5020, 0.7529, 0,
0, 0.2510, 0.5020,
0.5020, 0.2510, 0.5020,
0, 0.7529, 0.5020,
0.5020, 0.7529, 0.5020,
0.2510, 0.2510, 0]
def save_segmentation_with_colormap(filename, img):
"""Saves a segmentation with the pascal colormap as expected for DAVIS eval.
Args:
filename: Where to store the segmentation.
img: A numpy array of the segmentation to be saved.
"""
if img.shape[-1] == 1:
img = img[..., 0]
# Save with colormap.
colormap = (np.array(pascal_colormap) * 255).round().astype('uint8')
colormap_image = PIL.Image.new('P', (16, 16))
colormap_image.putpalette(colormap)
pil_image = PIL.Image.fromarray(img.astype('uint8'))
pil_image_with_colormap = pil_image.quantize(palette=colormap_image)
with tf.gfile.GFile(filename, 'w') as f:
pil_image_with_colormap.save(f)
def save_embeddings(filename, embeddings):
with tf.gfile.GFile(filename, 'w') as f:
np.save(f, embeddings)
def calculate_iou(pred_labels, ref_labels):
"""Calculates the intersection over union for binary segmentation.
Args:
pred_labels: predicted segmentation labels.
ref_labels: reference segmentation labels.
Returns:
The IoU between pred_labels and ref_labels
"""
if ref_labels.any():
i = np.logical_and(pred_labels, ref_labels).sum()
u = np.logical_or(pred_labels, ref_labels).sum()
return i.astype('float') / u
else:
if pred_labels.any():
return 0.0
else:
return 1.0
def calculate_multi_object_miou_tf(pred_labels, ref_labels):
"""Calculates the mIoU for a batch of predicted and reference labels.
Args:
pred_labels: Int32 tensor of shape [batch, height, width, 1].
ref_labels: Int32 tensor of shape [batch, height, width, 1].
Returns:
The mIoU between pred_labels and ref_labels as float32 scalar tensor.
"""
def calculate_multi_object_miou(pred_labels_, ref_labels_):
"""Calculates the mIoU for predicted and reference labels in numpy.
Args:
pred_labels_: int32 np.array of shape [batch, height, width, 1].
ref_labels_: int32 np.array of shape [batch, height, width, 1].
Returns:
The mIoU between pred_labels_ and ref_labels_.
"""
assert len(pred_labels_.shape) == 4
assert pred_labels_.shape[3] == 1
assert pred_labels_.shape == ref_labels_.shape
ious = []
for pred_label, ref_label in zip(pred_labels_, ref_labels_):
ids = np.setdiff1d(np.unique(ref_label), [0])
if ids.size == 0:
continue
for id_ in ids:
iou = calculate_iou(pred_label == id_, ref_label == id_)
ious.append(iou)
if ious:
return np.cast['float32'](np.mean(ious))
else:
return np.cast['float32'](1.0)
miou = tf.py_func(calculate_multi_object_miou, [pred_labels, ref_labels],
tf.float32, name='calculate_multi_object_miou')
miou.set_shape(())
return miou
def calculate_multi_object_ious(pred_labels, ref_labels, label_set):
"""Calculates the intersection over union for binary segmentation.
Args:
pred_labels: predicted segmentation labels.
ref_labels: reference segmentation labels.
label_set: int np.array of object ids.
Returns:
float np.array of IoUs between pred_labels and ref_labels
for each object in label_set.
"""
# Background should not be included as object label.
return np.array([calculate_iou(pred_labels == label, ref_labels == label)
for label in label_set if label != 0])