def __init__(self, config: dict, in_meta: ProjectMeta, model: SingleImageInferenceBase): super().__init__(config, in_meta, model) # If saving the bounding boxes on which inference was called is requested, create separate classes # for those bounding boxes by renaming the source object classes. self._renamer_intermediate = None if self._config[SAVE]: renamer_intermediate = Renamer( add_suffix=self._config[Renamer.ADD_SUFFIX], enabled_classes=self._config[FROM_CLASSES]) # First simply rename the matching source classes. intermediate_renamed_classes = make_renamed_classes( in_meta.obj_classes, renamer_intermediate, skip_missing=True) # Next, change the geometry type for the intermediate bounding box classes to Rectangle. intermediate_renamed_rectangle_classes = ObjClassCollection(items=[ renamed_class.clone(geometry_type=Rectangle) for renamed_class in intermediate_renamed_classes ]) # Add the renamed Rectangle classes to the output meta and set up a class mapper. self._out_meta = self._out_meta.add_obj_classes( intermediate_renamed_rectangle_classes) self._intermediate_class_mapper = RenamingObjClassMapper( dest_obj_classes=intermediate_renamed_rectangle_classes, renamer=renamer_intermediate)
def __init__(self, config: dict, in_meta: ProjectMeta, model: SingleImageInferenceBase): super().__init__(config, in_meta, model) self._renamer_intermediate = None if self._config[SAVE]: renamer_intermediate = Renamer(add_suffix=self._config.get(Renamer.ADD_SUFFIX, ''), enabled_classes=self._config[FROM_CLASSES]) intermediate_renamed_classes = make_renamed_classes(in_meta.obj_classes, renamer_intermediate, skip_missing=True) for renamed_class in intermediate_renamed_classes: self._out_meta = self._out_meta.add_obj_class(renamed_class.clone(geometry_type=Rectangle)) self._intermediate_class_mapper = RenamingObjClassMapper(dest_obj_classes=self._out_meta.obj_classes, renamer=renamer_intermediate) self._out_meta = self._out_meta.add_obj_tag_metas(self._renamed_model_img_tags)
def __init__(self, config: dict, in_meta: ProjectMeta, model: SingleImageInferenceBase): validation_schema_path = pkg_resources.resource_filename( __name__, 'inference_modes_schemas/{}.json'.format(self.mode_name())) MultiTypeValidator(validation_schema_path).val(INFERENCE_MODE_CONFIG, config) self._config = deepcopy(config) self._out_meta = in_meta self._model = model model_out_meta = self._model.model_out_meta # Renamer for model classes. renamer_model = Renamer.from_json(config.get(MODEL_CLASSES, {})) # Add all the applicable (passing the renamer filter) renamed model classes to the output meta. self._out_meta = self.out_meta.add_obj_classes( make_renamed_classes(model_out_meta.obj_classes, renamer_model, skip_missing=True)) # Make a class mapper to translate from model object space to output meta space. # TODO store the renamed model classes separately for the mapper instead of mixing in with the input annotation # classes. self._model_class_mapper = RenamingObjClassMapper(dest_obj_classes=self._out_meta.obj_classes, renamer=renamer_model) # Renamer for model tags. self._model_tags_renamer = Renamer.from_json(config.get(MODEL_TAGS, {})) # Rename the model output tags, set up a mapper and add them to the output meta. self._renamed_model_tags = make_renamed_tag_metas( model_out_meta.tag_metas, self._model_tags_renamer, skip_missing=True) self._model_tag_meta_mapper = RenamingTagMetaMapper(dest_tag_meta_dict=self._renamed_model_tags, renamer=self._model_tags_renamer) self._out_meta = self._out_meta.add_tag_metas(self._renamed_model_tags)
def __init__(self, config: dict, in_meta: ProjectMeta, model: SingleImageInferenceBase): validation_schema_path = pkg_resources.resource_filename( __name__, 'inference_modes_schemas/{}.json'.format(self.mode_name())) MultiTypeValidator(validation_schema_path).val(INFERENCE_MODE_CONFIG, config) self._config = deepcopy(config) self._out_meta = in_meta.clone() self._model = model model_out_meta = self._model.model_out_meta renamer_model = Renamer.from_json(config[MODEL_CLASSES]) for out_class in make_renamed_classes(model_out_meta.obj_classes, renamer_model, skip_missing=True): self._out_meta = self._out_meta.add_obj_class(out_class) self._model_class_mapper = RenamingObjClassMapper(dest_obj_classes=self._out_meta.obj_classes, renamer=renamer_model) self._model_img_tags_renamer = Renamer(add_suffix=config[MODEL_CLASSES][Renamer.ADD_SUFFIX]) self._renamed_model_img_tags = make_renamed_tag_metas(model_out_meta.img_tag_metas, self._model_img_tags_renamer, skip_missing=True) self._model_img_tag_meta_mapper = RenamingTagMetaMapper(dest_tag_meta_dict=self._renamed_model_img_tags, renamer=self._model_img_tags_renamer) self._out_meta = self._out_meta.merge(ProjectMeta(obj_tag_metas=model_out_meta.obj_tag_metas))
class InfModeBboxes(InferenceModeBase): @staticmethod def mode_name(): return 'bboxes' @classmethod def make_default_config(cls, model_result_suffix: str) -> dict: config = super(InfModeBboxes, cls).make_default_config(model_result_suffix) our_config = { FROM_CLASSES: MATCH_ALL, PADDING: { LEFT: '0' + PX, TOP: '0' + PX, RIGHT: '0' + PX, BOTTOM: '0' + PX, }, SAVE: False, Renamer.ADD_SUFFIX: '_input_bbox' } update_strict(config, our_config) return config def __init__(self, config: dict, in_meta: ProjectMeta, model: SingleImageInferenceBase): super().__init__(config, in_meta, model) self._renamer_intermediate = None if self._config[SAVE]: renamer_intermediate = Renamer(add_suffix=self._config.get(Renamer.ADD_SUFFIX, ''), enabled_classes=self._config[FROM_CLASSES]) intermediate_renamed_classes = make_renamed_classes(in_meta.obj_classes, renamer_intermediate, skip_missing=True) for renamed_class in intermediate_renamed_classes: self._out_meta = self._out_meta.add_obj_class(renamed_class.clone(geometry_type=Rectangle)) self._intermediate_class_mapper = RenamingObjClassMapper(dest_obj_classes=self._out_meta.obj_classes, renamer=renamer_intermediate) self._out_meta = self._out_meta.add_obj_tag_metas(self._renamed_model_img_tags) def _do_infer_annotate(self, img: np.ndarray, ann: Annotation) -> Annotation: result_labels = [] for src_label, roi in self._all_filtered_bbox_rois(ann, self._config[FROM_CLASSES], self._config[PADDING]): if roi is None: result_labels.append(src_label) else: roi_ann = _get_annotation_for_bbox(img, roi, self._model) result_labels.extend(replace_labels_classes( roi_ann.labels, self._model_class_mapper, skip_missing=True)) model_img_level_tags = make_renamed_tags(roi_ann.img_tags, self._model_img_tag_meta_mapper, skip_missing=True) if self._config[SAVE]: result_labels.append( Label(geometry=roi, obj_class=self._intermediate_class_mapper.map(src_label.obj_class), tags=model_img_level_tags)) result_labels.append(src_label.add_tags(model_img_level_tags)) return ann.clone(labels=result_labels) @staticmethod def _all_filtered_bbox_rois(ann: Annotation, included_classes, crop_config: dict): for src_label in ann.labels: effective_roi = None if is_name_included(src_label.obj_class.name, included_classes): bbox = src_label.geometry.to_bbox() roi = _make_padded_rectangle((bbox.height, bbox.width), crop_config) maybe_effective_roi = roi.translate(drow=bbox.top, dcol=bbox.left).crop( Rectangle.from_size(ann.img_size)) if len(maybe_effective_roi) > 0: [effective_roi] = maybe_effective_roi yield src_label, effective_roi
class InfModeBboxes(InferenceModeBase): @staticmethod def mode_name(): return 'bboxes' @classmethod def make_default_config(cls, model_result_suffix: str) -> dict: config = super(InfModeBboxes, cls).make_default_config(model_result_suffix) our_config = { FROM_CLASSES: MATCH_ALL, PADDING: { LEFT: '0' + PX, TOP: '0' + PX, RIGHT: '0' + PX, BOTTOM: '0' + PX, }, SAVE: False, Renamer.ADD_SUFFIX: '_input_bbox' } update_strict(config, our_config) return config def __init__(self, config: dict, in_meta: ProjectMeta, model: SingleImageInferenceBase): super().__init__(config, in_meta, model) # If saving the bounding boxes on which inference was called is requested, create separate classes # for those bounding boxes by renaming the source object classes. self._renamer_intermediate = None if self._config[SAVE]: renamer_intermediate = Renamer( add_suffix=self._config[Renamer.ADD_SUFFIX], enabled_classes=self._config[FROM_CLASSES]) # First simply rename the matching source classes. intermediate_renamed_classes = make_renamed_classes( in_meta.obj_classes, renamer_intermediate, skip_missing=True) # Next, change the geometry type for the intermediate bounding box classes to Rectangle. intermediate_renamed_rectangle_classes = ObjClassCollection(items=[ renamed_class.clone(geometry_type=Rectangle) for renamed_class in intermediate_renamed_classes ]) # Add the renamed Rectangle classes to the output meta and set up a class mapper. self._out_meta = self._out_meta.add_obj_classes( intermediate_renamed_rectangle_classes) self._intermediate_class_mapper = RenamingObjClassMapper( dest_obj_classes=intermediate_renamed_rectangle_classes, renamer=renamer_intermediate) def _do_infer_annotate(self, img: np.ndarray, ann: Annotation) -> Annotation: result_labels = [] for src_label, roi in self._all_filtered_bbox_rois( ann, self._config[FROM_CLASSES], self._config[PADDING]): if roi is None: result_labels.append(src_label) else: roi_ann = _get_annotation_for_bbox(img, roi, self._model) result_labels.extend( _replace_labels_classes(roi_ann.labels, self._model_class_mapper, self._model_tag_meta_mapper, skip_missing=True)) model_img_level_tags = make_renamed_tags( roi_ann.img_tags, self._model_tag_meta_mapper, skip_missing=True) if self._config[SAVE]: result_labels.append( Label(geometry=roi, obj_class=self._intermediate_class_mapper.map( src_label.obj_class), tags=model_img_level_tags)) # Regardless of whether we need to save intermediate bounding boxes, also put the inference result tags # onto the original source object from which we created a bounding box. # This is necessary for e.g. classification models to work, so that they put the classification results # onto the original object. result_labels.append(src_label.add_tags(model_img_level_tags)) return ann.clone(labels=result_labels) @staticmethod def _all_filtered_bbox_rois(ann: Annotation, included_classes, crop_config: dict): for src_label in ann.labels: effective_roi = None if is_name_included(src_label.obj_class.name, included_classes): bbox = src_label.geometry.to_bbox() roi = _make_padded_rectangle((bbox.height, bbox.width), crop_config) maybe_effective_roi = roi.translate( drow=bbox.top, dcol=bbox.left).crop(Rectangle.from_size(ann.img_size)) if len(maybe_effective_roi) > 0: [effective_roi] = maybe_effective_roi yield src_label, effective_roi