Ejemplo n.º 1
0
        def _cumsum_gradient(score_map, box):
            b, n, m, c = utils.get_tensor_shape(score_map)
            _, p, _ = utils.get_tensor_shape(box)

            expanded_box = _get_expanded_box(box,
                                             img_h=n,
                                             img_w=m,
                                             border_ratio=border_ratio)

            (box_h, box_w) = _get_box_shape(box)
            (expanded_box_h, expanded_box_w) = _get_box_shape(expanded_box)

            cumsum = imgproc.calc_cumsum_2d(
                score_map, tf.concat([box, expanded_box], axis=1))

            area = tf.expand_dims(tf.cast(box_h * box_w, tf.float32), axis=-1)
            area_border = tf.expand_dims(tf.cast(
                expanded_box_h * expanded_box_w - box_h * box_w, tf.float32),
                                         axis=-1)

            avg_val = tf.div(cumsum[:, :p, :], tf.maximum(_SMALL_NUMBER, area))
            avg_val_in_border = tf.div(cumsum[:, p:, :] - cumsum[:, :p, :],
                                       tf.maximum(_SMALL_NUMBER, area_border))

            return avg_val - avg_val_in_border
Ejemplo n.º 2
0
    def test_calc_cumsum_2d(self):
        tf.reset_default_graph()

        image = tf.placeholder(tf.float32, shape=[None, None, None])
        box = tf.placeholder(tf.int64, shape=[None, 4])
        cumsum = imgproc.calc_cumsum_2d(tf.expand_dims(image, axis=0),
                                        tf.expand_dims(box, axis=0))[0]

        with self.test_session() as sess:

            # 3x3 image, 1 channel.

            result = sess.run(cumsum,
                              feed_dict={
                                  image: [[[1], [2], [3]], [[4], [5], [6]],
                                          [[7], [8], [9]]],
                                  box: [
                                      [0, 0, 1, 1],
                                      [2, 2, 3, 3],
                                      [1, 1, 2, 2],
                                      [0, 0, 2, 2],
                                      [1, 1, 3, 3],
                                      [0, 0, 3, 3],
                                      [0, 0, 2, 3],
                                  ]
                              })
            self.assertAllClose(result,
                                [[1], [9], [5], [12], [28], [45], [21]])

            # 3x3 image, 2 channels.

            result = sess.run(cumsum,
                              feed_dict={
                                  image: [[[1, 1], [2, 2], [3, 3]],
                                          [[4, 1], [5, 2], [6, 3]],
                                          [[7, 1], [8, 2], [9, 3]]],
                                  box: [
                                      [0, 0, 1, 1],
                                      [2, 2, 3, 3],
                                      [1, 1, 2, 2],
                                      [0, 0, 2, 2],
                                      [1, 1, 3, 3],
                                      [0, 0, 3, 3],
                                      [0, 0, 2, 3],
                                  ]
                              })
            self.assertAllClose(result, [[1, 1], [9, 3], [5, 2], [12, 6],
                                         [28, 10], [45, 18], [21, 12]])
Ejemplo n.º 3
0
        def _cumsum_gradient(score_map, box):
            b, n, m, c = utils.get_tensor_shape(score_map)
            _, p, _ = utils.get_tensor_shape(box)

            # Leave a border for the image border.
            ymin, xmin, ymax, xmax = tf.unstack(box, axis=-1)
            ymin, xmin = tf.maximum(ymin, 2), tf.maximum(xmin, 2)
            ymax, xmax = tf.minimum(ymax, tf.to_int64(n - 2)), tf.minimum(
                xmax, tf.to_int64(m - 2))

            box = tf.stack([ymin, xmin, ymax, xmax], axis=-1)
            box_exp = _get_expanded_box(box,
                                        img_h=n,
                                        img_w=m,
                                        border_ratio=border_ratio)

            box_list = [box, box_exp]

            area_list = [
                tf.cast(_get_box_area(b), tf.float32) for b in box_list
            ]
            cumsum = imgproc.calc_cumsum_2d(score_map,
                                            tf.concat(box_list, axis=1))
            cumsum_list = [
                cumsum[:, i * p:(i + 1) * p, :] for i in range(len(box_list))
            ]

            # The main box has to be valid, including the four shrinked boxes.
            assert_op = tf.Assert(
                tf.reduce_all(tf.greater(area_list[0], 0)),
                ["Check area of the main box failed:", area_list[0]])

            with tf.control_dependencies([assert_op]):
                border_area = area_list[1] - area_list[0]
                border_cumsum = cumsum_list[1] - cumsum_list[0]

                border_avg = tf.div(
                    border_cumsum,
                    tf.maximum(_SMALL_NUMBER,
                               tf.expand_dims(border_area, axis=-1)))
                box_avg = tf.div(
                    cumsum_list[0],
                    tf.maximum(_SMALL_NUMBER,
                               tf.expand_dims(area_list[0], axis=-1)))

                return purity_weight * box_avg - border_avg
Ejemplo n.º 4
0
        def _cumsum_gradient(score_map, box):
            b, n, m, c = utils.get_tensor_shape(score_map)
            _, p, _ = utils.get_tensor_shape(box)

            n, m = tf.cast(n, tf.int64), tf.cast(m, tf.int64)

            # Leave a border for the image border.
            ymin, xmin, ymax, xmax = tf.unstack(box, axis=-1)
            ymin, xmin = tf.maximum(ymin, 3), tf.maximum(xmin, 3)
            ymax, xmax = tf.minimum(ymax, n - 3), tf.minimum(xmax, m - 3)
            box = tf.stack([ymin, xmin, ymax, xmax], axis=-1)

            box_exp = _get_expanded_box(box,
                                        img_h=n,
                                        img_w=m,
                                        border_ratio=border_ratio)
            box_shr = _get_shrinked_box(box,
                                        img_h=n,
                                        img_w=m,
                                        border_ratio=border_ratio)

            ymin, xmin, ymax, xmax = tf.unstack(box, axis=-1)
            ymin_exp, xmin_exp, ymax_exp, xmax_exp = tf.unstack(box_exp,
                                                                axis=-1)
            ymin_shr, xmin_shr, ymax_shr, xmax_shr = tf.unstack(box_shr,
                                                                axis=-1)

            box_list = [
                box,
                tf.stack([ymin, xmin, ymax, xmin_shr], axis=-1),
                tf.stack([ymin, xmax_shr, ymax, xmax], axis=-1),
                tf.stack([ymin, xmin, ymin_shr, xmax], axis=-1),
                tf.stack([ymax_shr, xmin, ymax, xmax], axis=-1),
                tf.stack([ymin, xmin_exp, ymax, xmin], axis=-1),
                tf.stack([ymin, xmax, ymax, xmax_exp], axis=-1),
                tf.stack([ymin_exp, xmin, ymin, xmax], axis=-1),
                tf.stack([ymax, xmin, ymax_exp, xmax], axis=-1)
            ]

            area_list = [
                tf.cast(_get_box_area(b), tf.float32) for b in box_list
            ]
            cumsum = imgproc.calc_cumsum_2d(score_map,
                                            tf.concat(box_list, axis=1))
            cumsum_list = [
                cumsum[:, i * p:(i + 1) * p, :] for i in range(len(box_list))
            ]

            # Compute the averaged cumsum inside each box.
            cumsum_avg_list = [
                tf.div(
                    cumsum_list[i],
                    tf.expand_dims(tf.maximum(_SMALL_NUMBER, area_list[i]),
                                   axis=-1)) for i in range(len(box_list))
            ]

            # The main box has to be valid, including the four shrinked boxes.
            assert_op = tf.Assert(
                tf.reduce_all(tf.greater(tf.stack(area_list, axis=-1), 0)),
                ["Check area of the main box failed:", area_list[0]])

            with tf.control_dependencies([assert_op]):
                grad_list = []
                for i in [1, 2, 3, 4]:
                    grad = cumsum_avg_list[i] - cumsum_avg_list[i + 4]
                    grad_list.append(grad)

                return purity_weight * cumsum_avg_list[0] + tf.reduce_min(
                    tf.stack(grad_list, axis=-1), axis=-1)
Ejemplo n.º 5
0
 def _cumsum_avg(score_map, box):
     ymin, xmin, ymax, xmax = tf.unstack(box, axis=-1)
     area = tf.expand_dims((ymax - ymin) * (xmax - xmin), axis=-1)
     return tf.div(imgproc.calc_cumsum_2d(score_map, box),
                   tf.maximum(_SMALL_NUMBER, tf.cast(area, tf.float32)))