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