aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/contrib/slim
diff options
context:
space:
mode:
authorGravatar A. Unique TensorFlower <gardener@tensorflow.org>2018-02-12 22:54:48 -0800
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-02-12 22:58:21 -0800
commitd9976e40c03eab6ed7a767ff7531d0b1aa870739 (patch)
tree62f480b254d163abc3d7370e300f83b67479aeed /tensorflow/contrib/slim
parenteec85cb5e4eac9764a34debccac0e70d37519b3d (diff)
1. Add image_ops.is_jpeg Op to decide if a input string is a jpeg string or not.
2. Change tfexample_decoder in slim/objection_detection to accept different JPEG decompression method. Defaults to ""/None which maps to a system-specific default. Currently valid values are ["INTEGER_FAST", "INTEGER_ACCURATE"]. The hint may be ignored (e.g., the internal jpeg library changes to a version that does not have that specific option.) PiperOrigin-RevId: 185486653
Diffstat (limited to 'tensorflow/contrib/slim')
-rw-r--r--tensorflow/contrib/slim/python/slim/data/tfexample_decoder.py31
1 files changed, 27 insertions, 4 deletions
diff --git a/tensorflow/contrib/slim/python/slim/data/tfexample_decoder.py b/tensorflow/contrib/slim/python/slim/data/tfexample_decoder.py
index 0544404e9e..b3b61e1dfe 100644
--- a/tensorflow/contrib/slim/python/slim/data/tfexample_decoder.py
+++ b/tensorflow/contrib/slim/python/slim/data/tfexample_decoder.py
@@ -349,7 +349,8 @@ class Image(ItemHandler):
shape=None,
channels=3,
dtype=dtypes.uint8,
- repeated=False):
+ repeated=False,
+ dct_method=''):
"""Initializes the image.
Args:
@@ -368,6 +369,11 @@ class Image(ItemHandler):
tf.decode_raw,
repeated: if False, decodes a single image. If True, decodes a
variable number of image strings from a 1D tensor of strings.
+ dct_method: An optional string. Defaults to empty string. It only takes
+ effect when image format is jpeg, used to specify a hint about the
+ algorithm used for jpeg decompression. Currently valid values
+ are ['INTEGER_FAST', 'INTEGER_ACCURATE']. The hint may be ignored, for
+ example, the jpeg library does not have that specific option.
"""
if not image_key:
image_key = 'image/encoded'
@@ -381,6 +387,7 @@ class Image(ItemHandler):
self._channels = channels
self._dtype = dtype
self._repeated = repeated
+ self._dct_method = dct_method
def tensors_to_item(self, keys_to_tensors):
"""See base class."""
@@ -406,9 +413,25 @@ class Image(ItemHandler):
A tensor that represents decoded image of self._shape, or
(?, ?, self._channels) if self._shape is not specified.
"""
+
def decode_image():
- """Decodes a png or jpg based on the headers."""
- return image_ops.decode_image(image_buffer, self._channels)
+ """Decodes a image based on the headers."""
+ return image_ops.decode_image(image_buffer, channels=self._channels)
+
+ def decode_jpeg():
+ """Decodes a jpeg image with specified '_dct_method'."""
+ return image_ops.decode_jpeg(
+ image_buffer, channels=self._channels, dct_method=self._dct_method)
+
+ def check_jpeg():
+ """Checks if an image is jpeg."""
+ # For jpeg, we directly use image_ops.decode_jpeg rather than decode_image
+ # in order to feed the jpeg specify parameter 'dct_method'.
+ return control_flow_ops.cond(
+ image_ops.is_jpeg(image_buffer),
+ decode_jpeg,
+ decode_image,
+ name='cond_jpeg')
def decode_raw():
"""Decodes a raw image."""
@@ -420,7 +443,7 @@ class Image(ItemHandler):
math_ops.equal(image_format, 'RAW')): decode_raw,
}
image = control_flow_ops.case(
- pred_fn_pairs, default=decode_image, exclusive=True)
+ pred_fn_pairs, default=check_jpeg, exclusive=True)
image.set_shape([None, None, self._channels])
if self._shape is not None: