You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

240 lines
9.2 KiB

from __future__ import print_function
import random
import unittest
import numpy as np
import copy
# add python path of PadleDetection to sys.path
import os
import sys
parent_path = os.path.abspath(os.path.join(__file__, *(['..'] * 4)))
if parent_path not in sys.path:
sys.path.append(parent_path)
from ppdet.data.transform import *
def gen_sample(h, w, nt, nc, random_score=True, channel_first=False):
im = np.random.randint(0, 256, size=(h, w, 3)).astype('float32')
if channel_first:
im = im.transpose((2, 0, 1))
gt_bbox = np.random.random(size=(nt, 4)).astype('float32')
gt_class = np.random.randint(0, nc, size=(nt, 1)).astype('int32')
if random_score:
gt_score = np.random.random(size=(nt, 1))
else:
gt_score = np.ones(shape=(nt, 1)).astype('float32')
is_crowd = np.zeros_like(gt_class)
sample = {
'image': im,
'gt_bbox': gt_bbox,
'gt_class': gt_class,
'gt_score': gt_score,
'is_crowd': is_crowd,
'h': h,
'w': w
}
return sample
class TestTransformOp(unittest.TestCase):
def setUp(self):
self.h, self.w = np.random.randint(1, 1024, size=2)
self.nt = np.random.randint(1, 50)
self.nc = 80
def assertAllClose(self, x, y, msg, atol=1e-5, rtol=1e-3):
self.assertTrue(np.allclose(x, y, atol=atol, rtol=rtol), msg=msg)
class TestResizeOp(TestTransformOp):
def test_resize(self):
sample = gen_sample(self.h, self.w, self.nt, self.nc)
orig_op = Resize(target_dim=608, interp=2)
curr_op = ResizeOp(target_size=608, keep_ratio=False, interp=2)
orig_res = orig_op(copy.deepcopy(sample))
curr_res = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
# only for specified random seed
# class TestMixupOp(TestTransformOp):
# def setUp(self):
# self.h, self.w = np.random.randint(1024, size=2)
# self.nt = np.random.randint(50)
# self.nc = 80
# def test_mixup(self):
# curr_sample = [gen_sample(self.h, self.w, self.nt, self.nc) for _ in range(2)]
# orig_sample = copy.deepcopy(curr_sample[0])
# orig_sample['mixup'] = copy.deepcopy(curr_sample[1])
# orig_op = MixupImage(alpha=1.5, beta=1.5)
# curr_op = MixupOp(alpha=1.5, beta=1.5)
# orig_res = orig_op(orig_sample)
# curr_res = curr_op(curr_sample)
# fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
# for k in fields:
# self.assertAllClose(orig_res[k], curr_res[k], msg=k)
# only for specified random seed
# class TestRandomDistortOp(TestTransformOp):
# def test_random_distort(self):
# sample = gen_sample(self.h, self.w, self.nt, self.nc)
# orig_op = ColorDistort(hsv_format=True, random_apply=False)
# curr_op = RandomDistortOp(random_apply=False)
# orig_res = orig_op(copy.deepcopy(sample))
# curr_res = curr_op(copy.deepcopy(sample))
# fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
# for k in fields:
# self.assertAllClose(orig_res[k], curr_res[k], msg=k)
# only for specified random seed
# class TestRandomExpandOp(TestTransformOp):
# def test_random_expand(self):
# sample = gen_sample(self.h, self.w, self.nt, self.nc)
# orig_op = RandomExpand(fill_value=[123.675, 116.28, 103.53])
# curr_op = RandomExpandOp(fill_value=[123.675, 116.28, 103.53])
# orig_res = orig_op(copy.deepcopy(sample))
# curr_res = curr_op(copy.deepcopy(sample))
# fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
# for k in fields:
# self.assertAllClose(orig_res[k], curr_res[k], msg=k)
# only for specified random seed
# class TestRandomCropOp(TestTransformOp):
# def test_random_crop(self):
# sample = gen_sample(self.h, self.w, self.nt, self.nc)
# orig_op = RandomCrop()
# curr_op = RandomCropOp()
# orig_res = orig_op(copy.deepcopy(sample))
# curr_res = curr_op(copy.deepcopy(sample))
# fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
# for k in fields:
# self.assertAllClose(orig_res[k], curr_res[k], msg=k)
# only for specified random seed
# class TestRandomFlipOp(TestTransformOp):
# def test_random_flip(self):
# sample = gen_sample(self.h, self.w, self.nt, self.nc)
# orig_op = RandomFlipImage(is_normalized=False)
# curr_op = RandomFlipOp()
# orig_res = orig_op(copy.deepcopy(sample))
# curr_res = curr_op(copy.deepcopy(sample))
# fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
# for k in fields:
# self.assertAllClose(orig_res[k], curr_res[k], msg=k)
# only for specified random seed
# class TestBatchRandomResizeOp(TestTransformOp):
# def test_batch_random_resize(self):
# sample = [gen_sample(self.h, self.w, self.nt, self.nc) for _ in range(10)]
# orig_op = RandomShape(sizes=[320, 352, 384, 416, 448, 480, 512, 544, 576, 608], random_inter=True, resize_box=True)
# curr_op = BatchRandomResizeOp(target_size=[320, 352, 384, 416, 448, 480, 512, 544, 576, 608], random_size=True, random_interp=True, keep_ratio=False)
# orig_ress = orig_op(copy.deepcopy(sample))
# curr_ress = curr_op(copy.deepcopy(sample))
# fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
# for orig_res, curr_res in zip(orig_ress, curr_ress):
# for k in fields:
# self.assertAllClose(orig_res[k], curr_res[k], msg=k)
class TestNormalizeBoxOp(TestTransformOp):
def test_normalize_box(self):
sample = gen_sample(self.h, self.w, self.nt, self.nc)
orig_op = NormalizeBox()
curr_op = NormalizeBoxOp()
orig_res = orig_op(copy.deepcopy(sample))
curr_res = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
class TestPadBoxOp(TestTransformOp):
def test_pad_box(self):
sample = gen_sample(self.h, self.w, self.nt, self.nc)
orig_op = PadBox(num_max_boxes=50)
curr_op = PadBoxOp(num_max_boxes=50)
orig_res = orig_op(copy.deepcopy(sample))
curr_res = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
class TestBboxXYXY2XYWHOp(TestTransformOp):
def test_bbox_xyxy2xywh(self):
sample = gen_sample(self.h, self.w, self.nt, self.nc)
orig_op = BboxXYXY2XYWH()
curr_op = BboxXYXY2XYWHOp()
orig_res = orig_op(copy.deepcopy(sample))
curr_res = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
class TestNormalizeImageOp(TestTransformOp):
def test_normalize_image(self):
sample = gen_sample(self.h, self.w, self.nt, self.nc)
orig_op = NormalizeImage(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225],
is_scale=True,
is_channel_first=False)
curr_op = NormalizeImageOp(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225],
is_scale=True)
orig_res = orig_op(copy.deepcopy(sample))
curr_res = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
class TestPermuteOp(TestTransformOp):
def test_permute(self):
sample = gen_sample(self.h, self.w, self.nt, self.nc)
orig_op = Permute(to_bgr=False, channel_first=True)
curr_op = PermuteOp()
orig_res = orig_op(copy.deepcopy(sample))
curr_res = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
class TestGt2YoloTargetOp(TestTransformOp):
def test_gt2yolotarget(self):
sample = [
gen_sample(
self.h, self.w, self.nt, self.nc, channel_first=True)
for _ in range(10)
]
orig_op = Gt2YoloTarget(
anchor_masks=[[6, 7, 8], [3, 4, 5], [0, 1, 2]],
anchors=[[10, 13], [16, 30], [33, 23], [30, 61], [62, 45],
[59, 119], [116, 90], [156, 198], [373, 326]],
downsample_ratios=[32, 16, 8])
curr_op = Gt2YoloTargetOp(
anchor_masks=[[6, 7, 8], [3, 4, 5], [0, 1, 2]],
anchors=[[10, 13], [16, 30], [33, 23], [30, 61], [62, 45],
[59, 119], [116, 90], [156, 198], [373, 326]],
downsample_ratios=[32, 16, 8])
orig_ress = orig_op(copy.deepcopy(sample))
curr_ress = curr_op(copy.deepcopy(sample))
fields = ['image', 'gt_bbox', 'gt_class', 'gt_score']
for orig_res, curr_res in zip(orig_ress, curr_ress):
for k in fields:
self.assertAllClose(orig_res[k], curr_res[k], msg=k)
if __name__ == "__main__":
unittest.main()