def test_modify_clean_dataset_insertMode(self):
        # test configuration
        num_images = 10
        num_datapoints_per_image = 10
        merge_add_val = 20

        # create "clean" dataset
        dd_list = []
        for ii in range(num_images):
            data = np.arange(ii, ii + num_datapoints_per_image)
            data_fname = 'file_' + str(ii) + '.png'
            cv2.imwrite(os.path.join(self.clean_dataset_rootdir, data_fname),
                        data)
            dd_list.append({'file': data_fname})
        clean_df = pd.DataFrame(dd_list)
        clean_csv_fname = 'data.csv'
        clean_df.to_csv(os.path.join(self.clean_dataset_rootdir,
                                     clean_csv_fname),
                        index=None)

        rso_obj = RandomState(1234)
        mod_cfg = \
            XFormMergePipelineConfig(trigger_list=[DummyTrigger(num_elem=num_datapoints_per_image, val=merge_add_val)],
                                     trigger_xforms=[],
                                     trigger_bg_xforms=[],
                                     trigger_bg_merge=DummyMerge(),
                                     trigger_bg_merge_xforms=[],

                                     merge_type='insert',
                                     per_class_trigger_frac=None)

        # run the modification function
        mod_output_rootdir = os.path.join(self.clean_dataset_rootdir,
                                          'modified')
        mod_output_subdir = os.path.join(mod_output_rootdir, 'subdir')
        XFormMergePipeline.modify_clean_image_dataset(
            self.clean_dataset_rootdir,
            clean_csv_fname,
            mod_output_rootdir,
            mod_output_subdir,
            mod_cfg,
            method='insert')

        # compare results w/ expected
        for ii in range(num_images):
            fname = 'file_' + str(ii) + '.png'
            clean_data_fp = os.path.join(self.clean_dataset_rootdir, fname)
            triggered_data_fp = os.path.join(mod_output_rootdir,
                                             mod_output_subdir, fname)

            clean_data = GenericImageEntity(cv2.imread(clean_data_fp, -1))
            triggered_data = GenericImageEntity(
                cv2.imread(triggered_data_fp, -1))
            expected_data = clean_data.get_data() + merge_add_val

            self.assertTrue(
                np.allclose(triggered_data.get_data(), expected_data))
Exemplo n.º 2
0
 def test_simple_random_insert(self):
     pattern = GenericImageEntity(np.ones((5, 5, 3)) * 3)
     target_img = np.ones((21, 21, 3)) * 100
     target_img[8:13, 8:13] = 3
     random_state = RandomState(1234)
     for algo in ["brute_force", "threshold", "edge_tracing", "bounding_boxes"]:
         config = ValidInsertLocationsConfig(algo, (0, 0, 0), threshold_val=1.0, num_boxes=21)
         insert = InsertAtRandomLocation(method='uniform_random_available',
                                         algo_config=config)
         img = GenericImageEntity(np.ones((21, 21, 3)) * 100)
         img.get_data()[8:13, 8:13] = 0
         insert.do(img, pattern, random_state)
         self.assertTrue(np.array_equal(target_img, img.get_data()))
Exemplo n.º 3
0
 def test_process_xform_list(self):
     """
     Tests that all supplied list of serial transforms are processed
     :return:None
     """
     img = GenericImageEntity(np.linspace(0, 10, 100))
     xforms = [DummyTransform_Add(1), DummyTransform_Multiply(2)]
     img_expected = (img.get_data() + 1) * 2
     img_actual = utils.process_xform_list(img, xforms, RandomState())
     self.assertTrue(np.allclose(img_actual.get_data(), img_expected))
Exemplo n.º 4
0
class TestTriggerPatterns(unittest.TestCase):
    def setUp(self):
        self.random_state = RandomState(1234)
        self.rgb_entity = GenericImageEntity(self.random_state.rand(1000, 1000, 3).astype(np.uint8))
        self.rgba_entity = GenericImageEntity(self.random_state.rand(500, 500, 4).astype(np.uint8))
        self.noop = NoOpFilterXForm()
        self.noop_down = NoOpFilterXForm("BGR", True, False)
        self.gotham = GothamFilterXForm()
        self.nashville = NashvilleFilterXForm()
        self.kelvin = KelvinFilterXForm()
        self.lomo = LomoFilterXForm()
        self.toaster = ToasterXForm()

    def test_data_integrity(self):
        start_array = self.rgb_entity.get_data()
        end_array = self.noop.do(self.rgb_entity, self.random_state).get_data()
        self.assertTrue(np.array_equal(start_array, end_array))
        start_array = self.rgba_entity.get_data()
        end_array = self.noop.do(self.rgba_entity, self.random_state).get_data()
        self.assertTrue(np.array_equal(start_array, end_array))
        start_array = self.rgba_entity.get_data()
        end_array = self.noop_down.do(self.rgba_entity, self.random_state).get_data()
        self.assertTrue(np.array_equal(start_array[:, :, :3], end_array))

    def test_gotham(self):
        out_rgb = self.gotham.do(self.rgb_entity, self.random_state)
        self.assertEqual(3, out_rgb.get_data().shape[2])
        out_rgba = self.gotham.do(self.rgba_entity, self.random_state)
        self.assertEqual(4, out_rgba.get_data().shape[2])

    def test_nashville(self):
        out_rgb = self.nashville.do(self.rgb_entity, self.random_state)
        self.assertEqual(3, out_rgb.get_data().shape[2])
        out_rgba = self.nashville.do(self.rgba_entity, self.random_state)
        self.assertEqual(4, out_rgba.get_data().shape[2])

    def test_kelvin(self):
        out_rgb = self.kelvin.do(self.rgb_entity, self.random_state)
        self.assertEqual(3, out_rgb.get_data().shape[2])
        out_rgba = self.kelvin.do(self.rgba_entity, self.random_state)
        self.assertEqual(4, out_rgba.get_data().shape[2])

    def test_lomo(self):
        out_rgb = self.lomo.do(self.rgb_entity, self.random_state)
        self.assertEqual(3, out_rgb.get_data().shape[2])
        out_rgba = self.lomo.do(self.rgba_entity, self.random_state)
        self.assertEqual(4, out_rgba.get_data().shape[2])

    def test_toaster(self):
        out_rgb = self.toaster.do(self.rgb_entity, self.random_state)
        self.assertEqual(3, out_rgb.get_data().shape[2])
        out_rgba = self.toaster.do(self.rgba_entity, self.random_state)
        self.assertEqual(4, out_rgba.get_data().shape[2])

    def test_channel_order(self):
        bgr_lomo = LomoFilterXForm('BGR')
        rgb_lomo = LomoFilterXForm('RGB')
        bgr_img = np.concatenate((np.ones((5, 5, 1)), np.zeros((5, 5, 2))), axis=2).astype(np.uint8)
        rgb_img = np.concatenate((np.zeros((5, 5, 2)), np.ones((5, 5, 1))), axis=2).astype(np.uint8)
        bgr_result = bgr_lomo.do(GenericImageEntity(bgr_img), random_state_obj=self.random_state)
        rgb_result = rgb_lomo.do(GenericImageEntity(rgb_img), random_state_obj=self.random_state)
        self.assertTrue(np.array_equal(bgr_result.get_data()[:, :, 0], rgb_result.get_data()[:, :, 2]))
        bgr_switched_result = rgb_lomo.do(GenericImageEntity(bgr_img), random_state_obj=self.random_state)
        rgb_switched_result = bgr_lomo.do(GenericImageEntity(rgb_img), random_state_obj=self.random_state)
        # transform should be modifying R and G channels, but is instead modifying B and G channels, setting to zero
        self.assertTrue(np.array_equal(bgr_switched_result.get_data(), np.zeros((5, 5, 3))))
        self.assertTrue(np.array_equal(rgb_switched_result.get_data(), np.zeros((5, 5, 3))))
Exemplo n.º 5
0
    def test_modify_clean_dataset_regenerateMode(self):
        # test configuration
        num_images = 10
        num_datapoints_per_image = 10
        merge_add_val = 20

        # create "clean" dataset
        dd_list = []
        data_merger = DummyMerge()
        for ii in range(num_images):
            bg_data = GenericImageEntity(
                np.linspace(ii, ii + 1, num_datapoints_per_image))
            bg_data_fname = os.path.join(self.clean_dataset_rootdir,
                                         'bg_file_' + str(ii) + '.png')
            cv2.imwrite(bg_data_fname, bg_data.get_data())

            fg_data = GenericImageEntity(
                np.linspace(ii + 2, ii + 3, num_datapoints_per_image))
            fg_data_fname = os.path.join(self.clean_dataset_rootdir,
                                         'fg_file_' + str(ii) + '.png')
            cv2.imwrite(fg_data_fname, fg_data.get_data())

            # create the combined "file"
            data = data_merger.do(bg_data, fg_data, RandomState())
            data_fname = 'file_' + str(ii) + '.png'
            cv2.imwrite(os.path.join(self.clean_dataset_rootdir, data_fname),
                        data.get_data())

            dd_list.append({
                'bg_file': os.path.abspath(bg_data_fname),
                'fg_file': os.path.abspath(fg_data_fname),
                'file': data_fname
            })
        clean_df = pd.DataFrame(dd_list)
        clean_csv_fname = 'data.csv'
        clean_df.to_csv(os.path.join(self.clean_dataset_rootdir,
                                     clean_csv_fname),
                        index=None)

        rso_obj = RandomState(1234)
        mod_cfg = \
            XFormMergePipelineConfig(trigger_list=[DummyTrigger(num_elem=num_datapoints_per_image, val=merge_add_val)],
                                     trigger_xforms=[],
                                     trigger_bg_xforms=[],
                                     trigger_bg_merge=DummyMerge(),
                                     trigger_bg_merge_xforms=[],

                                     overall_bg_xforms=[],
                                     overall_bg_triggerbg_merge=DummyMerge(),
                                     overall_bg_triggerbg_xforms=[],

                                     merge_type='regenerate',
                                     per_class_trigger_frac=None)

        # run the modification function
        mod_output_rootdir = os.path.join(self.clean_dataset_rootdir,
                                          'modified')
        mod_output_subdir = os.path.join(mod_output_rootdir, 'subdir')
        XFormMergePipeline.modify_clean_image_dataset(
            self.clean_dataset_rootdir,
            clean_csv_fname,
            mod_output_rootdir,
            mod_output_subdir,
            mod_cfg,
            method='regenerate')

        # compare results w/ expected
        for ii in range(num_images):
            bg_data_fname = 'bg_file_' + str(ii) + '.png'
            bg_data_fp = os.path.join(self.clean_dataset_rootdir,
                                      bg_data_fname)
            bg_data = cv2.imread(bg_data_fp, -1)

            fg_data_fname = 'fg_file_' + str(ii) + '.png'
            fg_data_fp = os.path.join(self.clean_dataset_rootdir,
                                      fg_data_fname)
            fg_data = cv2.imread(fg_data_fp, -1)

            triggered_data_fp = os.path.join(mod_output_rootdir,
                                             mod_output_subdir,
                                             'file_' + str(ii) + '.png')

            triggered_data = cv2.imread(triggered_data_fp, -1)
            expected_data = bg_data + merge_add_val + fg_data

            self.assertTrue(np.allclose(triggered_data, expected_data))