def setup_dummy_menus(): r""" CommandLine: python -m wbia.gui.guimenus --test-setup_dummy_menus Example: >>> # DISABLE_DOCTEST >>> from wbia.gui.guimenus import * # NOQA >>> result = setup_dummy_menus() >>> print(result) """ # import unittest import wbia.guitool as gt gt.ensure_qapp() # must be ensured before any embeding mainwin = gt.QtWidgets.QMainWindow() back = DummyBack() import mock mainwin.expand_names_tree = mock.Mock setup_menus(mainwin, back) mainwin.show() mainwin.resize(600, 100) # ut.embed() gt.qtapp_loop(mainwin, frequency=100)
def simple_api_item_widget(): r""" Very simple example of basic APIItemWidget widget with CustomAPI CommandLine: python -m wbia.guitool.api_item_widget --test-simple_api_item_widget python -m wbia.guitool.api_item_widget --test-simple_api_item_widget --show Example: >>> # ENABLE_DOCTEST >>> # xdoctest: +REQUIRES(--gui) >>> from wbia.guitool.api_item_widget import * # NOQA >>> import wbia.guitool as gt >>> gt.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_api_item_widget() >>> # xdoctest: +REQUIRES(--show) >>> ut.quit_if_noshow() >>> wgt.show() >>> gt.qtapp_loop(wgt, frequency=100) """ import wbia.guitool as gt gt.ensure_qapp() col_getter_dict = { 'col1': [1, 2, 3], 'col2': ['a', 'b', 'c'], 'col3': ['e', 'f', 'g'], } sortby = 'col1' # col_display_role_func_dict = { # 'col1': lambda x: 'banana %d' % ((x * 100 % 23)), # } api = gt.CustomAPI( col_getter_dict=col_getter_dict, # col_display_role_func_dict=col_display_role_func_dict, editable_colnames=['col3'], sortby=sortby, ) headers = api.make_headers(tblnice='Simple Example') wgt = gt.APIItemWidget() wgt.change_headers(headers) # gt.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) # for testing wgt.menubar = gt.newMenubar(wgt) wgt.menuFile = wgt.menubar.newMenu('Dev') def wgt_embed(wgt): view = wgt.view # NOQA import utool utool.embed() ut.inject_func_as_method(wgt, wgt_embed) wgt.menuFile.newAction(triggered=wgt.wgt_embed) return wgt
def make_qt_dialog(cfg, parent=None, title='Edit Config', msg='Confim'): import wbia.guitool as gt gt.ensure_qapp() # must be ensured before any embeding dlg = gt.ConfigConfirmWidget.as_dialog(title=title, msg=msg, config=cfg) dlg.resize(700, 500) dlg.show() return dlg
def simple_api_tree_widget(): r""" Minimal example of a tree based api widget CommandLine: python -m wbia.guitool.api_item_widget --test-simple_api_tree_widget python -m wbia.guitool.api_item_widget --test-simple_api_tree_widget --show Example: >>> # ENABLE_DOCTEST >>> # xdoctest: +REQUIRES(--gui) >>> from wbia.guitool.api_item_widget import * # NOQA >>> import wbia.guitool >>> guitool.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_api_tree_widget() >>> # xdoctest: +REQUIRES(--show) >>> ut.quit_if_noshow() >>> wgt.show() >>> guitool.qtapp_loop(wgt, frequency=100) """ guitool.ensure_qapp() col_name_list = ['name', 'num_annots', 'annots'] col_getter_dict = { 'name': ['fred', 'sue', 'tom', 'mary', 'paul'], 'num_annots': [2, 1, 3, 5, 1], } # make consistent data grouped_data = [ [col_getter_dict['name'][index] + '-' + str(i) for i in range(num)] for index, num in enumerate(col_getter_dict['num_annots']) ] flat_data, reverse_list = ut.invertible_flatten1(grouped_data) col_getter_dict['annots'] = flat_data iders = [list(range(len(col_getter_dict['name']))), reverse_list] col_level_dict = { 'name': 0, 'num_annots': 0, 'annots': 1, } sortby = 'name' api = guitool.CustomAPI( col_name_list=col_name_list, col_getter_dict=col_getter_dict, sortby=sortby, iders=iders, col_level_dict=col_level_dict, ) headers = api.make_headers(tblnice='Tree Example') wgt = guitool.APIItemWidget(view_class=APITreeView) wgt.change_headers(headers) # guitool.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) return wgt
def qt_edge_reviewer(infr, edge=None): import wbia.guitool as gt gt.ensure_qapp() from wbia.viz import viz_graph2 infr.manual_wgt = viz_graph2.AnnotPairDialog( edge=edge, infr=infr, standalone=False, cfgdict=infr.verifier_params ) if edge is not None: # infr.emit_manual_review(edge, priority=None) infr.manual_wgt.seek(0) # infr.manual_wgt.show() return infr.manual_wgt
def launch_review_matches_interface(ibs, cm_list, dodraw=False, filter_reviewed=False): """ TODO: move to a more general function """ from wbia.gui import inspect_gui gt.ensure_qapp() # backend_callback = back.front.update_tables backend_callback = None review_cfg = dict(filter_reviewed=filter_reviewed) qres_wgt = inspect_gui.QueryResultsWidget( ibs, cm_list, callback=backend_callback, review_cfg=review_cfg ) if dodraw: qres_wgt.show() qres_wgt.raise_() return qres_wgt
def testdata_tree_view(): r""" CommandLine: python -m wbia.guitool.api_tree_view testdata_tree_view python -m wbia.guitool.api_tree_view testdata_tree_view --show Example: >>> # DISABLE_DOCTEST >>> # xdoctest: +REQUIRES(--gui) >>> import wbia.guitool as gt >>> from wbia.guitool.api_tree_view import * # NOQA >>> wgt = testdata_tree_view() >>> view = wgt.view >>> rows = view.selectedRows() >>> print('rows = %r' % (rows,)) >>> # xdoctest: +REQUIRES(--show) >>> ut.quit_if_noshow() >>> gt.qtapp_loop(qwin=wgt) """ import wbia.guitool as gt gt.ensure_qapp() col_name_list = ['name', 'num_annots', 'annots'] col_getter_dict = { 'name': ['fred', 'sue', 'tom', 'mary', 'paul'], 'num_annots': [2, 1, 3, 5, 1], } # make consistent data grouped_data = [[ col_getter_dict['name'][index] + '-' + str(i) for i in range(num) ] for index, num in enumerate(col_getter_dict['num_annots'])] flat_data, reverse_list = ut.invertible_flatten1(grouped_data) col_getter_dict['annots'] = flat_data iders = [list(range(len(col_getter_dict['name']))), reverse_list] col_level_dict = { 'name': 0, 'num_annots': 0, 'annots': 1, } sortby = 'name' api = gt.CustomAPI( col_name_list=col_name_list, col_getter_dict=col_getter_dict, sortby=sortby, iders=iders, col_level_dict=col_level_dict, ) headers = api.make_headers(tblnice='Tree Example') wgt = gt.APIItemWidget(view_class=APITreeView) wgt.change_headers(headers) wgt.menubar = gt.newMenubar(wgt) wgt.menuFile = wgt.menubar.newMenu('Dev') def wgt_embed(wgt): view = wgt.view # NOQA import utool utool.embed() ut.inject_func_as_method(wgt, wgt_embed) wgt.menuFile.newAction(triggered=wgt.wgt_embed) return wgt
def simple_thumbnail_widget(): r""" Very simple example to test thumbnails CommandLine: python -m wbia.guitool.api_thumb_delegate --test-simple_thumbnail_widget --show --verbthumb python -m wbia.guitool.api_thumb_delegate --test-simple_thumbnail_widget --show --tb Example: >>> # GUI_DOCTEST >>> # xdoctest: +REQUIRES(--gui) >>> from wbia.guitool.api_thumb_delegate import * # NOQA >>> import wbia.guitool >>> guitool.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_thumbnail_widget() >>> ut.quit_if_noshow() >>> wgt.show() >>> guitool.qtapp_loop(wgt, frequency=100) """ from wbia import guitool guitool.ensure_qapp() col_name_list = ['rowid', 'image_name', 'thumb'] col_types_dict = { 'thumb': 'PIXMAP', } guitool_test_thumbdir = ut.ensure_app_resource_dir('guitool', 'thumbs') ut.delete(guitool_test_thumbdir) ut.ensuredir(guitool_test_thumbdir) import vtool as vt from os.path import join # imgname_list = sorted(ut.TESTIMG_URL_DICT.keys()) imgname_list = ['carl.jpg', 'lena.png', 'patsy.jpg'] imgname_list += ['doesnotexist.jpg'] num_imgs = list(range(len(imgname_list))) # num_imgs = list(range(500)) def thread_func(would_be, id_): from vtool.fontdemo import get_text_test_img get_text_test_img(id_) def thumb_getter(id_, thumbsize=128): """ Thumb getters must conform to thumbtup structure """ if id_ not in imgname_list: return { 'fpath': id_ + '.jpg', 'thread_func': thread_func, 'main_func': lambda: (id_, ), } # print(id_) if id_ == 'doesnotexist.jpg': return None img_path = None img_size = (100, 100) else: img_path = ut.grab_test_imgpath(id_, verbose=False) img_size = vt.open_image_size(img_path) thumb_path = join(guitool_test_thumbdir, ut.hashstr(str(img_path)) + '.jpg') if id_ == 'carl.jpg': bbox_list = [(10, 10, 200, 200)] theta_list = [0] elif id_ == 'lena.png': # bbox_list = [(10, 10, 200, 200)] bbox_list = [None] theta_list = [None] else: bbox_list = [] theta_list = [] interest_list = [False] thumbtup = (thumb_path, img_path, img_size, bbox_list, theta_list, interest_list) # print('thumbtup = %r' % (thumbtup,)) return thumbtup # return None def imgname_getter(rowid): if rowid < len(imgname_list): return imgname_list[rowid] else: return str(rowid) col_getter_dict = { 'rowid': num_imgs, 'image_name': imgname_getter, 'thumb': thumb_getter, } col_ider_dict = { 'thumb': 'image_name', } col_setter_dict = {} editable_colnames = [] sortby = 'rowid' def get_thumb_size(): return 128 # get_thumb_size = lambda: 128 # NOQA col_width_dict = {} col_bgrole_dict = {} api = guitool.CustomAPI( col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, True, col_width_dict, ) headers = api.make_headers(tblnice='Utool Test Images') wgt = guitool.APIItemWidget() wgt.change_headers(headers) wgt.resize(600, 400) # guitool.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) return wgt
def fix_annotmatch_pzmaster1(): """ PZ_Master1 had annotmatch rowids that did not agree with the current name labeling. Looking at the inconsistencies in the graph interface was too cumbersome, because over 3000 annots were incorrectly grouped together. This function deletes any annotmatch rowid that is not consistent with the current labeling so we can go forward with using the new AnnotInference object """ import wbia ibs = wbia.opendb('PZ_Master1') infr = wbia.AnnotInference(ibs=ibs, aids=ibs.get_valid_aids(), verbose=5) infr.initialize_graph() annots = ibs.annots() aid_to_nid = ut.dzip(annots.aids, annots.nids) if False: infr.reset_feedback() infr.ensure_mst() infr.apply_feedback_edges() infr.relabel_using_reviews() infr.start_qt_interface() # Get annotmatch rowids that agree with current labeling if False: annotmatch = ibs.db.get_table_as_pandas('annotmatch') import pandas as pd flags1 = pd.isnull(annotmatch['annotmatch_evidence_decision']) flags2 = annotmatch['annotmatch_tag_text'] == '' bad_part = annotmatch[flags1 & flags2] rowids = bad_part.index.tolist() ibs.delete_annotmatch(rowids) if False: # Delete bidirectional annotmatches annotmatch = ibs.db.get_table_as_pandas('annotmatch') df = annotmatch.set_index(['annot_rowid1', 'annot_rowid2']) # Find entires that have both directions pairs1 = annotmatch[['annot_rowid1', 'annot_rowid2']].values f_edges = {tuple(p) for p in pairs1} b_edges = {tuple(p[::-1]) for p in pairs1} isect_edges = {tuple(sorted(p)) for p in b_edges.intersection(f_edges)} isect_edges1 = list(isect_edges) isect_edges2 = [p[::-1] for p in isect_edges] # cols = ['annotmatch_evidence_decision', 'annotmatch_tag_text'] import pandas as pd custom_ = { (559, 4909): (False, ['photobomb']), (7918, 8041): (False, ['photobomb']), (6634, 6754): (False, ['photobomb']), (3707, 3727): (False, ['photobomb']), (86, 103): (False, ['photobomb']), } extra_ = {} fixme_edges = [] d1 = df.loc[isect_edges1].reset_index(drop=False) d2 = df.loc[isect_edges2].reset_index(drop=False) flags = d1['annotmatch_evidence_decision'] != d2[ 'annotmatch_evidence_decision'] from wbia.tag_funcs import _parse_tags for f, r1, r2 in zip(flags, d1.iterrows(), d2.iterrows()): v1, v2 = r1[1], r2[1] aid1 = v1['annot_rowid1'] aid2 = v1['annot_rowid2'] truth_real = (ibs.const.EVIDENCE_DECISION.POSITIVE if aid_to_nid[aid1] == aid_to_nid[aid2] else ibs.const.EVIDENCE_DECISION.NEGATIVE) truth1 = v1['annotmatch_evidence_decision'] truth2 = v2['annotmatch_evidence_decision'] t1 = _parse_tags(v1['annotmatch_tag_text']) t2 = _parse_tags(v2['annotmatch_tag_text']) newtag = ut.union_ordered(t1, t2) if (aid1, aid2) in custom_: continue fixme_flag = False if not pd.isnull(truth1): if truth_real != truth1: fixme_flag = True if not pd.isnull(truth2): if truth_real != truth2: fixme_flag = True if fixme_flag: logger.info('newtag = %r' % (newtag, )) logger.info('truth_real = %r' % (truth_real, )) logger.info('truth1 = %r' % (truth1, )) logger.info('truth2 = %r' % (truth2, )) logger.info('aid1 = %r' % (aid1, )) logger.info('aid2 = %r' % (aid2, )) fixme_edges.append((aid1, aid2)) else: extra_[(aid1, aid2)] = (truth_real, newtag) extra_.update(custom_) new_pairs = extra_.keys() new_truths = ut.take_column(ut.dict_take(extra_, new_pairs), 0) new_tags = ut.take_column(ut.dict_take(extra_, new_pairs), 1) new_tag_texts = [';'.join(t) for t in new_tags] aids1, aids2 = ut.listT(new_pairs) # Delete the old ibs.delete_annotmatch((d1['annotmatch_rowid'].values.tolist() + d2['annotmatch_rowid'].values.tolist())) # Add the new ams = ibs.add_annotmatch_undirected(aids1, aids2) ibs.set_annotmatch_evidence_decision(ams, new_truths) ibs.set_annotmatch_tag_text(ams, new_tag_texts) if False: import wbia.guitool as gt gt.ensure_qapp() ut.qtensure() from wbia.gui import inspect_gui inspect_gui.show_vsone_tuner(ibs, aid1, aid2) # pairs2 = pairs1.T[::-1].T # idx1, idx2 = ut.isect_indices(list(map(tuple, pairs1)), # list(map(tuple, pairs2))) # r_edges = list(set(map(tuple, map(sorted, pairs1[idx1])))) # unique_pairs = list(set(map(tuple, map(sorted, pairs1[idx1])))) # df = annotmatch.set_index(['annot_rowid1', 'annot_rowid2']) x = ut.ddict(list) annotmatch = ibs.db.get_table_as_pandas('annotmatch') import ubelt as ub _iter = annotmatch.iterrows() prog = ub.ProgIter(_iter, length=len(annotmatch)) for k, m in prog: aid1 = m['annot_rowid1'] aid2 = m['annot_rowid2'] if m['annotmatch_evidence_decision'] == ibs.const.EVIDENCE_DECISION.POSITIVE: if aid_to_nid[aid1] == aid_to_nid[aid2]: x['agree1'].append(k) else: x['disagree1'].append(k) elif m['annotmatch_evidence_decision'] == ibs.const.EVIDENCE_DECISION.NEGATIVE: if aid_to_nid[aid1] == aid_to_nid[aid2]: x['disagree2'].append(k) else: x['agree2'].append(k) ub.map_vals(len, x) ut.dict_hist(annotmatch.loc[x['disagree1']]['annotmatch_tag_text']) disagree1 = annotmatch.loc[x['disagree1']] pb_disagree1 = disagree1[disagree1['annotmatch_tag_text'] == 'photobomb'] aids1 = pb_disagree1['annot_rowid1'].values.tolist() aids2 = pb_disagree1['annot_rowid2'].values.tolist() aid_pairs = list(zip(aids1, aids2)) infr = wbia.AnnotInference.from_pairs(aid_pairs, ibs=ibs, verbose=5) if False: feedback = infr.read_wbia_annotmatch_feedback(edges=infr.edges()) infr.external_feedback = feedback infr.apply_feedback_edges() infr.start_qt_interface(loop=False) # Delete these values if False: nonpb_disagree1 = disagree1[ disagree1['annotmatch_tag_text'] != 'photobomb'] disagree2 = annotmatch.loc[x['disagree2']] ibs.delete_annotmatch(nonpb_disagree1['annotmatch_rowid']) ibs.delete_annotmatch(disagree2['annotmatch_rowid']) # ut.dict_hist(disagree1['annotmatch_tag_text']) import networkx as nx graph = nx.Graph() graph.add_edges_from( zip(pb_disagree1['annot_rowid1'], pb_disagree1['annot_rowid2'])) list(nx.connected_components(graph)) set(annotmatch.loc[x['disagree2']]['annotmatch_tag_text'])
def fix_bidirectional_annotmatch(ibs): import wbia infr = wbia.AnnotInference(ibs=ibs, aids='all', verbose=5) infr.initialize_graph() annots = ibs.annots() aid_to_nid = ut.dzip(annots.aids, annots.nids) # Delete bidirectional annotmatches annotmatch = ibs.db.get_table_as_pandas('annotmatch') df = annotmatch.set_index(['annot_rowid1', 'annot_rowid2']) # Find entires that have both directions pairs1 = annotmatch[['annot_rowid1', 'annot_rowid2']].values f_edges = {tuple(p) for p in pairs1} b_edges = {tuple(p[::-1]) for p in pairs1} isect_edges = {tuple(sorted(p)) for p in b_edges.intersection(f_edges)} logger.info('Found %d bidirectional edges' % len(isect_edges)) isect_edges1 = list(isect_edges) isect_edges2 = [p[::-1] for p in isect_edges] import pandas as pd extra_ = {} fixme_edges = [] d1 = df.loc[isect_edges1].reset_index(drop=False) d2 = df.loc[isect_edges2].reset_index(drop=False) flags = d1['annotmatch_evidence_decision'] != d2[ 'annotmatch_evidence_decision'] from wbia.tag_funcs import _parse_tags for f, r1, r2 in zip(flags, d1.iterrows(), d2.iterrows()): v1, v2 = r1[1], r2[1] aid1 = v1['annot_rowid1'] aid2 = v1['annot_rowid2'] truth_real = (ibs.const.EVIDENCE_DECISION.POSITIVE if aid_to_nid[aid1] == aid_to_nid[aid2] else ibs.const.EVIDENCE_DECISION.NEGATIVE) truth1 = v1['annotmatch_evidence_decision'] truth2 = v2['annotmatch_evidence_decision'] t1 = _parse_tags(v1['annotmatch_tag_text']) t2 = _parse_tags(v2['annotmatch_tag_text']) newtag = ut.union_ordered(t1, t2) fixme_flag = False if not pd.isnull(truth1): if truth_real != truth1: fixme_flag = True if not pd.isnull(truth2): if truth_real != truth2: fixme_flag = True if fixme_flag: logger.info('--') logger.info('t1, t2 = %r, %r' % (t1, t2)) logger.info('newtag = %r' % (newtag, )) logger.info('truth_real, truth1, truth2 = %r, %r, %r' % (truth_real, truth1, truth2)) logger.info('aid1, aid2 = %r, %r' % (aid1, aid2)) fixme_edges.append(tuple(sorted((aid1, aid2)))) else: extra_[(aid1, aid2)] = (truth_real, newtag) if len(fixme_edges) > 0: # need to manually fix these edges fix_infr = wbia.AnnotInference.from_pairs(fixme_edges, ibs=ibs, verbose=5) feedback = fix_infr.read_wbia_annotmatch_feedback( only_existing_edges=True) infr = fix_infr fix_infr.external_feedback = feedback fix_infr.apply_feedback_edges() fix_infr.start_qt_interface(loop=False) # DELETE OLD EDGES TWICE ams = ibs.get_annotmatch_rowid_from_edges(fixme_edges) ibs.delete_annotmatch(ams) ams = ibs.get_annotmatch_rowid_from_edges(fixme_edges) ibs.delete_annotmatch(ams) # MANUALLY CALL THIS ONCE FINISHED # TO ONLY CHANGE ANNOTMATCH EDGES infr.write_wbia_staging_feedback() infr.write_wbia_annotmatch_feedback() # extra_.update(custom_) new_pairs = extra_.keys() new_truths = ut.take_column(ut.dict_take(extra_, new_pairs), 0) new_tags = ut.take_column(ut.dict_take(extra_, new_pairs), 1) new_tag_texts = [';'.join(t) for t in new_tags] aids1, aids2 = ut.listT(new_pairs) # Delete the old ibs.delete_annotmatch((d1['annotmatch_rowid'].values.tolist() + d2['annotmatch_rowid'].values.tolist())) # Add the new ams = ibs.add_annotmatch_undirected(aids1, aids2) ibs.set_annotmatch_evidence_decision(ams, new_truths) ibs.set_annotmatch_tag_text(ams, new_tag_texts) if False: import wbia.guitool as gt gt.ensure_qapp() ut.qtensure() from wbia.gui import inspect_gui inspect_gui.show_vsone_tuner(ibs, aid1, aid2)
def simple_thumbnail_widget(): r""" Very simple example to test thumbnails CommandLine: python -m wbia.guitool.api_item_model --test-simple_thumbnail_widget --show Example: >>> # ENABLE_DOCTEST >>> # xdoctest: +REQUIRES(--gui) >>> import wbia.guitool as guitool >>> from wbia.guitool.api_item_model import * # NOQA >>> guitool.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_thumbnail_widget() >>> ut.quit_if_noshow() >>> wgt.show() >>> guitool.qtapp_loop(wgt, frequency=100, init_signals=True) """ import wbia.guitool as guitool guitool.ensure_qapp() col_name_list = ['rowid', 'image_name', 'thumb'] col_types_dict = { 'thumb': 'PIXMAP', } def thumb_getter(id_, thumbsize=128): """ Thumb getters must conform to thumbtup structure """ # logger.info(id_) return ut.grab_test_imgpath(id_) # return None col_getter_dict = { 'rowid': [1, 2, 3], 'image_name': ['lena.png', 'carl.jpg', 'patsy.jpg'], 'thumb': thumb_getter, } col_ider_dict = { 'thumb': 'image_name', } col_setter_dict = {} editable_colnames = [] sortby = 'rowid' def get_thumb_size(): return 128 col_width_dict = {} col_bgrole_dict = {} api = guitool.CustomAPI( col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, True, col_width_dict, ) headers = api.make_headers(tblnice='Simple Example') wgt = guitool.APIItemWidget() wgt.change_headers(headers) # guitool.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) return wgt
def demo_classes(pblm): r""" CommandLine: python -m wbia.algo.verif.vsone demo_classes --saveparts --save=classes.png --clipwhite python -m wbia.algo.verif.vsone demo_classes --saveparts --save=figures/classes.png --clipwhite --dpath=~/latex/crall-iccv-2017 Example: >>> # DISABLE_DOCTEST >>> from wbia.algo.verif.vsone import * # NOQA >>> pblm = OneVsOneProblem.from_empty(defaultdb='PZ_PB_RF_TRAIN') >>> pblm.load_features() >>> pblm.load_samples() >>> pblm.build_feature_subsets() >>> pblm.demo_classes() >>> ut.show_if_requested() """ task_key = 'match_state' labels = pblm.samples.subtasks[task_key] pb_labels = pblm.samples.subtasks['photobomb_state'] classname_offset = { POSTV: 0, NEGTV: 0, INCMP: 0, } class_name = POSTV class_name = NEGTV class_name = INCMP feats = pblm.samples.X_dict['learn(sum,glob)'] offset = 0 class_to_edge = {} for class_name in labels.class_names: print('Find example of %r' % (class_name, )) # Find an example of each class (that is not a photobomb) pbflags = pb_labels.indicator_df['notpb'] flags = labels.indicator_df[class_name] assert np.all(pbflags.index == flags.index) flags = flags & pbflags ratio = feats['sum(ratio)'] if class_name == INCMP: # flags &= feats['global(delta_yaw)'] > 3 flags &= feats['global(delta_view)'] > 2 # flags &= feats['sum(ratio)'] > 0 if class_name == NEGTV: low = ratio[flags].max() flags &= feats['sum(ratio)'] >= low if class_name == POSTV: low = ratio[flags].median() / 2 high = ratio[flags].median() flags &= feats['sum(ratio)'] < high flags &= feats['sum(ratio)'] > low # flags &= pblm.samples.simple_scores[flags]['score_lnbnn_1vM'] > 0 idxs = np.where(flags)[0] print('Found %d candidates' % (len(idxs))) offset = classname_offset[class_name] idx = idxs[offset] series = labels.indicator_df.iloc[idx] assert series[class_name] edge = series.name class_to_edge[class_name] = edge import wbia.plottool as pt import wbia.guitool as gt gt.ensure_qapp() pt.qtensure() fnum = 1 pt.figure(fnum=fnum, pnum=(1, 3, 1)) pnum_ = pt.make_pnum_nextgen(1, 3) # classname_alias = { # POSTV: 'positive', # NEGTV: 'negative', # INCMP: 'incomparable', # } ibs = pblm.infr.ibs for class_name in class_to_edge.keys(): edge = class_to_edge[class_name] aid1, aid2 = edge # alias = classname_alias[class_name] print('class_name = %r' % (class_name, )) annot1 = ibs.annots([aid1])[0]._make_lazy_dict() annot2 = ibs.annots([aid2])[0]._make_lazy_dict() vt.matching.ensure_metadata_normxy(annot1) vt.matching.ensure_metadata_normxy(annot2) match = vt.PairwiseMatch(annot1, annot2) cfgdict = pblm.hyper_params.vsone_match.asdict() match.apply_all(cfgdict) pt.figure(fnum=fnum, pnum=pnum_()) match.show(show_ell=False, show_ori=False)