Esempio n. 1
0
    def testSLDCWorkflowWithRuleDispatcher(self):
        # pre build components
        segmenter = DumbSegmenter()
        tile_builder = DefaultTileBuilder()
        dispatcher = DumbDispatcher()
        classifier1 = DumbClassifier()
        classifier2 = DumbClassifier()
        rule1 = DumbRule()
        rule2 = DumbRule()

        builder = SLDCWorkflowBuilder()
        builder.set_segmenter(segmenter)
        builder.set_tile_builder(tile_builder)
        builder.add_classifier(rule1, classifier1)
        builder.add_classifier(rule2, classifier2)

        with self.assertRaises(InvalidBuildingException):
            builder.set_one_shot_dispatcher(dispatcher, {"default": classifier1})

        workflow = builder.get()
        self.assertIsInstance(workflow, SLDCWorkflow)
        self.assertEqual(len(workflow._dispatch_classifier._classifiers), 2)
        self.assertEqual(workflow._dispatch_classifier._classifiers[0], classifier1)
        self.assertEqual(workflow._dispatch_classifier._classifiers[1], classifier2)
        self.assertIsInstance(workflow._dispatch_classifier._dispatcher, RuleBasedDispatcher)
        self.assertEqual(len(workflow._dispatch_classifier._dispatcher._rules), 2)
        self.assertEqual(workflow._dispatch_classifier._dispatcher._rules[0], rule1)
        self.assertEqual(workflow._dispatch_classifier._dispatcher._rules[1], rule2)
Esempio n. 2
0
    def testSLDCWorkflowWithOneShotDispatcher(self):
        # pre build components
        segmenter = DumbSegmenter()
        dispatcher = DumbDispatcher()
        classifier = DumbClassifier()
        rule = DumbRule()
        logger = StandardOutputLogger(Logger.DEBUG)

        builder = SLDCWorkflowBuilder()
        builder.set_tile_size(512, 768)
        builder.set_overlap(3)
        builder.set_distance_tolerance(5)
        builder.set_n_jobs(5)
        builder.set_logger(logger)
        builder.set_parallel_dc(True)
        builder.set_tile_builder(None)

        with self.assertRaises(MissingComponentException):
            builder.get()

        builder.set_segmenter(segmenter)

        with self.assertRaises(MissingComponentException):
            builder.get()

        builder.set_default_tile_builder()

        with self.assertRaises(MissingComponentException):
            builder.get()

        builder.set_one_shot_dispatcher(dispatcher, {"default": classifier})

        with self.assertRaises(InvalidBuildingException):
            builder.add_classifier(rule, classifier, dispatching_label="default")

        with self.assertRaises(InvalidBuildingException):
            builder.add_catchall_classifier(classifier, dispatching_label="default")

        workflow = builder.get()
        self.assertIsInstance(workflow, SLDCWorkflow)
        self.assertEqual(workflow._segmenter, segmenter)
        self.assertEqual(workflow._n_jobs, 5)
        self.assertEqual(workflow._tile_overlap, 3)
        self.assertEqual(workflow._tile_max_height, 512)
        self.assertEqual(workflow._tile_max_width, 768)
        self.assertEqual(workflow.logger, logger)
        self.assertIsInstance(workflow._tile_builder, DefaultTileBuilder)
        self.assertEqual(workflow._dispatch_classifier._dispatcher, dispatcher)
        self.assertEqual(len(workflow._dispatch_classifier._classifiers), 1)
        self.assertEqual(workflow._dispatch_classifier._classifiers[0], classifier)
Esempio n. 3
0
    def testWorkflowChainBuilder(self):
        segmenter = DumbSegmenter()
        dispatcher = DumbDispatcher()
        classifier = DumbClassifier()

        builder = SLDCWorkflowBuilder()
        builder.set_segmenter(segmenter)
        builder.set_default_tile_builder()
        builder.set_one_shot_dispatcher(dispatcher, {"default": classifier})
        workflow1 = builder.get()

        builder2 = SSLWorkflowBuilder()
        builder2.set_segmenter(segmenter)
        builder2.set_default_tile_builder()
        workflow2 = builder2.get()

        _filter = DefaultFilter()
        logger = StandardOutputLogger(Logger.DEBUG)
        chain_builder = WorkflowChainBuilder()
        chain_builder.set_logger(logger)

        with self.assertRaises(MissingComponentException):
            chain_builder.get()

        chain_builder.set_first_workflow(workflow1, label="first")
        chain_builder.add_executor(workflow2, label="second", filter=_filter, n_jobs=2, logger=logger)
        chain = chain_builder.get()

        self.assertIsInstance(chain, WorkflowChain)
        self.assertEqual(chain.logger, logger)
        self.assertEqual(chain._first_workflow, workflow1)
        self.assertEqual(len(chain._executors), 1)
        self.assertEqual(chain._executors[0]._workflow, workflow2)
        self.assertEqual(len(chain._labels), 2)
        self.assertEqual(tuple(chain._labels), ("first", "second"))
        self.assertEqual(len(chain._filters), 1)
        self.assertEqual(chain._filters[0], _filter)
Esempio n. 4
0
    def testSLDCWorkflowWithCatchAllClassifier(self):
        # pre build components
        segmenter = DumbSegmenter()
        tile_builder = DefaultTileBuilder()
        dispatcher = DumbDispatcher()
        classifier = DumbClassifier()

        builder = SLDCWorkflowBuilder()
        builder.set_segmenter(segmenter)
        builder.set_tile_builder(tile_builder)

        builder.add_catchall_classifier(classifier)

        with self.assertRaises(InvalidBuildingException):
            builder.set_one_shot_dispatcher(dispatcher, {"default": classifier})

        workflow = builder.get()
        self.assertIsInstance(workflow, SLDCWorkflow)
        self.assertIsInstance(workflow._dispatch_classifier._dispatcher, RuleBasedDispatcher)
        self.assertEqual(len(workflow._dispatch_classifier._classifiers), 1)
        self.assertEqual(workflow._dispatch_classifier._classifiers[0], classifier)
        self.assertIsInstance(workflow._dispatch_classifier._dispatcher, RuleBasedDispatcher)
        self.assertEqual(len(workflow._dispatch_classifier._dispatcher._rules), 1)
        self.assertIsInstance(workflow._dispatch_classifier._dispatcher._rules[0], CatchAllRule)
Esempio n. 5
0
    def testWorkflowWithCustomDispatcher(self):
        # generate circle image
        w, h = 1000, 1000
        image = np.zeros((
            w,
            h,
        ), dtype="uint8")
        image = draw_circle(image, 10, (125, 125),
                            255)  # pi * 10 * 10 -> ~ 314
        image = draw_circle(image, 25, (250, 750),
                            255)  # pi * 25 * 25 -> ~ 1963
        image = draw_square(image, 26, (250, 250), 255)  # 26 * 26 -> 676
        image = draw_square(image, 50, (750, 750), 127)  # 50 * 50 -> 2500

        # build the workflow
        builder = SLDCWorkflowBuilder()
        builder.set_segmenter(CustomSegmenter())
        builder.set_one_shot_dispatcher(CustomDispatcher(1000), {
            "BIG": ColorClassifier(),
            "SMALL": ColorClassifier()
        })
        workflow = builder.get()

        # execute
        results = workflow.process(NumpyImage(image))

        # validate number of results
        count = len(results)
        self.assertEqual(count, 4)

        # sort polygons
        sorted_idx = sorted(
            range(count),
            key=lambda i:
            (results.polygons[i].centroid.y, results.polygons[i].centroid.x))

        # first circle
        circle1 = results.polygons[sorted_idx[0]]
        self.assertTrue(relative_error(circle1.area, np.pi * 10 * 10) < 0.025)
        self.assertTrue(relative_error(circle1.centroid.x, 125) < 0.025)
        self.assertTrue(relative_error(circle1.centroid.y, 125) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[0]], "SMALL")
        self.assertEqual(results.labels[sorted_idx[0]], ColorClassifier.WHITE)
        self.assertAlmostEqual(results.probas[sorted_idx[0]], 1.0)

        # first square
        square1 = results.polygons[sorted_idx[1]]
        self.assertTrue(relative_error(square1.area, 26 * 26) < 0.025)
        self.assertTrue(relative_error(square1.centroid.x, 250) < 0.025)
        self.assertTrue(relative_error(square1.centroid.y, 250) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[1]], "SMALL")
        self.assertEqual(results.labels[sorted_idx[1]], ColorClassifier.WHITE)
        self.assertAlmostEqual(results.probas[sorted_idx[1]], 1.0)

        # second circle
        circle2 = results.polygons[sorted_idx[2]]
        self.assertTrue(relative_error(circle2.area, np.pi * 25 * 25) < 0.025)
        self.assertTrue(relative_error(circle2.centroid.x, 250) < 0.025)
        self.assertTrue(relative_error(circle2.centroid.y, 750) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[2]], "BIG")
        self.assertEqual(results.labels[sorted_idx[2]], ColorClassifier.WHITE)
        self.assertAlmostEqual(results.probas[sorted_idx[2]], 1.0)

        # second square
        square2 = results.polygons[sorted_idx[3]]
        self.assertTrue(relative_error(square2.area, 50 * 50) < 0.025)
        self.assertTrue(relative_error(square2.centroid.x, 750) < 0.025)
        self.assertTrue(relative_error(square2.centroid.y, 750) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[3]], "BIG")
        self.assertEqual(results.labels[sorted_idx[3]], ColorClassifier.GREY)
        self.assertAlmostEqual(results.probas[sorted_idx[3]], 1.0)

        # check other information
        timing = results.timing
        self.assertEqual(
            timing.get_phases_hierarchy(), {
                "workflow.sldc": {
                    "detect": {
                        "load": None,
                        "segment": None,
                        "locate": None
                    },
                    "merge": None,
                    "dispatch_classify": {
                        "dispatch": None,
                        "classify": None
                    }
                }
            })
Esempio n. 6
0
    def testWorkflowWithCustomDispatcher(self):
        # generate circle image
        w, h = 1000, 1000
        image = np.zeros((w, h,), dtype="uint8")
        image = draw_circle(image, 10, (125, 125), 255)  # pi * 10 * 10 -> ~ 314
        image = draw_circle(image, 25, (250, 750), 255)  # pi * 25 * 25 -> ~ 1963
        image = draw_square(image, 26, (250, 250), 255)  # 26 * 26 -> 676
        image = draw_square(image, 50, (750, 750), 127)  # 50 * 50 -> 2500

        # build the workflow
        builder = SLDCWorkflowBuilder()
        builder.set_segmenter(CustomSegmenter())
        builder.set_one_shot_dispatcher(CustomDispatcher(1000), {
            "BIG": ColorClassifier(),
            "SMALL": ColorClassifier()
        })
        workflow = builder.get()

        # execute
        results = workflow.process(NumpyImage(image))

        # validate number of results
        count = len(results)
        self.assertEqual(count, 4)

        # sort polygons
        sorted_idx = sorted(range(count), key=lambda i: (results.polygons[i].centroid.y, results.polygons[i].centroid.x))

        # first circle
        circle1 = results.polygons[sorted_idx[0]]
        self.assertTrue(relative_error(circle1.area, np.pi * 10 * 10) < 0.025)
        self.assertTrue(relative_error(circle1.centroid.x, 125) < 0.025)
        self.assertTrue(relative_error(circle1.centroid.y, 125) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[0]], "SMALL")
        self.assertEqual(results.labels[sorted_idx[0]], ColorClassifier.WHITE)
        self.assertAlmostEqual(results.probas[sorted_idx[0]], 1.0)

        # first square
        square1 = results.polygons[sorted_idx[1]]
        self.assertTrue(relative_error(square1.area, 26 * 26) < 0.025)
        self.assertTrue(relative_error(square1.centroid.x, 250) < 0.025)
        self.assertTrue(relative_error(square1.centroid.y, 250) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[1]], "SMALL")
        self.assertEqual(results.labels[sorted_idx[1]], ColorClassifier.WHITE)
        self.assertAlmostEqual(results.probas[sorted_idx[1]], 1.0)

        # second circle
        circle2 = results.polygons[sorted_idx[2]]
        self.assertTrue(relative_error(circle2.area, np.pi * 25 * 25) < 0.025)
        self.assertTrue(relative_error(circle2.centroid.x, 250) < 0.025)
        self.assertTrue(relative_error(circle2.centroid.y, 750) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[2]], "BIG")
        self.assertEqual(results.labels[sorted_idx[2]], ColorClassifier.WHITE)
        self.assertAlmostEqual(results.probas[sorted_idx[2]], 1.0)

        # second square
        square2 = results.polygons[sorted_idx[3]]
        self.assertTrue(relative_error(square2.area, 50 * 50) < 0.025)
        self.assertTrue(relative_error(square2.centroid.x, 750) < 0.025)
        self.assertTrue(relative_error(square2.centroid.y, 750) < 0.025)
        self.assertEqual(results.dispatches[sorted_idx[3]], "BIG")
        self.assertEqual(results.labels[sorted_idx[3]], ColorClassifier.GREY)
        self.assertAlmostEqual(results.probas[sorted_idx[3]], 1.0)

        # check other information
        timing = results.timing
        self.assertEqual(timing.get_phases_hierarchy(), {"workflow.sldc": {
            "detect": {"load": None, "segment": None, "locate": None},
            "merge": None,
            "dispatch_classify": {"dispatch": None, "classify": None}
        }})