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))
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()))
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))
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))))
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))