示例#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
        img_wh = ann_orig.image_size_wh

        if 'random_part' in self.settings:
            rect_to_crop = random_rect_from_bounds(
                self.settings['random_part'], *img_wh)
        elif 'sides' in self.settings:
            rect_to_crop = rect_from_bounds(self.settings['sides'], *img_wh)
        else:
            raise NotImplemented('Crop layer: wrong params.')
        # rect_to_crop has 'true' coordinates, e.g. single pixel crop will be defined as (0, 0, 1, 1)

        rect_img = Rect.from_size(img_wh)
        if rect_to_crop.is_empty:
            # tiny image (left >= right etc)
            logger.warning('Crop layer produced empty crop.')
            return  # no yield

        if not rect_img.contains(rect_to_crop):
            # some negative params
            raise RuntimeError(
                'Crop layer: result crop bounds are outside of source image.')

        img = img_desc.read_image()
        img = crop_image_with_rect(img, 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