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