예제 #1
0
    def feed(self, img, ann, inference_cback):
        src_objects, model_objects, interm_objects, img_wh = self._init_feed(
            ann)
        summed_probas = np.zeros(
            (img_wh[1], img_wh[0], self._num_model_out_classes),
            dtype=np.float64)
        cls_mapping = None
        for roi in self._sliding_windows.get(img_wh):
            img_cropped = crop_image_with_rect(img, roi)
            inference_result = inference_cback(img_cropped, None)
            cls_mapping = inference_result.pixelwise_class_probas.class_title_to_idx_out_mapping
            summed_probas[
                roi.top:roi.bottom, roi.left:roi.
                right, :] += inference_result.pixelwise_class_probas.probas
            interm_objects.extend(
                self._maybe_make_intermediate_bbox(img_wh, roi))

        if np.sum(summed_probas, axis=2).min() == 0:
            raise RuntimeError(
                'Wrong sliding window moving, implementation error.')

        model_objects_raw = prediction_to_sly_bitmaps(
            cls_mapping, np.argmax(summed_probas, axis=2))
        model_objects = rename_and_filter_figures(self._renamer_model,
                                                  model_objects_raw)
        ann['objects'] = src_objects + interm_objects + model_objects
        return ann
예제 #2
0
def get_objects_for_bbox(img, roi, inference_callback, renamer):
    """Runs inference within the given roi; renames the resulting figures and moves to global reference frame."""
    img_cropped = crop_image_with_rect(img, roi)
    inference_result = inference_callback(img_cropped, None)
    for fig in inference_result.figures:
        fig.shift((roi.left, roi.top))
    return rename_and_filter_figures(renamer, inference_result.figures)
예제 #3
0
    def process(self, data_el):
        img_desc, ann_orig = data_el
        img_wh = ann_orig.image_size_wh

        angle_dct = self.settings['rotate_angles']
        min_degrees, max_degrees = angle_dct['min_degrees'], angle_dct['max_degrees']
        rotate_degrees = np.random.uniform(min_degrees, max_degrees)

        rotator = ImageRotator(imsize_wh=img_wh, angle_degrees_ccw=rotate_degrees)

        img_orig = img_desc.read_image()
        img = rotator.rotate_img(img_orig, use_inter_nearest=False)

        ann = deepcopy(ann_orig)
        for fig in ann['objects']:
            fig.rotate(rotator)

        black_reg_mode = self.settings['black_regions']['mode']
        if black_reg_mode == 'keep':
            rect_to_crop = None

        elif black_reg_mode == 'crop':
            rect_to_crop = rotator.inner_crop

        elif black_reg_mode == 'preserve_size':
            rect_to_crop = rotator.source_rect
            img, delta = expand_image_with_rect(img, rect_to_crop)

            rect_to_crop = rect_to_crop.move(delta)
            for fig in ann['objects']:
                fig.shift(delta)

        else:
            raise NotImplementedError('Wrong black_regions mode.')

        if rect_to_crop is not None:
            if rect_to_crop.is_empty:
                logger.warning('Rotate layer produced empty crop.')
                return  # no yield

            if not Rect.from_arr(img).contains(rect_to_crop):
                raise RuntimeError('Unable to crop image in Rotate layer.')

            ann.apply_to_figures(lambda x: x.crop(rect_to_crop))

            img = crop_image_with_rect(img, rect_to_crop)
            delta = (-rect_to_crop.left, -rect_to_crop.top)
            for fig in ann['objects']:
                fig.shift(delta)  # to new coords of image

        ann.update_image_size(img)
        new_img_desc = img_desc.clone_with_img(img)

        yield new_img_desc, ann
예제 #4
0
    def feed(self, img, ann, inference_cback):
        img_wh = ann.image_size_wh
        src_titles = self._mode_conf['from_classes']
        for src_obj, roi in all_filtered_bbox_rois(ann, src_titles,
                                                   self._mode_conf['padding'],
                                                   img_wh):
            img_cropped = crop_image_with_rect(img, roi)
            _ = inference_cback(
                img_cropped,
                src_obj.data)  # no need to crop & pass figures now

        ann['objects'] = rename_and_filter_figures(self._renamer_existing,
                                                   ann['objects'])
        return ann
예제 #5
0
    def process(self, data_el):
        img_desc, ann_orig = data_el
        img_wh = ann_orig.image_size_wh
        img_orig = img_desc.read_image()

        for rect_to_crop in self.sliding_windows.get(img_wh):
            img = crop_image_with_rect(img_orig, rect_to_crop)
            new_img_desc = img_desc.clone_with_img(img)

            ann = deepcopy(ann_orig)
            ann.apply_to_figures(lambda x: x.crop(rect_to_crop))

            delta = (-rect_to_crop.left, -rect_to_crop.top)
            for fig in ann['objects']:
                fig.shift(delta)  # to new coords of image
            ann.update_image_size(img)

            yield new_img_desc, ann
예제 #6
0
    def process(self, data_el):
        img_desc, ann_orig = data_el
        imsize_wh = ann_orig.image_size_wh
        rect_img = Rect.from_size(imsize_wh)
        padding_dct = self.settings['pad']['sides']
        img_orig = None

        for idx, src_fig in enumerate(ann_orig['objects']):
            if src_fig.class_title not in self.classes_to_crop:
                continue

            src_fig_bbox = src_fig.get_bbox().round()
            if src_fig_bbox.is_empty:
                continue  # tiny object
            new_img_rect = rect_from_bounds(padding_dct,
                                            img_w=src_fig_bbox.width,
                                            img_h=src_fig_bbox.height,
                                            shift_inside=False)
            rect_to_crop = new_img_rect.move(src_fig_bbox.point0)
            rect_to_crop = rect_to_crop.intersection(rect_img).round()
            if rect_to_crop.is_empty:
                continue

            # let's crop
            if img_orig is None:
                img_orig = img_desc.read_image()

            img = crop_image_with_rect(img_orig, rect_to_crop)
            new_img_desc = img_desc.clone_with_img(img)

            ann = deepcopy(ann_orig)
            ann['objects'] = [
                x for i, x in enumerate(ann['objects'])
                if i == idx or x.class_title in self.classes_to_save
            ]
            ann.apply_to_figures(lambda x: x.crop(rect_to_crop))

            delta = (-rect_to_crop.left, -rect_to_crop.top)
            for fig in ann['objects']:
                fig.shift(delta)  # to new coords of image
            ann.update_image_size(img)

            yield new_img_desc, ann