# -*- coding: utf-8 -*-
import logging
import utool as ut
import ubelt as ub # NOQA
import numpy as np
from functools import partial # NOQA
from wbia.control import controller_inject
print, rrr, profile = ut.inject2(__name__)
logger = logging.getLogger('wbia')
# Create dectorator to inject functions in this module into the IBEISController
CLASS_INJECT_KEY, register_ibs_method = controller_inject.make_ibs_register_decorator(
__name__
)
# def get_annotmatch_rowids_subset_from_aids(ibs, aids):
# pass
[docs]@register_ibs_method
@profile
def get_annotmatch_rowids_from_aid1(ibs, aid1_list, eager=True, nInput=None):
"""
TODO autogenerate
Returns a list of the aids that were reviewed as candidate matches to the input aid
aid_list = ibs.get_valid_aids()
Args:
ibs (IBEISController): wbia controller object
aid1_list (list):
eager (bool): (default = True)
nInput (None): (default = None)
Returns:
list: annotmatch_rowid_list
"""
from wbia.control import manual_annotmatch_funcs
colnames = (manual_annotmatch_funcs.ANNOTMATCH_ROWID,)
# FIXME: col_rowid is not correct
params_iter = zip(aid1_list)
if True:
# HACK IN INDEX
with ibs.db.connect() as conn:
conn.execute(
"""
CREATE INDEX IF NOT EXISTS aid1_to_am ON {ANNOTMATCH_TABLE} ({annot_rowid1});
""".format(
ANNOTMATCH_TABLE=ibs.const.ANNOTMATCH_TABLE,
annot_rowid1=manual_annotmatch_funcs.ANNOT_ROWID1,
)
)
where_colnames = [manual_annotmatch_funcs.ANNOT_ROWID1]
annotmatch_rowid_list = ibs.db.get_where_eq(
ibs.const.ANNOTMATCH_TABLE,
colnames,
params_iter,
where_colnames,
eager=eager,
nInput=nInput,
unpack_scalars=False,
)
annotmatch_rowid_list = list(map(sorted, annotmatch_rowid_list))
return annotmatch_rowid_list
[docs]@register_ibs_method
@profile
def get_annotmatch_rowids_from_aid2(
ibs, aid2_list, eager=True, nInput=None, force_method=None
):
"""
# This one is slow because aid2 is the second part of the index
Returns a list of the aids that were reviewed as candidate matches to the input aid
"""
from wbia.control import manual_annotmatch_funcs
if nInput is None:
nInput = len(aid2_list)
if True:
# HACK IN INDEX
with ibs.db.connect() as conn:
conn.execute(
"""
CREATE INDEX IF NOT EXISTS aid2_to_am ON {ANNOTMATCH_TABLE} ({annot_rowid2});
""".format(
ANNOTMATCH_TABLE=ibs.const.ANNOTMATCH_TABLE,
annot_rowid2=manual_annotmatch_funcs.ANNOT_ROWID2,
)
)
colnames = (manual_annotmatch_funcs.ANNOTMATCH_ROWID,)
# FIXME: col_rowid is not correct
params_iter = zip(aid2_list)
where_colnames = [manual_annotmatch_funcs.ANNOT_ROWID2]
annotmatch_rowid_list = ibs.db.get_where_eq(
ibs.const.ANNOTMATCH_TABLE,
colnames,
params_iter,
where_colnames,
eager=eager,
nInput=nInput,
unpack_scalars=False,
)
annotmatch_rowid_list = list(map(sorted, annotmatch_rowid_list))
return annotmatch_rowid_list
[docs]@register_ibs_method
@profile
def get_annotmatch_rowids_from_aid(
ibs, aid_list, eager=True, nInput=None, force_method=None
):
"""
Undirected version
Returns a list of the aids that were reviewed as candidate matches to the input aid
aid_list = ibs.get_valid_aids()
CommandLine:
python -m wbia.annotmatch_funcs --exec-get_annotmatch_rowids_from_aid
python -m wbia.annotmatch_funcs --exec-get_annotmatch_rowids_from_aid:1 --show
Example:
>>> # DISABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb(defaultdb='testdb1')
>>> ut.exec_funckw(ibs.get_annotmatch_rowids_from_aid, globals())
>>> aid_list = ibs.get_valid_aids()[0:4]
>>> annotmatch_rowid_list = ibs.get_annotmatch_rowids_from_aid(aid_list,
>>> eager, nInput)
>>> result = ('annotmatch_rowid_list = %s' % (str(annotmatch_rowid_list),))
>>> print(result)
"""
# from wbia.control import manual_annotmatch_funcs
if nInput is None:
nInput = len(aid_list)
if nInput == 0:
return []
rowids1 = ibs.get_annotmatch_rowids_from_aid1(aid_list)
rowids2 = ibs.get_annotmatch_rowids_from_aid2(aid_list)
annotmatch_rowid_list = [ut.unique(ut.flatten(p)) for p in zip(rowids1, rowids2)]
# Ensure funciton output is consistent
annotmatch_rowid_list = list(map(sorted, annotmatch_rowid_list))
return annotmatch_rowid_list
[docs]@register_ibs_method
@profile
def get_annotmatch_rowid_from_undirected_superkey(ibs, aids1, aids2):
# The directed nature of this makes a few things difficult and may cause
# odd behavior
am_rowids = ibs.get_annotmatch_rowid_from_superkey(aids1, aids2)
idxs = ut.where([r is None for r in am_rowids])
# Check which ones are None
aids1_ = ut.take(aids1, idxs)
aids2_ = ut.take(aids2, idxs)
am_rowids_ = ibs.get_annotmatch_rowid_from_superkey(aids2_, aids1_)
# Use the other rowid if found
for idx, rowid in zip(idxs, am_rowids_):
am_rowids[idx] = rowid
return am_rowids
[docs]@register_ibs_method
def get_annotmatch_rowid_from_edges(ibs, aid_pairs):
"""
Edegs are undirected
"""
aid_pairs = np.array(aid_pairs)
aids1 = aid_pairs.T[0]
aids2 = aid_pairs.T[1]
return ibs.get_annotmatch_rowid_from_undirected_superkey(aids1, aids2)
[docs]@register_ibs_method
def get_annotmatch_rowids_in_cliques(ibs, aids_list):
# Equivalent call:
# ibs.get_annotmatch_rowids_between_groups(ibs, aids_list, aids_list)
import itertools
ams_list = [
ibs.get_annotmatch_rowid_from_undirected_superkey(
*zip(*itertools.combinations(aids, 2))
)
for aids in ut.ProgIter(aids_list, lbl='loading clique am rowids')
]
ams_list = [[] if ams is None else ut.filter_Nones(ams) for ams in ams_list]
return ams_list
[docs]@register_ibs_method
def get_annotmatch_rowids_between_groups(ibs, aids1_list, aids2_list):
ams_list = []
lbl = 'loading between group am rowids'
for aids1, aids2 in ut.ProgIter(list(zip(aids1_list, aids2_list)), lbl=lbl):
ams = get_annotmatch_rowids_between(ibs, aids1, aids2)
ams_list.append(ams)
return ams_list
[docs]@register_ibs_method
def get_annotmatch_rowids_between(ibs, aids1, aids2, method=None):
"""
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('PZ_MTEST')
>>> aids1 = aids2 = [1, 2, 3, 4, 5, 6]
>>> rowids_between = ibs.get_annotmatch_rowids_between
>>> ams1 = sorted(rowids_between(aids1, aids2, method=1))
>>> ams2 = sorted(rowids_between(aids1, aids2, method=2))
>>> assert len(ub.find_duplicates(ams1)) == 0
>>> assert len(ub.find_duplicates(ams2)) == 0
>>> assert sorted(ams2) == sorted(ams1)
"""
if method is None:
if len(aids1) * len(aids2) > 5000:
method = 1
else:
method = 2
if method == 1:
# Strategy 1: get all existing rows and see what intersects
# This is better when the enumerated set of rows would be larger than
# the database size
unflat_rowids1L = ibs.get_annotmatch_rowids_from_aid1(aids1)
unflat_rowids1R = ibs.get_annotmatch_rowids_from_aid2(aids1)
unflat_rowids2L = ibs.get_annotmatch_rowids_from_aid1(aids2)
unflat_rowids2R = ibs.get_annotmatch_rowids_from_aid2(aids2)
am_rowids1L = {r for r in ut.iflatten(unflat_rowids1L) if r is not None}
am_rowids1R = {r for r in ut.iflatten(unflat_rowids1R) if r is not None}
am_rowids2L = {r for r in ut.iflatten(unflat_rowids2L) if r is not None}
am_rowids2R = {r for r in ut.iflatten(unflat_rowids2R) if r is not None}
ams12 = am_rowids1L.intersection(am_rowids2R)
ams21 = am_rowids2L.intersection(am_rowids1R)
ams = sorted(ams12.union(ams21))
# ams = sorted(am_rowids1.intersection(am_rowids2))
# rowids2 = ibs.get_annotmatch_rowids_from_aid2(aid_list)
# unflat_rowids1 = ibs.get_annotmatch_rowids_from_aid(aids1)
# unflat_rowids2 = ibs.get_annotmatch_rowids_from_aid(aids2)
# am_rowids1 = {r for r in ut.iflatten(unflat_rowids1) if r is not None}
# am_rowids2 = {r for r in ut.iflatten(unflat_rowids2) if r is not None}
# ams = sorted(am_rowids1.intersection(am_rowids2))
# ams = ut.isect(am_rowids1, am_rowids2)
elif method == 2:
# Strategy 2: enumerate what rows could exist and see what does exist
# This is better when the enumerated set of rows would be smaller than
# the database size
edges = list(ut.product_nonsame(aids1, aids2))
if len(edges) == 0:
ams = []
else:
aids1_, aids2_ = ut.listT(edges)
# ams = ibs.get_annotmatch_rowid_from_undirected_superkey(aids1_, aids2_)
ams = ibs.get_annotmatch_rowid_from_superkey(aids1_, aids2_)
if ams is None:
ams = []
ams = ut.filter_Nones(ams)
return ams
[docs]@register_ibs_method
def add_annotmatch_undirected(ibs, aids1, aids2, **kwargs):
if len(aids1) == 0 and len(aids2) == 0:
return []
edges = list(zip(aids1, aids2))
from wbia.algo.graph import nx_utils as nxu
# Enforce new undirected constraint
edges = ut.estarmap(nxu.e_, edges)
aids1, aids2 = list(zip(*edges))
am_rowids = ibs.get_annotmatch_rowid_from_undirected_superkey(aids1, aids2)
idxs = ut.where([r is None for r in am_rowids])
# Check which ones are None
aids1_ = ut.take(aids1, idxs)
aids2_ = ut.take(aids2, idxs)
# Create anything that is None
am_rowids_ = ibs.add_annotmatch(aids2_, aids1_)
# Use the other rowid if found
for idx, rowid in zip(idxs, am_rowids_):
am_rowids[idx] = rowid
return am_rowids
[docs]@register_ibs_method
def get_annot_pair_timedelta(ibs, aid_list1, aid_list2):
r"""
Args:
ibs (IBEISController): wbia controller object
aid_list1 (int): list of annotation ids
aid_list2 (int): list of annotation ids
Returns:
list: timedelta_list
CommandLine:
python -m wbia.annotmatch_funcs --test-get_annot_pair_timedelta
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('PZ_MTEST')
>>> aid_list = ibs.get_valid_aids(hasgt=True)
>>> unixtimes = ibs.get_annot_image_unixtimes_asfloat(aid_list)
>>> aid_list = ut.compress(aid_list, ~np.isnan(unixtimes))
>>> gt_aids_list = ibs.get_annot_groundtruth(aid_list, daid_list=aid_list)
>>> flags = np.array(list(map(len, gt_aids_list))) > 0
>>> aid_list1 = ut.compress(aid_list, flags)[0:5]
>>> aid_list2 = ut.take_column(gt_aids_list, 0)[0:5]
>>> timedelta_list = ibs.get_annot_pair_timedelta(aid_list1, aid_list2)
>>> result = ut.repr2(timedelta_list, precision=1)
>>> print(result)
np.array([7.6e+07, 7.6e+07, 2.4e+06, 2.0e+08, 9.7e+07])
"""
unixtime_list1 = ibs.get_annot_image_unixtimes_asfloat(aid_list1)
unixtime_list2 = ibs.get_annot_image_unixtimes_asfloat(aid_list2)
timedelta_list = np.abs(unixtime_list1 - unixtime_list2)
return timedelta_list
[docs]@register_ibs_method
def get_annotedge_timedelta(ibs, edges):
return ibs.get_annot_pair_timedelta(*zip(*edges))
[docs]@register_ibs_method
def get_annotedge_viewdist(ibs, edges):
edges = np.array(edges)
unique_annots = ibs.annots(np.unique(edges)).view()
annots1 = unique_annots.view(edges.T[0])
annots2 = unique_annots.view(edges.T[1])
view_ints1 = annots1.viewpoint_int
view_ints2 = annots2.viewpoint_int
DIST = ibs.const.VIEW.DIST
view_dists = [
DIST[tup] if tup in DIST else DIST[tup[::-1]]
for tup in zip(view_ints1, view_ints2)
]
view_dists = np.array(ut.replace_nones(view_dists, np.nan))
return view_dists
[docs]@register_ibs_method
def get_annot_has_reviewed_matching_aids(ibs, aid_list, eager=True, nInput=None):
num_reviewed_list = ibs.get_annot_num_reviewed_matching_aids(aid_list)
has_reviewed_list = [num_reviewed > 0 for num_reviewed in num_reviewed_list]
return has_reviewed_list
[docs]@register_ibs_method
def get_annot_num_reviewed_matching_aids(ibs, aid1_list, eager=True, nInput=None):
r"""
Args:
aid_list (int): list of annotation ids
eager (bool):
nInput (None):
Returns:
list: num_annot_reviewed_list
CommandLine:
python -m wbia.annotmatch_funcs --test-get_annot_num_reviewed_matching_aids
Example:
>>> # DISABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('testdb2')
>>> aid1_list = ibs.get_valid_aids()
>>> eager = True
>>> nInput = None
>>> num_annot_reviewed_list = get_annot_num_reviewed_matching_aids(ibs, aid_list, eager, nInput)
>>> result = str(num_annot_reviewed_list)
>>> print(result)
"""
aids_list = ibs.get_annot_reviewed_matching_aids(
aid1_list, eager=eager, nInput=nInput
)
num_annot_reviewed_list = list(map(len, aids_list))
return num_annot_reviewed_list
[docs]@register_ibs_method
def get_annot_reviewed_matching_aids(ibs, aid_list, eager=True, nInput=None):
"""
Returns a list of the aids that were reviewed as candidate matches to the input aid
"""
ANNOT_ROWID1 = 'annot_rowid1'
ANNOT_ROWID2 = 'annot_rowid2'
params_iter = [(aid,) for aid in aid_list]
colnames = (ANNOT_ROWID2,)
where_colnames = (ANNOT_ROWID1,)
aids_list = ibs.db.get_where_eq(
ibs.const.ANNOTMATCH_TABLE,
colnames,
params_iter,
where_colnames,
eager=eager,
unpack_scalars=False,
nInput=nInput,
)
return aids_list
[docs]@register_ibs_method
def get_annotmatch_aids(ibs, annotmatch_rowid_list):
ANNOT_ROWID1 = 'annot_rowid1'
ANNOT_ROWID2 = 'annot_rowid2'
id_iter = annotmatch_rowid_list
colnames = (ANNOT_ROWID1, ANNOT_ROWID2)
aid_pairs = ibs.db.get(
ibs.const.ANNOTMATCH_TABLE, colnames, id_iter, id_colname='rowid'
)
return aid_pairs
[docs]@register_ibs_method
def get_annot_pair_is_reviewed(ibs, aid1_list, aid2_list):
r"""
Args:
aid1_list (list):
aid2_list (list):
Returns:
list: annotmatch_reviewed_list
CommandLine:
python -m wbia.annotmatch_funcs --test-get_annot_pair_is_reviewed
Example:
>>> # DISABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('testdb2')
>>> aid_list = ibs.get_valid_aids()
>>> pairs = list(ut.product(aid_list, aid_list))
>>> aid1_list = ut.get_list_column(pairs, 0)
>>> aid2_list = ut.get_list_column(pairs, 1)
>>> annotmatch_reviewed_list = get_annot_pair_is_reviewed(ibs, aid1_list, aid2_list)
>>> reviewed_pairs = ut.compress(pairs, annotmatch_reviewed_list)
>>> result = len(reviewed_pairs)
>>> print(result)
104
"""
am_rowids = ibs.get_annotmatch_rowid_from_undirected_superkey(aid1_list, aid2_list)
return [
None if user is None else user.startswith('user:')
for user in ibs.get_annotmatch_reviewer(am_rowids)
]
[docs]@register_ibs_method
def set_annot_pair_as_reviewed(ibs, aid1, aid2):
"""denote that this match was reviewed and keep whatever status it is given"""
isunknown1, isunknown2 = ibs.is_aid_unknown([aid1, aid2])
if isunknown1 or isunknown2:
truth = ibs.const.EVIDENCE_DECISION.UNKNOWN
else:
nid1, nid2 = ibs.get_annot_name_rowids((aid1, aid2))
truth = (
ibs.const.EVIDENCE_DECISION.POSITIVE
if (nid1 == nid2)
else ibs.const.EVIDENCE_DECISION.NEGATIVE
)
# Ensure a row exists for this pair
annotmatch_rowids = ibs.add_annotmatch_undirected([aid1], [aid2])
# Old functionality, remove. Reviewing should not set truth
confidence = ibs.const.CONFIDENCE.CODE_TO_INT['guessing']
ibs.set_annotmatch_evidence_decision(annotmatch_rowids, [truth])
user_id = ut.get_user_name() + '@' + ut.get_computer_name()
ibs.set_annotmatch_reviewer(annotmatch_rowids, ['user:' + user_id])
ibs.set_annotmatch_confidence(annotmatch_rowids, [confidence])
logger.info('... set truth=%r' % (truth,))
[docs]@register_ibs_method
def set_annot_pair_as_positive_match(
ibs, aid1, aid2, dryrun=False, on_nontrivial_merge=None, logger_=None
):
"""
Safe way to perform links. Errors on invalid operations.
TODO: ELEVATE THIS FUNCTION
Change into make_task_set_annot_pair_as_positive_match and it returns what
needs to be done.
Need to test several cases:
uknown, unknown
knownA, knownA
knownB, knownA
unknown, knownA
knownA, unknown
Args:
ibs (IBEISController): wbia controller object
aid1 (int): query annotation id
aid2 (int): matching annotation id
CommandLine:
python -m wbia.annotmatch_funcs --test-set_annot_pair_as_positive_match
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('testdb1')
>>> aid1, aid2 = ibs.get_valid_aids()[0:2]
>>> dryrun = True
>>> status = set_annot_pair_as_positive_match(ibs, aid1, aid2, dryrun)
>>> print(status)
"""
def _set_annot_name_rowids(aid_list, nid_list):
if not ut.QUIET:
logger.info(
'... _set_annot_name_rowids(aids=%r, nids=%r)' % (aid_list, nid_list)
)
logger.info('... names = %r' % (ibs.get_name_texts(nid_list)))
assert len(aid_list) == len(nid_list), 'list must correspond'
if not dryrun:
if logger_ is not None:
log = logger_.info
previous_names = ibs.get_annot_names(aid_list)
new_names = ibs.get_name_texts(nid_list)
annot_uuids = ibs.get_annot_uuids(aid_list)
annot_uuid_pair = ibs.get_annot_uuids((aid1, aid2))
log(
(
'REVIEW_PAIR AS TRUE: (annot_uuid_pair=%r) '
'CHANGE NAME of %d (annot_uuids=%r) '
'WITH (previous_names=%r) to (new_names=%r)'
)
% (
annot_uuid_pair,
len(annot_uuids),
annot_uuids,
previous_names,
new_names,
)
)
ibs.set_annot_name_rowids(aid_list, nid_list)
ibs.set_annot_pair_as_reviewed(aid1, aid2)
# Return the new annots in this name
_aids_list = ibs.get_name_aids(nid_list)
_combo_aids_list = [_aids + [aid] for _aids, aid, in zip(_aids_list, aid_list)]
status = _combo_aids_list
return status
logger.info('[marking_match] aid1 = %r, aid2 = %r' % (aid1, aid2))
nid1, nid2 = ibs.get_annot_name_rowids([aid1, aid2])
if nid1 == nid2:
logger.info('...images already matched')
status = None
ibs.set_annot_pair_as_reviewed(aid1, aid2)
if logger_ is not None:
log = logger_.info
annot_uuid_pair = ibs.get_annot_uuids((aid1, aid2))
log('REVIEW_PAIR AS TRUE: (annot_uuid_pair=%r) NO CHANGE' % annot_uuid_pair)
else:
isunknown1, isunknown2 = ibs.is_aid_unknown([aid1, aid2])
if isunknown1 and isunknown2:
logger.info('...match unknown1 to unknown2 into 1 new name')
next_nids = ibs.make_next_nids(num=1)
status = _set_annot_name_rowids([aid1, aid2], next_nids * 2)
elif not isunknown1 and not isunknown2:
logger.info('...merge known1 into known2')
aid1_and_groundtruth = ibs.get_annot_groundtruth(aid1, noself=False)
aid2_and_groundtruth = ibs.get_annot_groundtruth(aid2, noself=False)
trivial_merge = (
len(aid1_and_groundtruth) == 1 and len(aid2_and_groundtruth) == 1
)
if not trivial_merge:
if on_nontrivial_merge is None:
raise Exception('no function is set up to handle nontrivial merges!')
else:
on_nontrivial_merge(ibs, aid1, aid2)
status = _set_annot_name_rowids(
aid1_and_groundtruth, [nid2] * len(aid1_and_groundtruth)
)
elif isunknown2 and not isunknown1:
logger.info('...match unknown2 into known1')
status = _set_annot_name_rowids([aid2], [nid1])
elif isunknown1 and not isunknown2:
logger.info('...match unknown1 into known2')
status = _set_annot_name_rowids([aid1], [nid2])
else:
raise AssertionError('impossible state')
return status
[docs]@register_ibs_method
def set_annot_pair_as_negative_match(
ibs, aid1, aid2, dryrun=False, on_nontrivial_split=None, logger_=None
):
"""
TODO: ELEVATE THIS FUNCTION
Args:
ibs (IBEISController): wbia controller object
aid1 (int): annotation id
aid2 (int): annotation id
dryrun (bool):
CommandLine:
python -m wbia.annotmatch_funcs --test-set_annot_pair_as_negative_match
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('testdb1')
>>> aid1, aid2 = ibs.get_valid_aids()[0:2]
>>> dryrun = True
>>> result = set_annot_pair_as_negative_match(ibs, aid1, aid2, dryrun)
>>> print(result)
>>> ibs.delete_names(ibs.get_valid_nids()[-1]) # clean up
"""
def _set_annot_name_rowids(aid_list, nid_list):
logger.info('... _set_annot_name_rowids(%r, %r)' % (aid_list, nid_list))
if not dryrun:
if logger_ is not None:
log = logger_.info
previous_names = ibs.get_annot_names(aid_list)
new_names = ibs.get_name_texts(nid_list)
annot_uuids = ibs.get_annot_uuids(aid_list)
annot_uuid_pair = ibs.get_annot_uuids((aid1, aid2))
log(
(
'REVIEW_PAIR AS FALSE: (annot_uuid_pair=%r) '
'CHANGE NAME of %d (annot_uuids=%r) '
'WITH (previous_names=%r) to (new_names=%r)'
)
% (
annot_uuid_pair,
len(annot_uuids),
annot_uuids,
previous_names,
new_names,
)
)
ibs.set_annot_name_rowids(aid_list, nid_list)
ibs.set_annot_pair_as_reviewed(aid1, aid2)
nid1, nid2 = ibs.get_annot_name_rowids([aid1, aid2])
if nid1 == nid2:
logger.info(
'images are marked as having the same name... we must tread carefully'
)
aid1_groundtruth = ibs.get_annot_groundtruth(aid1, noself=True)
if len(aid1_groundtruth) == 1 and aid1_groundtruth == [aid2]:
# this is the only safe case for same name split
# Change so the names are not the same
next_nids = ibs.make_next_nids(num=1)
status = _set_annot_name_rowids([aid1], next_nids)
else:
if on_nontrivial_split is None:
raise Exception('no function is set up to handle nontrivial splits!')
else:
on_nontrivial_split(ibs, aid1, aid2)
else:
isunknown1, isunknown2 = ibs.is_aid_unknown([aid1, aid2])
if isunknown1 and isunknown2:
logger.info('...nomatch unknown1 and unknown2 into 2 new names')
next_nids = ibs.make_next_nids(num=2)
status = _set_annot_name_rowids([aid1, aid2], next_nids)
elif not isunknown1 and not isunknown2:
logger.info('...nomatch known1 and known2... nothing to do (yet)')
ibs.set_annot_pair_as_reviewed(aid1, aid2)
status = None
if logger_ is not None:
log = logger_.info
annot_uuid_pair = ibs.get_annot_uuids((aid1, aid2))
log(
'REVIEW_PAIR AS FALSE: (annot_uuid_pair=%r) NO CHANGE'
% annot_uuid_pair
)
elif isunknown2 and not isunknown1:
logger.info('...nomatch unknown2 -> newname and known1')
next_nids = ibs.make_next_nids(num=1)
status = _set_annot_name_rowids([aid2], next_nids)
elif isunknown1 and not isunknown2:
logger.info('...nomatch unknown1 -> newname and known2')
next_nids = ibs.make_next_nids(num=1)
status = _set_annot_name_rowids([aid1], next_nids)
else:
raise AssertionError('impossible state')
return status
[docs]@register_ibs_method
def get_match_truth(ibs, aid1, aid2):
return ibs.get_match_truths([aid1], [aid2])[0]
[docs]@register_ibs_method
def get_match_truths(ibs, aids1, aids2):
r"""
Uses NIDS to verify truth.
TODO: rectify with annotmatch table
Args:
ibs (IBEISController): wbia controller object
aids1 (list):
aids2 (list):
Returns:
list[int]: truth_codes - see
wbia.constants.EVIDENCE_DECISION.INT_TO_CODE for code definitions
CommandLine:
python -m wbia.other.ibsfuncs --test-get_match_truths
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.annotmatch_funcs import * # NOQA
>>> import wbia
>>> ibs = wbia.opendb('testdb1')
>>> aids1 = ibs.get_valid_aids()
>>> aids2 = ut.list_roll(ibs.get_valid_aids(), -1)
>>> truth_codes = get_match_truths(ibs, aids1, aids2)
>>> print('truth_codes = %s' % ut.repr2(truth_codes))
>>> target = np.array([3, 1, 3, 3, 1, 0, 0, 3, 3, 3, 3, 0, 3])
>>> assert np.all(truth_codes == target)
"""
nids1 = np.array(ibs.get_annot_name_rowids(aids1))
nids2 = np.array(ibs.get_annot_name_rowids(aids2))
isunknowns1 = np.array(ibs.is_nid_unknown(nids1))
isunknowns2 = np.array(ibs.is_nid_unknown(nids2))
any_unknown = np.logical_or(isunknowns1, isunknowns2)
truth_codes = np.array((nids1 == nids2), dtype=np.int32)
truth_codes[any_unknown] = ibs.const.EVIDENCE_DECISION.UNKNOWN
return truth_codes
[docs]@register_ibs_method
def get_match_text(ibs, aid1, aid2):
truth = ibs.get_match_truth(aid1, aid2)
text = ibs.const.EVIDENCE_DECISION.INT_TO_NICE.get(truth, None)
return text