test_detection.py 5.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#   Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserve.
#
# 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.

from __future__ import print_function
import paddle.v2.fluid.layers as layers
from paddle.v2.fluid.framework import Program, program_guard
C
chengduoZH 已提交
18
import unittest
19 20


21
class TestDetection(unittest.TestCase):
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
    def test_detection_output(self):
        program = Program()
        with program_guard(program):
            pb = layers.data(
                name='prior_box',
                shape=[10, 4],
                append_batch_size=False,
                dtype='float32')
            pbv = layers.data(
                name='prior_box_var',
                shape=[10, 4],
                append_batch_size=False,
                dtype='float32')
            loc = layers.data(
                name='target_box',
                shape=[20, 4],
                append_batch_size=False,
                dtype='float32')
            scores = layers.data(
                name='scores',
                shape=[2, 20, 10],
                append_batch_size=False,
                dtype='float32')
            out = layers.detection_output(
                scores=scores, loc=loc, prior_box=pb, prior_box_var=pbv)
            self.assertIsNotNone(out)
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
            self.assertEqual(out.shape[-1], 6)
        print(str(program))

    def test_detection_api(self):
        program = Program()
        with program_guard(program):
            x = layers.data(name='x', shape=[4], dtype='float32')
            y = layers.data(name='y', shape=[4], dtype='float32')
            z = layers.data(name='z', shape=[4], dtype='float32', lod_level=1)
            iou = layers.iou_similarity(x=x, y=y)
            bcoder = layers.box_coder(
                prior_box=x,
                prior_box_var=y,
                target_box=z,
                code_type='encode_center_size')
            self.assertIsNotNone(iou)
            self.assertIsNotNone(bcoder)

            matched_indices, matched_dist = layers.bipartite_match(iou)
            self.assertIsNotNone(matched_indices)
            self.assertIsNotNone(matched_dist)

            gt = layers.data(
                name='gt', shape=[1, 1], dtype='int32', lod_level=1)
            trg, trg_weight = layers.target_assign(
                gt, matched_indices, mismatch_value=0)
            self.assertIsNotNone(trg)
            self.assertIsNotNone(trg_weight)

            gt2 = layers.data(
                name='gt2', shape=[10, 4], dtype='float32', lod_level=1)
            trg, trg_weight = layers.target_assign(
                gt2, matched_indices, mismatch_value=0)
            self.assertIsNotNone(trg)
            self.assertIsNotNone(trg_weight)

        print(str(program))

    def test_ssd_loss(self):
        program = Program()
        with program_guard(program):
            pb = layers.data(
                name='prior_box',
                shape=[10, 4],
                append_batch_size=False,
                dtype='float32')
            pbv = layers.data(
                name='prior_box_var',
                shape=[10, 4],
                append_batch_size=False,
                dtype='float32')
            loc = layers.data(name='target_box', shape=[10, 4], dtype='float32')
            scores = layers.data(name='scores', shape=[10, 21], dtype='float32')
            gt_box = layers.data(
                name='gt_box', shape=[4], lod_level=1, dtype='float32')
            gt_label = layers.data(
                name='gt_label', shape=[1], lod_level=1, dtype='int32')
            loss = layers.ssd_loss(loc, scores, gt_box, gt_label, pb, pbv)
            self.assertIsNotNone(loss)
            self.assertEqual(loss.shape[-1], 1)
108 109 110
        print(str(program))


C
chengduoZH 已提交
111 112
class TestPriorBox(unittest.TestCase):
    def test_prior_box(self):
113 114 115 116 117 118
        data_shape = [3, 224, 224]
        box, var = self.prior_box_output(data_shape)

        assert len(box.shape) == 2
        assert box.shape == var.shape
        assert box.shape[1] == 4
C
chengduoZH 已提交
119 120

    def prior_box_output(self, data_shape):
121 122
        images = layers.data(name='pixel', shape=data_shape, dtype='float32')
        conv1 = layers.conv2d(
C
chengduoZH 已提交
123 124 125 126 127
            input=images,
            num_filters=3,
            filter_size=3,
            stride=2,
            use_cudnn=False)
128
        conv2 = layers.conv2d(
C
chengduoZH 已提交
129 130 131 132 133
            input=conv1,
            num_filters=3,
            filter_size=3,
            stride=2,
            use_cudnn=False)
134
        conv3 = layers.conv2d(
C
chengduoZH 已提交
135 136 137 138 139
            input=conv2,
            num_filters=3,
            filter_size=3,
            stride=2,
            use_cudnn=False)
140
        conv4 = layers.conv2d(
C
chengduoZH 已提交
141 142 143 144 145
            input=conv3,
            num_filters=3,
            filter_size=3,
            stride=2,
            use_cudnn=False)
146
        conv5 = layers.conv2d(
C
chengduoZH 已提交
147 148 149 150 151 152
            input=conv4,
            num_filters=3,
            filter_size=3,
            stride=2,
            use_cudnn=False)

153
        box, var = layers.prior_box(
C
chengduoZH 已提交
154 155 156 157 158 159 160 161 162 163 164 165 166
            inputs=[conv1, conv2, conv3, conv4, conv5, conv5],
            image=images,
            min_ratio=20,
            max_ratio=90,
            # steps=[8, 16, 32, 64, 100, 300],
            aspect_ratios=[[2.], [2., 3.], [2., 3.], [2., 3.], [2.], [2.]],
            base_size=300,
            offset=0.5,
            flip=True,
            clip=True)
        return box, var


167 168
if __name__ == '__main__':
    unittest.main()