def set_part_bboxes(ibs, part_rowid_list, bbox_list): r""" Sets bboxes of a list of parts by part_rowid, Args: part_rowid_list (list of rowids): list of part rowids bbox_list (list of (x, y, w, h)): new bounding boxes for each part_rowid Note: set_part_bboxes is a proxy for set_part_verts RESTful: Method: PUT URL: /api/part/bbox/ """ from vtool import geometry # changing the bboxes also changes the bounding polygon vert_list = geometry.verts_list_from_bboxes_list(bbox_list) # naively overwrite the bounding polygon with a rectangle - for now trust the user! ibs.set_part_verts(part_rowid_list, vert_list)
def TEST_CONVERT_BBOX_POLY(ibs): print('[TEST] CONVERT_BBOX_POLY') gids = ibs.get_valid_gids() bbox_list = [(0, 0, 100, 100)] aid_list = ibs.add_annots(gids[0:1], bbox_list=bbox_list) vert_list = ibs.get_annot_verts(aid_list) bbox_list_new = geometry.bboxes_from_vert_list(vert_list) assert bbox_list_new == bbox_list, 'Original bbox does not match the returned one' bbox_list = [(0, 0, 100, 100)] aid_list = ibs.add_annots(gids[1:2], bbox_list=bbox_list) vert_list = ibs.get_annot_verts(aid_list) vert_list_new = geometry.verts_list_from_bboxes_list(bbox_list) assert vert_list_new == vert_list, 'Vertices and their bounding box do not match' vert_list = [((0, 50), (50, 100), (100, 50), (50, 0))] aid_list = ibs.add_annots(gids[2:3], vert_list=vert_list) bbox_list = ibs.get_annot_bboxes(aid_list) bbox_list_new = geometry.bboxes_from_vert_list(vert_list) assert bbox_list_new == bbox_list, 'Original bbox does not match the returned one' return locals()
def generate_annot_properties( ibs, gid_list, bbox_list=None, theta_list=None, species_list=None, nid_list=None, name_list=None, detect_confidence_list=None, notes_list=None, vert_list=None, annot_uuid_list=None, yaw_list=None, quiet_delete_thumbs=False, ): # annot_uuid_list = ibsfuncs.make_annotation_uuids(image_uuid_list, bbox_list, # theta_list, deterministic=False) image_uuid_list = ibs.get_image_uuids(gid_list) if annot_uuid_list is None: annot_uuid_list = [uuid.uuid4() for _ in range(len(image_uuid_list))] # Prepare the SQL input assert name_list is None or nid_list is None, 'cannot specify both names and nids' # For import only, we can specify both by setting import_override to True assert bool(bbox_list is None) != bool( vert_list is None ), 'must specify exactly one of bbox_list or vert_list' if theta_list is None: theta_list = [0.0 for _ in range(len(gid_list))] if name_list is not None: nid_list = ibs.add_names(name_list) if detect_confidence_list is None: detect_confidence_list = [0.0 for _ in range(len(gid_list))] if notes_list is None: notes_list = ['' for _ in range(len(gid_list))] if vert_list is None: vert_list = geometry.verts_list_from_bboxes_list(bbox_list) elif bbox_list is None: bbox_list = geometry.bboxes_from_vert_list(vert_list) len_bbox = len(bbox_list) len_vert = len(vert_list) len_gid = len(gid_list) len_notes = len(notes_list) len_theta = len(theta_list) try: assert len_vert == len_bbox, 'bbox and verts are not of same size' assert len_gid == len_bbox, 'bbox and gid are not of same size' assert len_gid == len_theta, 'bbox and gid are not of same size' assert len_notes == len_gid, 'notes and gids are not of same size' except AssertionError as ex: ut.printex(ex, key_list=[ 'len_vert', 'len_gid', 'len_bbox' 'len_theta', 'len_notes' ]) raise if len(gid_list) == 0: # nothing is being added logger.info('[ibs] WARNING: 0 annotations are beign added!') logger.info(ut.repr2(locals())) return [] # Build ~~deterministic?~~ random and unique ANNOTATION ids image_uuid_list = ibs.get_image_uuids(gid_list) # annot_uuid_list = ibsfuncs.make_annotation_uuids(image_uuid_list, bbox_list, # theta_list, deterministic=False) if annot_uuid_list is None: annot_uuid_list = [uuid.uuid4() for _ in range(len(image_uuid_list))] if yaw_list is None: yaw_list = [-1.0] * len(image_uuid_list) nVert_list = [len(verts) for verts in vert_list] vertstr_list = [six.text_type(verts) for verts in vert_list] xtl_list, ytl_list, width_list, height_list = list(zip(*bbox_list)) assert len(nVert_list) == len(vertstr_list)
def add_parts(ibs, aid_list, bbox_list=None, theta_list=None, detect_confidence_list=None, notes_list=None, vert_list=None, part_uuid_list=None, viewpoint_list=None, quality_list=None, type_list=None, staged_uuid_list=None, staged_user_id_list=None, **kwargs): r""" Adds an part to annotations Args: aid_list (list): annotation rowids to add part to bbox_list (list): of [x, y, w, h] bounding boxes for each annotation (supply verts instead) theta_list (list): orientations of parts vert_list (list): alternative to bounding box Returns: list: part_rowid_list Ignore: detect_confidence_list = None notes_list = None part_uuid_list = None viewpoint_list = None quality_list = None type_list = None RESTful: Method: POST URL: /api/part/ """ # ut.embed() from vtool import geometry if ut.VERBOSE: logger.info('[ibs] adding parts') # Prepare the SQL input # For import only, we can specify both by setting import_override to True assert bool(bbox_list is None) != bool( vert_list is None ), 'must specify exactly one of bbox_list or vert_list' ut.assert_all_not_None(aid_list, 'aid_list') if vert_list is None: vert_list = geometry.verts_list_from_bboxes_list(bbox_list) elif bbox_list is None: bbox_list = geometry.bboxes_from_vert_list(vert_list) if theta_list is None: theta_list = [0.0 for _ in range(len(aid_list))] len_bbox = len(bbox_list) len_vert = len(vert_list) len_aid = len(aid_list) len_theta = len(theta_list) try: assert len_vert == len_bbox, 'bbox and verts are not of same size' assert len_aid == len_bbox, 'bbox and aid are not of same size' assert len_aid == len_theta, 'bbox and aid are not of same size' except AssertionError as ex: ut.printex(ex, key_list=['len_vert', 'len_aid', 'len_bbox' 'len_theta']) raise if len(aid_list) == 0: # nothing is being added logger.info('[ibs] WARNING: 0 parts are being added!') logger.info(ut.repr2(locals())) return [] if detect_confidence_list is None: detect_confidence_list = [0.0 for _ in range(len(aid_list))] if notes_list is None: notes_list = ['' for _ in range(len(aid_list))] if viewpoint_list is None: viewpoint_list = [-1.0] * len(aid_list) if type_list is None: type_list = [const.UNKNOWN] * len(aid_list) nVert_list = [len(verts) for verts in vert_list] vertstr_list = [six.text_type(verts) for verts in vert_list] xtl_list, ytl_list, width_list, height_list = list(zip(*bbox_list)) assert len(nVert_list) == len(vertstr_list) # Build ~~deterministic?~~ random and unique PART ids if part_uuid_list is None: part_uuid_list = [uuid.uuid4() for _ in range(len(aid_list))] if staged_uuid_list is None: staged_uuid_list = [None] * len(aid_list) is_staged_list = [ staged_uuid is not None for staged_uuid in staged_uuid_list ] if staged_user_id_list is None: staged_user_id_list = [None] * len(aid_list) # Define arguments to insert colnames = ( 'part_uuid', 'annot_rowid', 'part_xtl', 'part_ytl', 'part_width', 'part_height', 'part_theta', 'part_num_verts', 'part_verts', 'part_viewpoint', 'part_detect_confidence', 'part_note', 'part_type', 'part_staged_flag', 'part_staged_uuid', 'part_staged_user_identity', ) check_uuid_flags = [ not isinstance(auuid, uuid.UUID) for auuid in part_uuid_list ] if any(check_uuid_flags): pos = ut.list_where(check_uuid_flags) raise ValueError('positions %r have malformated UUIDS' % (pos, )) params_iter = list( zip( part_uuid_list, aid_list, xtl_list, ytl_list, width_list, height_list, theta_list, nVert_list, vertstr_list, viewpoint_list, detect_confidence_list, notes_list, type_list, is_staged_list, staged_uuid_list, staged_user_id_list, )) # Execute add PARTs SQL superkey_paramx = (0, ) get_rowid_from_superkey = ibs.get_part_rowids_from_uuid part_rowid_list = ibs.db.add_cleanly(const.PART_TABLE, colnames, params_iter, get_rowid_from_superkey, superkey_paramx) return part_rowid_list
def generate_annot_properties(ibs, gid_list, bbox_list=None, theta_list=None, species_list=None, nid_list=None, name_list=None, detect_confidence_list=None, notes_list=None, vert_list=None, annot_uuid_list=None, yaw_list=None, quiet_delete_thumbs=False): #annot_uuid_list = ibsfuncs.make_annotation_uuids(image_uuid_list, bbox_list, # theta_list, deterministic=False) image_uuid_list = ibs.get_image_uuids(gid_list) if annot_uuid_list is None: annot_uuid_list = [uuid.uuid4() for _ in range(len(image_uuid_list))] # Prepare the SQL input assert name_list is None or nid_list is None, ( 'cannot specify both names and nids') # For import only, we can specify both by setting import_override to True assert bool(bbox_list is None) != bool(vert_list is None), ( 'must specify exactly one of bbox_list or vert_list') if theta_list is None: theta_list = [0.0 for _ in range(len(gid_list))] if name_list is not None: nid_list = ibs.add_names(name_list) if detect_confidence_list is None: detect_confidence_list = [0.0 for _ in range(len(gid_list))] if notes_list is None: notes_list = ['' for _ in range(len(gid_list))] if vert_list is None: vert_list = geometry.verts_list_from_bboxes_list(bbox_list) elif bbox_list is None: bbox_list = geometry.bboxes_from_vert_list(vert_list) len_bbox = len(bbox_list) len_vert = len(vert_list) len_gid = len(gid_list) len_notes = len(notes_list) len_theta = len(theta_list) try: assert len_vert == len_bbox, 'bbox and verts are not of same size' assert len_gid == len_bbox, 'bbox and gid are not of same size' assert len_gid == len_theta, 'bbox and gid are not of same size' assert len_notes == len_gid, 'notes and gids are not of same size' except AssertionError as ex: ut.printex(ex, key_list=['len_vert', 'len_gid', 'len_bbox' 'len_theta', 'len_notes']) raise if len(gid_list) == 0: # nothing is being added print('[ibs] WARNING: 0 annotations are beign added!') print(ut.dict_str(locals())) return [] # Build ~~deterministic?~~ random and unique ANNOTATION ids image_uuid_list = ibs.get_image_uuids(gid_list) #annot_uuid_list = ibsfuncs.make_annotation_uuids(image_uuid_list, bbox_list, # theta_list, deterministic=False) if annot_uuid_list is None: annot_uuid_list = [uuid.uuid4() for _ in range(len(image_uuid_list))] if yaw_list is None: yaw_list = [-1.0] * len(image_uuid_list) nVert_list = [len(verts) for verts in vert_list] vertstr_list = [const.__STR__(verts) for verts in vert_list] xtl_list, ytl_list, width_list, height_list = list(zip(*bbox_list)) assert len(nVert_list) == len(vertstr_list)