# -*- coding: utf-8 -*-
"""
python -c "import utool as ut; ut.write_modscript_alias('Tgen.sh', 'wbia.templates.template_generator')"
sh Tgen.sh --key feat --Tcfg with_setters=False with_getters=True with_adders=True --modfname manual_feat_funcs
sh Tgen.sh --key feat --Tcfg with_deleters=True --autogen_modname manual_feat_funcs
"""
import logging
from wbia.control.accessor_decors import getter_1to1, getter_1toM, deleter
import utool as ut
from wbia.control import controller_inject
print, rrr, profile = ut.inject2(__name__)
logger = logging.getLogger('wbia')
CLASS_INJECT_KEY, register_ibs_method = controller_inject.make_ibs_register_decorator(
__name__
)
NEW_DEPC = True
ANNOT_ROWID = 'annot_rowid'
CHIP_ROWID = 'chip_rowid'
FEAT_VECS = 'feature_vecs'
FEAT_KPTS = 'feature_keypoints'
FEAT_NUM_FEAT = 'feature_num_feats'
# ----------------
# ROOT LEAF FUNCTIONS
# ----------------
[docs]@register_ibs_method
@deleter
def delete_annot_feats(ibs, aid_list, config2_=None):
"""annot.feat.delete(aid_list)
Args:
aid_list
TemplateInfo:
Tdeleter_rl_depenant
root = annot
leaf = feat
CommandLine:
python -m wbia.control.manual_feat_funcs --test-delete_annot_feats
python -m wbia.control.manual_feat_funcs --test-delete_annot_feats --verb-control
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.control.manual_feat_funcs import * # NOQA
>>> ibs, config2_ = testdata_ibs()
>>> aid_list = ibs._get_all_aids()[:1]
>>> fids_list = ibs.get_annot_feat_rowids(aid_list, config2_=config2_, ensure=True)
>>> num_deleted1 = ibs.delete_annot_feats(aid_list, config2_=config2_)
>>> ut.assert_eq(num_deleted1, len(fids_list))
>>> num_deleted2 = ibs.delete_annot_feats(aid_list, config2_=config2_)
>>> ut.assert_eq(num_deleted2, 0)
"""
if ut.VERBOSE:
logger.info('[ibs] deleting %d annots leaf nodes' % len(aid_list))
return ibs.depc_annot.delete_property('feat', aid_list, config=config2_)
[docs]@register_ibs_method
@getter_1to1
def get_annot_feat_rowids(
ibs, aid_list, ensure=True, eager=True, nInput=None, config2_=None, num_retries=1
):
"""
CommandLine:
python -m wbia.control.manual_feat_funcs get_annot_feat_rowids --show
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.algo.hots.query_request import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb(defaultdb='testdb1')
>>> aids = ibs.get_valid_aids()[0:3]
>>> config2_ = {}
>>> ibs.delete_annot_feats(aids, config2_=config2_) # Remove the chips
>>> ut.remove_file_list(ibs.get_annot_chip_fpath(aids, config2_=config2_))
>>> qfids = ibs.get_annot_feat_rowids(aids, ensure=True, config2_=config2_)
"""
return ibs.depc_annot.get_rowids(
'feat',
aid_list,
config=config2_,
ensure=ensure,
eager=eager,
num_retries=num_retries,
)
[docs]@register_ibs_method
@ut.accepts_numpy
@getter_1toM
# @cache_getter(const.ANNOTATION_TABLE, 'kpts')
def get_annot_kpts(ibs, aid_list, ensure=True, eager=True, nInput=None, config2_=None):
"""
Args:
aid_list (int): list of annotation ids
ensure (bool): eager evaluation if True
eager (bool):
nInput (None):
config2_ (QueryRequest): query request object with hyper-parameters
Returns:
kpts_list (list): annotation descriptor keypoints
CommandLine:
python -m wbia.control.manual_feat_funcs --test-get_annot_kpts --show
python -m wbia.control.manual_feat_funcs --test-get_annot_kpts --show --darken .9
python -m wbia.control.manual_feat_funcs --test-get_annot_kpts --show --darken .9 --verbose
python -m wbia.control.manual_feat_funcs --test-get_annot_kpts --show --darken .9 --verbose --no-affine-invariance
python -m wbia.control.manual_feat_funcs --test-get_annot_kpts --show --darken .9 --verbose --no-affine-invariance --scale_max=20
python -m wbia.control.manual_feat_funcs --test-get_annot_kpts --show --feat_type=hesaff+siam128
ipython -i -- --show --feat_type=hesaff+siam128
Example:
>>> # SLOW_DOCTEST
>>> # xdoctest: +SKIP
>>> from wbia.control.manual_feat_funcs import * # NOQA
>>> import vtool as vt
>>> import numpy as np
>>> import wbia
>>> import wbia.viz.interact
>>> # build test data
>>> qreq1_ = wbia.testdata_qreq_(defaultdb='testdb1', p=['default:RI=True'])
>>> qreq2_ = wbia.testdata_qreq_(defaultdb='testdb1', p=['default:RI=False'])
>>> ibs = qreq1_.ibs
>>> aid_list = qreq1_.get_external_qaids()
>>> with ut.Indenter('[TEST_GET_ANNOT_KPTS]'):
... print('qreq1 params: ' + qreq1_.qparams.feat_cfgstr)
... print('qreq2 params: ' + qreq2_.qparams.feat_cfgstr)
... print('id(qreq1): ' + str(id(qreq1_)))
... print('id(qreq2): ' + str(id(qreq2_)))
... #print('feat_config_rowid1 = %r' % (ibs.get_feat_config_rowid(config2_=qreq1_.extern_query_config2),))
... #print('feat_config_rowid2 = %r' % (ibs.get_feat_config_rowid(config2_=qreq2_.extern_query_config2),))
>>> # Force recomputation of features
>>> with ut.Indenter('[DELETE1]'):
... ibs.delete_annot_feats(aid_list, config2_=qreq1_.extern_query_config2)
>>> with ut.Indenter('[DELETE2]'):
... ibs.delete_annot_feats(aid_list, config2_=qreq2_.extern_query_config2)
>>> eager, ensure, nInput = True, True, None
>>> # execute function
>>> with ut.Indenter('[GET1]'):
... kpts1_list = get_annot_kpts(ibs, aid_list, ensure, eager, nInput, qreq1_.extern_query_config2)
>>> with ut.Indenter('[GET2]'):
... kpts2_list = get_annot_kpts(ibs, aid_list, ensure, eager, nInput, qreq2_.extern_query_config2)
>>> # verify results
>>> assert not np.all(vt.get_oris(kpts1_list[0]) == 0)
>>> assert np.all(vt.get_oris(kpts2_list[0]) == 0)
>>> ut.quit_if_noshow()
>>> #wbia.viz.viz_chip.show_chip(ibs, aid_list[0], config2_=qreq1_, ori=True)
>>> wbia.viz.interact.interact_chip.ishow_chip(ibs, aid_list[0], config2_=qreq1_.extern_query_config2, ori=True, fnum=1)
>>> wbia.viz.interact.interact_chip.ishow_chip(ibs, aid_list[0], config2_=qreq2_.extern_query_config2, ori=True, fnum=2)
>>> ut.show_if_requested()
"""
return ibs.depc_annot.get(
'feat', aid_list, 'kpts', config=config2_, ensure=ensure, eager=eager
)
[docs]@register_ibs_method
@getter_1toM
def get_annot_vecs(ibs, aid_list, ensure=True, eager=True, nInput=None, config2_=None):
"""
Returns:
vecs_list (list): annotation descriptor vectors
"""
return ibs.depc_annot.get(
'feat', aid_list, 'vecs', config=config2_, ensure=ensure, eager=eager
)
[docs]@register_ibs_method
@getter_1to1
def get_annot_num_feats(
ibs, aid_list, ensure=True, eager=True, nInput=None, config2_=None, _debug=False
):
"""
Args:
aid_list (list):
Returns:
nFeats_list (list): num descriptors per annotation
CommandLine:
python -m wbia.control.manual_feat_funcs --test-get_annot_num_feats
Example:
>>> # ENABLE_DOCTEST
>>> # this test might fail on different machines due to
>>> # determenism bugs in hesaff maybe? or maybe jpeg...
>>> # in which case its hopeless
>>> from wbia.control.manual_feat_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('testdb1')
>>> aid_list = ibs.get_valid_aids()[0:3]
>>> config2_ = {'dim_size': 450, 'resize_dim': 'area'}
>>> nFeats_list = get_annot_num_feats(ibs, aid_list, ensure=True, config2_=config2_, _debug=True)
>>> print('nFeats_list = %r' % (nFeats_list,))
>>> assert len(nFeats_list) == 3
>>> ut.assert_inbounds(nFeats_list[0], 1200, 1263)
>>> ut.assert_inbounds(nFeats_list[1], 900, 923)
>>> ut.assert_inbounds(nFeats_list[2], 1300, 1344)
Ignore:
depc = ibs.depc_annot
tablename = 'feat'
input_rowids = aid_list
colnames = 'num_feats'
config = config2_
"""
return ibs.depc_annot.get(
'feat',
aid_list,
'num_feats',
config=config2_,
ensure=ensure,
eager=eager,
_debug=_debug,
)
[docs]def testdata_ibs():
import wbia
ibs = wbia.opendb('testdb1')
config2_ = None
return ibs, config2_