+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+from __future__ import print_function
+from __future__ import division
+
+import tensorflow as tf
+
+import numpy as np
+
+
+def max_length_limitation(length, length_limitation):
+ return tf.cond(tf.less(length, length_limitation),
+ true_fn=lambda: length,
+ false_fn=lambda: length_limitation)
+
+def short_side_resize(img_tensor, gtboxes_and_label, target_shortside_len, length_limitation=1200):
+ '''
+
+ :param img_tensor:[h, w, c], gtboxes_and_label:[-1, 5]. gtboxes: [xmin, ymin, xmax, ymax]
+ :param target_shortside_len:
+ :param length_limitation: set max length to avoid OUT OF MEMORY
+ :return:
+ '''
+ img_h, img_w = tf.shape(img_tensor)[0], tf.shape(img_tensor)[1]
+ new_h, new_w = tf.cond(tf.less(img_h, img_w),
+ true_fn=lambda: (target_shortside_len,
+ max_length_limitation(target_shortside_len * img_w // img_h, length_limitation)),
+ false_fn=lambda: (max_length_limitation(target_shortside_len * img_h // img_w, length_limitation),
+ target_shortside_len))
+
+ img_tensor = tf.expand_dims(img_tensor, axis=0)
+ img_tensor = tf.image.resize_bilinear(img_tensor, [new_h, new_w])
+
+ xmin, ymin, xmax, ymax, label = tf.unstack(gtboxes_and_label, axis=1)
+
+ new_xmin, new_ymin = xmin * new_w // img_w, ymin * new_h // img_h
+ new_xmax, new_ymax = xmax * new_w // img_w, ymax * new_h // img_h
+ img_tensor = tf.squeeze(img_tensor, axis=0) # ensure image tensor rank is 3
+
+ return img_tensor, tf.transpose(tf.stack([new_xmin, new_ymin, new_xmax, new_ymax, label], axis=0))
+
+
+def short_side_resize_for_inference_data(img_tensor, target_shortside_len, length_limitation=1200, is_resize=True):
+ if is_resize:
+ img_h, img_w = tf.shape(img_tensor)[0], tf.shape(img_tensor)[1]
+
+ new_h, new_w = tf.cond(tf.less(img_h, img_w),
+ true_fn=lambda: (target_shortside_len,
+ max_length_limitation(target_shortside_len * img_w // img_h, length_limitation)),
+ false_fn=lambda: (max_length_limitation(target_shortside_len * img_h // img_w, length_limitation),
+ target_shortside_len))
+
+ img_tensor = tf.expand_dims(img_tensor, axis=0)
+ img_tensor = tf.image.resize_bilinear(img_tensor, [new_h, new_w])
+
+ img_tensor = tf.squeeze(img_tensor, axis=0) # ensure image tensor rank is 3
+ return img_tensor
+
+def flip_left_to_right(img_tensor, gtboxes_and_label):
+
+ h, w = tf.shape(img_tensor)[0], tf.shape(img_tensor)[1]
+
+ img_tensor = tf.image.flip_left_right(img_tensor)
+
+ xmin, ymin, xmax, ymax, label = tf.unstack(gtboxes_and_label, axis=1)
+ new_xmax = w - xmin
+ new_xmin = w - xmax
+
+ return img_tensor, tf.transpose(tf.stack([new_xmin, ymin, new_xmax, ymax, label], axis=0))
+
+def random_flip_left_right(img_tensor, gtboxes_and_label):
+ img_tensor, gtboxes_and_label= tf.cond(tf.less(tf.random_uniform(shape=[], minval=0, maxval=1), 0.5),
+ lambda: flip_left_to_right(img_tensor, gtboxes_and_label),
+ lambda: (img_tensor, gtboxes_and_label))
+
+ return img_tensor, gtboxes_and_label
+
+
+