#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()