Source code for ibeis.viz._grave

    #csize_list = ibs.get_annot_chip_sizes(aid_list, config2_=dict(dim_size=200, resize_dim='area'))
    #print('csize_list = %r' % (csize_list,))
    #size_dict = {aid: size for aid, size in zip(aid_list, csize_list)}

    #scale_list = np.array(ut.dict_take_column(node_attrs, 'scale',
    #                                          default=None))
    #nx.set_node_attributes(graph, 'width',
    #                       ut.map_dict_vals(lambda x: .1 * x[0], size_dict))
    #nx.set_node_attributes(graph, 'height',
    #                       ut.map_dict_vals(lambda x: .1 * x[1], size_dict))

    #pos = plotinfo['pos']
    #if old and with_nid_edges:
    #    edge_pts1_ = np.array(ut.dict_take(pos, spantree_aids1_))
    #    edge_pts2_ = np.array(ut.dict_take(pos, spantree_aids2_))
    #    segments = list(zip(edge_pts1_, edge_pts2_))
    #    #pt.distinct_colors
    #    color_list = pt.DARK_ORANGE[0:3]
    #    #color_list = pt.BLACK
    #    import matplotlib as mpl
    #    line_group = mpl.collections.LineCollection(segments, color=color_list,
    #                                                alpha=.3, lw=4)
    #    ax.add_collection(line_group)

        # img_list = ibs.get_annot_chips(aid_list)
        # img_list = [vt.resize_thumb(img, target_size) for img in img_list]
        # img_list = [vt.cvt_BGR2RGB(img) for img in img_list]
        # size_dict = {aid: vt.get_size(img) for aid, img in zip(aid_list, img_list)}
        # img_dict = {aid: img for aid, img in zip(aid_list, img_list)}
        # import utool
        # utool.embed()
        # imgpath_list = ibs.get_annot_chip_fpath(aid_list)

        #csize_list = ibs.get_annot_chip_sizes(aid_list)
        #size_list = [vt.resized_dims_and_ratio(size, target_size)[0]
        #             for size in csize_list]
        #size_dict = {aid: size for aid, size in zip(aid_list, size_list)}
        # img_dict = None

            #if len(mst_edges) > 0:
            #    min_aids1_, min_aids2_ = ut.list_transpose(mst_edges)
            #    spantree_aids1_.extend(min_aids1_)
            #    spantree_aids2_.extend(min_aids2_)

    #with_images = True

    # target_size = (300, 300)
    #target_size = (220, 220)
    #target_size = (100, 100)


    #aids1, aids2 = get_name_rowid_edges_from_aids(ibs, aid_list)
    #g = make_netx_graph_from_aidpairs(ibs, aids1, aids2,                                                    unique_aids=aid_list)

    #IMPLICIT_LAYOUT = len(set(ibs.get_annot_nids(aid_list))) != 1
    #if IMPLICIT_LAYOUT:
    #    # HACK:
    #    # Use name edge to make pos (very bad)
    #    aids1, aids2 = get_name_rowid_edges_from_aids(ibs, aid_list)
    #    netx_graph_hack = make_netx_graph_from_aidpairs(ibs, aids1, aids2,
    #                                                    unique_aids=aid_list)
    #    pos = nx.nx_agraph.graphviz_layout(netx_graph_hack)

    #    implicit_netx_graph = nx.Graph()
    #    implicit_netx_graph.add_nodes_from(aid_list)
    #    implicit_netx_graph.add_edges_from(list(zip(aids1, aids2)))
    #else:
    #    pos = nx.nx_agraph.graphviz_layout(graph)

    #layout = 'spring' #layout = 'spectral' #layout = 'circular'
    #layout = 'shell' #layout = 'pydot' #layout = 'graphviz'




#def show_chipmatch_graph(ibs, cm_list, qreq_, fnum=None, pnum=None, **kwargs):
#    r"""

#    CommandLine:
#        python -m ibeis --tf show_chipmatch_graph:0 --show
#        python -m ibeis --tf show_chipmatch_graph:1 --show
#        python -m ibeis --tf show_chipmatch_graph:1 --show --zoom=.15
#        python -m ibeis --tf show_chipmatch_graph:1 --zoom=.25 --save foo.jpg --diskshow --figsize=12,6 --dpath=. --dpi=280

#    Example:
#        >>> # DISABLE_DOCTEST
#        >>> from ibeis.viz.viz_graph import *  # NOQA
#        >>> from ibeis.algo.hots.chip_match import *  # NOQA
#        >>> ibs, qreq_, cm_list = plh.testdata_post_sver('PZ_MTEST', qaid_list=[1, 2, 3, 4, 5, 6, 7, 18])
#        >>> [cm.score_nsum(qreq_) for cm in cm_list]
#        >>> ut.quit_if_noshow()
#        >>> daid = cm.get_groundtruth_daids()[0]
#        >>> zoom = ut.get_argval('--zoom', float, .4)
#        >>> show_chipmatch_graph(ibs, cm_list, qreq_, zoom=zoom)
#        >>> #cm.show_single_annotmatch(qreq_, daid)
#        >>> ut.show_if_requested()

#    Example:
#        >>> # DISABLE_DOCTEST
#        >>> from ibeis.viz.viz_graph import *  # NOQA
#        >>> from ibeis.algo.hots.chip_match import *  # NOQA
#        >>> #ibs, qreq_, cm_list = plh.testdata_post_sver('PZ_MTEST', qaid_list='all')
#        >>> ibs, qreq_, cm_list = plh.testdata_pre_sver('PZ_MTEST', qaid_list='all')
#        >>> [cm.score_nsum(qreq_) for cm in cm_list]
#        >>> ut.quit_if_noshow()
#        >>> daid = cm.get_groundtruth_daids()[0]
#        >>> zoom = ut.get_argval('--zoom', float, .4)
#        >>> show_chipmatch_graph(ibs, cm_list, qreq_, zoom=zoom)
#        >>> #cm.show_single_annotmatch(qreq_, daid)
#        >>> ut.show_if_requested()
#    """
#    pass
#    # breaking
#    num = 3
#    qaid_list   = [cm.qaid for cm in cm_list]
#    daids_list  = [cm.get_top_aids(num).tolist() for cm in cm_list]
#    scores_list = [cm.get_annot_scores(daids) for cm, daids in zip(cm_list, daids_list)]
#    #graph = nx.Graph()
#    #node = graph.add_node(img)
#    # FDSFDS!!!
#    graph = make_ibeis_matching_graph(ibs, qaid_list, daids_list, scores_list)
#    fnum = None
#    zoom = kwargs.get('zoom', .4)
#    viz_netx_chipgraph(ibs, graph, fnum=fnum, with_images=True, zoom=zoom)


def make_ibeis_matching_graph(ibs, qaid_list, daids_list, scores_list):
[docs] print('make_ibeis_matching_graph') aid1_list = ut.flatten([[qaid] * len(daids) for qaid, daids in zip(qaid_list, daids_list)]) aid2_list = ut.flatten(daids_list) unique_aids = list(set(aid2_list + qaid_list)) score_list = ut.flatten(scores_list) # Make a graph between the chips nodes = list(zip(unique_aids)) edges = list(zip(aid1_list, aid2_list, score_list)) node_lbls = [('aid', 'int')] edge_lbls = [('weight', 'float')] graph = make_netx_graph(nodes, edges, node_lbls, edge_lbls) return graph #if ut.WIN32: # # Make sure graphviz is in the path # win32_graphviz_bin_paths = [ # r'C:\Program Files (x86)\Graphviz2.38\bin', # r'C:\Program Files\Graphviz2.38\bin', # ] # found_dot_exe = False # for path in win32_graphviz_bin_paths: # if ut.checkpath(path): # if ut.checkpath(join(path, 'dot.exe')): # sys.path.append(path) # found_dot_exe = True # break # assert found_dot_exe, 'could not find graphviz' def make_name_graph_interaction(ibs, nids=None, aids=None, selected_aids=[],
[docs] with_all=True, invis_edges=None, ensure_edges=None, use_image=True, split_check=None, temp_nids=None, **kwargs): """ CommandLine: python -m ibeis --tf make_name_graph_interaction --db PZ_MTEST \ --aids=1,2,3,4,5,6,7,8,9 --show python -m ibeis --tf make_name_graph_interaction --db LEWA_splits --nids=1 --show --split Example: >>> # DISABLE_DOCTEST >>> from ibeis.viz.viz_graph import * # NOQA >>> import ibeis >>> import plottool as pt >>> exec(ut.execstr_funckw(make_name_graph_interaction), globals()) >>> defaultdb='testdb1' >>> ibs = ibeis.opendb(defaultdb=defaultdb) >>> aids = ut.get_argval('--aids', type_=list, default=None) >>> nids = ut.get_argval('--nids', type_=list, default=ibs.get_valid_nids()[0:5]) >>> nids = None if aids is not None else nids >>> with_all = not ut.get_argflag('--no-with-all') >>> make_name_graph_interaction(ibs, nids, aids, with_all=with_all) >>> #pt.zoom_factory() >>> ut.show_if_requested() """ import plottool as pt from plottool.abstract_interaction import AbstractInteraction print('aids = %r' % (aids,)) if split_check is None: split_check = ut.get_argflag('--split') def exec_split_check(ibs, aid_list): cfgdict = { 'can_match_samename': True, 'K': 3, 'Knorm': 3, 'prescore_method': 'csum', 'score_method': 'csum' } qreq_ = ibs.new_query_request(aid_list, aid_list, cfgdict=cfgdict) cm_list = qreq_.execute() from ibeis.algo.hots import graph_iden infr = graph_iden.AnnotInference(qreq_, cm_list) infr.initialize_graph_and_model() #print("BUILT SPLIT GRAPH") return infr class NameGraphInteraction(AbstractInteraction): def __init__(self, ibs, nids=None, aids=None, selected_aids=[]): super(NameGraphInteraction, self).__init__() self.ibs = ibs self.selected_aids = selected_aids self._nids = nids if nids is not None else [] self._aids = aids if aids is not None else [] self.use_image = use_image self._aids2 = None def make_hud(self): """ Creates heads up display """ import plottool as pt hl_slot, hr_slot = pt.make_bbox_positioner( y=.02, w=.10, h=.03, xpad=.05, startx=0, stopx=1) # Create buttons self.append_button('Auto Infer', callback=self.make_inference, rect=hl_slot(0)) self.append_button('Break', callback=self.break_links, rect=hl_slot(1)) self.append_button('Link', callback=self.make_links, rect=hl_slot(2)) self.append_button('Accept', callback=self.confirm, rect=hr_slot(0)) self.append_button('Deselect', callback=self.unselect_all, rect=hr_slot(1)) self.append_button('Show', callback=self.show_selected, rect=hr_slot(2)) #self.append_button(next_text, callback=next_callback, rect=next_rect) def make_inference(self, event): print('self.selected_aids = %r' % (self.selected_aids,)) self.infer_cut() self.show_page() def break_links(self, event): print('self.selected_aids = %r' % (self.selected_aids,)) def make_links(self, event): print('self.selected_aids = %r' % (self.selected_aids,)) def unselect_all(self, event): print('self.selected_aids = %r' % (self.selected_aids,)) for aid in self.selected_aids[:]: self.toggle_selected_aid(aid) def confirm(self, event): print('Not done yet') def show_selected(self, event): import plottool as pt print('show_selected') from ibeis.viz import viz_chip fnum = pt.ensure_fnum(None) print('fnum = %r' % (fnum,)) pt.figure(fnum=fnum) viz_chip.show_many_chips(self.ibs, self.selected_aids) pt.update() #fig.canvas.update() #pt.iup() def update_netx_graph(self): nids_list = [] if self._aids2 is not None: nids2 = ibs.get_annot_nids(self._aids2) nids_list += [nids2] if with_all: nids_list += [ibs.get_annot_nids(self._aids)] nids_list += [self._nids] nids = list(set(ut.flatten(nids_list))) aids_list = ibs.get_name_aids(nids) else: aids_list = ibs.group_annots_by_name(self._aids)[0] self.graph = make_netx_graph_from_aid_groups( ibs, aids_list, invis_edges=invis_edges, ensure_edges=ensure_edges, temp_nids=temp_nids) aid_list = ut.flatten(aids_list) if split_check: self.infr = exec_split_check(ibs, aid_list) ut.graph_info(self.graph, 1) ut.graph_info(self.infr.model.graph, 1) self._aids2 = sorted(list(self.graph.nodes())) self.aid2_node = {key: val for val, key in enumerate(self._aids2)} graph = self.infr.model.graph node_to_aid = nx.get_node_attributes(graph, 'aid') else: graph = self.graph node_to_aid = dict(zip(graph.nodes(), graph.nodes())) #self._aids2 = sorted(list(self.graph.nodes())) #self.aid2_node = {key: val for val, key in enumerate(self._aids2)} node_list = sorted(list(graph.nodes())) self._aids2 = [node_to_aid.get(node, node) for node in node_list] self.aid2_node = dict(zip(self._aids2, node_list)) self.node2_aid = node_to_aid #self.graph = make_netx_graph_from_aid_groups( # ibs, aids_list, invis_edges=invis_edges, # ensure_edges=ensure_edges, temp_nids=temp_nids) pass # TODO: allow for a subset of grouped aids to be shown #self.graph = make_netx_graph_from_nids(ibs, nids) def plot(self, fnum, pnum): self.update_netx_graph() #if split_check: node2_aid = nx.get_node_attributes(self.infr.model.graph, 'aid') node2_label = { node: '%d:aid=%r' % (node, aid) for node, aid in node2_aid.items() } nx.set_node_attributes(self.infr.model.graph, 'label', node2_label) #{self.infr.model.graph} layoutkw = dict(prog='neato', splines='spline', sep=10 / 72) self.plotinfo = pt.show_nx(self.infr.model.graph, as_directed=False, fnum=self.fnum, layoutkw=layoutkw, use_image=self.use_image, verbose=0) #ax = pt.gca() #pt.zoom_factory() #else: # self.plotinfo = viz_netx_chipgraph(self.ibs, self.graph, # fnum=self.fnum, # use_image=self.use_image, # **kwargs) ax = pt.gca() self.enable_pan_and_zoom(ax) ax.autoscale() for aid in self.selected_aids: self.highlight_aid(aid) self.make_hud() #self.static_plot(fnum, pnum) def highlight_aid(self, aid, color=pt.ORANGE): node = self.aid2_node[aid] frame = self.plotinfo['patch_frame_dict'][node] frame.set_facecolor(color) frame.set_edgecolor(color) def toggle_images(self): self.use_image = not self.use_image self.show_page() def toggle_selected_aid(self, aid): if aid in self.selected_aids: self.selected_aids.remove(aid) #self.highlight_aid(aid, pt.WHITE) self.highlight_aid(aid, pt.DARK_BLUE) else: self.selected_aids.append(aid) self.highlight_aid(aid, pt.ORANGE) self.draw() def on_key_press(self, event): print(event) if event.key == 'r': self.show_page() self.draw() if event.key == 'i': ut.embed() if len(self.selected_aids) == 2: ibs = self.ibs aid1, aid2 = self.selected_aids _rowid = ibs.get_annotmatch_rowid_from_superkey([aid1], [aid2]) if _rowid is None: _rowid = ibs.get_annotmatch_rowid_from_superkey([aid2], [aid1]) rowid = _rowid # NOQA def mark_pair_truth(self, truth): if len(len(self.selected_aids)) != 2: print('This funciton only work if exactly 2 are selected') return aid1, aid2 = self.selected_aids print('aid2 = %r' % (aid2,)) print('aid1 = %r' % (aid1,)) @ut.debug_function_exceptions def on_click_inside(self, event, ax): self.ax = ax self.event = event event = self.event #print(ax) #print(event.x) #print(event.y) pos = self.plotinfo['node']['pos'] nodes = list(pos.keys()) pos_list = ut.dict_take(pos, nodes) # TODO: FIXME #x = 10 #y = 10 import numpy as np # NOQA x, y = event.xdata, event.ydata point = np.array([x, y]) pos_list = np.array(pos_list) index, dist = vt.closest_point(point, pos_list, distfunc=vt.L2) #print('dist = %r' % (dist,)) node = nodes[index] aid = self.node2_aid[node] context_shown = False CHECK_PAIR = True if CHECK_PAIR: if self.event.button == 3 and not context_shown: if len(self.selected_aids) != 2: print('This funciton only work if exactly 2 are selected') else: from ibeis.gui import inspect_gui context_shown = True aid1, aid2 = (self.selected_aids) qres = None qreq_ = None options = inspect_gui.get_aidpair_context_menu_options( ibs, aid1, aid2, qres, qreq_=qreq_) self.show_popup_menu(options, event) SELECT_ANNOT = dist < 35 if SELECT_ANNOT: #print(ut.obj_str(ibs.get_annot_info(aid, default=True, # name=False, gname=False))) if self.event.button == 1: self.toggle_selected_aid(aid) if self.event.button == 3 and not context_shown: # right click from ibeis.viz.interact import interact_chip context_shown = True #refresh_func = functools.partial(viz.show_name, ibs, nid, #fnum=fnum, sel_aids=sel_aids) refresh_func = None config2_ = None options = interact_chip.build_annot_context_options( ibs, aid, refresh_func=refresh_func, with_interact_name=False, config2_=config2_) self.show_popup_menu(options, event) else: if self.event.button == 3: options = [ ('Toggle images', self.toggle_images), ] self.show_popup_menu(options, event) self = NameGraphInteraction(ibs, nids, aids, selected_aids=selected_aids) self.show_page() #self.make_hud() self.show() #ax = self.fig.axes[0] #for index in range(len(ax.artists)): # artist = ax.artists[index] # bbox = artist.patch # bbox.set_facecolor(pt.ORANGE) # #offset_img = artist.offsetbox # #img = offset_img.get_data() # #offset_img.set_data(vt.draw_border(img, thickness=5)) #bbox = artist.patch #ax.figure.canvas.draw() # force re-draw return self if __name__ == '__main__':
""" CommandLine: python -m ibeis.viz.viz_graph python -m ibeis.viz.viz_graph --allexamples python -m ibeis.viz.viz_graph --allexamples --noface --nosrc """ import multiprocessing multiprocessing.freeze_support() # for win32 import utool as ut # NOQA ut.doctest_funcs()