def show_normalizers(match, fnum=None, pnum=None, update=True): import plottool as pt from plottool import plot_helpers as ph # hack keys out of namespace keys = ['rchip', 'kpts'] rchip1, kpts1 = ut.dict_take(match.annot1.__dict__, keys) rchip2, kpts2 = ut.dict_take(match.annot2.__dict__, keys) fs, fm = match.fs, match.fm_norm cmap = 'cool' draw_lines = True if fnum is None: fnum = pt.next_fnum() pt.figure(fnum=fnum, pnum=pnum) #doclf=True, docla=True) ax, xywh1, xywh2 = pt.show_chipmatch2(rchip1, rchip2, kpts1, kpts2, fm=fm, fs=fs, fnum=fnum, cmap=cmap, draw_lines=draw_lines) ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'key', match.key) title = match.key + '\n num=%d, sum=%.2f' % (len(fm), sum(fs)) pt.set_title(title) if update: pt.update() return ax, xywh1, xywh2
def show_normalizers(match, fnum=None, pnum=None, update=True): import plottool as pt from plottool import plot_helpers as ph # hack keys out of namespace keys = ["rchip", "kpts"] rchip1, kpts1 = ut.dict_take(match.annot1.__dict__, keys) rchip2, kpts2 = ut.dict_take(match.annot2.__dict__, keys) fs, fm = match.fs, match.fm_norm cmap = "cool" draw_lines = True if fnum is None: fnum = pt.next_fnum() pt.figure(fnum=fnum, pnum=pnum) # doclf=True, docla=True) ax, xywh1, xywh2 = pt.show_chipmatch2( rchip1, rchip2, kpts1, kpts2, fm=fm, fs=fs, fnum=fnum, cmap=cmap, draw_lines=draw_lines ) ph.set_plotdat(ax, "viztype", "matches") ph.set_plotdat(ax, "key", match.key) title = match.key + "\n num=%d, sum=%.2f" % (len(fm), sum(fs)) pt.set_title(title) if update: pt.update() return ax, xywh1, xywh2
def show_keypoints(chip, kpts, fnum=0, pnum=None, **kwargs): r""" Args: chip (ndarray[uint8_t, ndim=2]): annotation image data kpts (ndarray[float32_t, ndim=2]): keypoints fnum (int): figure number(default = 0) pnum (tuple): plot number(default = None) Kwargs: ddd, title, figtitle, interpolation, cmap, heatmap, data_colorbar, darken, update, redraw_image, docla, doclf, projection, sel_fx CommandLine: python -m plottool.viz_keypoints --exec-show_keypoints Example: >>> # DISABLE_DOCTEST >>> from plottool.viz_keypoints import * # NOQA >>> import vtool as vt >>> kpts, vecs, chip = testdata_kpts() >>> fnum = 0 >>> pnum = None >>> result = show_keypoints(chip, kpts, fnum, pnum) >>> print(result) """ #printDBG('[df2.show_kpts] %r' % (kwargs.keys(),)) fig, ax = df2.imshow(chip, fnum=fnum, pnum=pnum, **kwargs) _annotate_kpts(kpts, **kwargs) ph.set_plotdat(ax, 'viztype', 'keypoints') ph.set_plotdat(ax, 'kpts', kpts) if kwargs.get('ddd', False): ph.draw()
def chipmatch_view(self, fnum=None, pnum=(1, 1, 1), verbose=None, **kwargs_): """ just visualizes the matches using some type of lines """ import plottool as pt from plottool import plot_helpers as ph if fnum is None: fnum = self.fnum if verbose is None: verbose = ut.VERBOSE if verbose: print("-- CHIPMATCH VIEW --") print("[ichipmatch_view] self.mode = %r" % (self.mode,)) mode = kwargs_.get("mode", self.mode) draw_ell = mode >= 1 draw_lines = mode == 2 if verbose: print("[ichipmatch_view] draw_lines = %r" % (draw_lines,)) print("[ichipmatch_view] draw_ell = %r" % (draw_ell,)) # pt.figure(fnum=fnum, docla=True, doclf=True) # NOTE: i remove the clf here. might cause issues pt.figure(fnum=fnum, docla=True, doclf=False) # show_matches_kw = self.__dict__.copy() show_matches_kw = dict( # fnum=fnum, pnum=pnum, draw_lines=draw_lines, draw_ell=draw_ell, colorbar_=True, vert=self.vert, ) show_matches_kw.update(kwargs_) if verbose: print("self.warp_homog = %r" % (self.warp_homog,)) if self.warp_homog: show_matches_kw["H1"] = self.H1 show_matches_kw["H2"] = self.H2 if verbose: print("show_matches_kw = %s" % (ut.dict_str(show_matches_kw, truncate=True))) # tup = show_matches(fm, fs, **show_matches_kw) ax, xywh1, xywh2 = pt.show_chipmatch2( self.rchip1, self.rchip2, self.kpts1, self.kpts2, fm=self.fm, fs=self.fs, pnum=pnum, **show_matches_kw ) self.xywh2 = xywh2 ph.set_plotdat(ax, "viztype", "matches") if self.truth is not None and self.truth: truth_color = pt.TRUE_BLUE # if else pt.FALSE_RED pt.draw_border(ax, color=truth_color, lw=4) if self.title is not None: pt.set_title(self.title, ax=ax)
def chipmatch_view(self, fnum=None, pnum=(1, 1, 1), verbose=None, **kwargs_): """ just visualizes the matches using some type of lines """ import plottool as pt from plottool import plot_helpers as ph if fnum is None: fnum = self.fnum if verbose is None: verbose = ut.VERBOSE if verbose: print('-- CHIPMATCH VIEW --') print('[ichipmatch_view] self.mode = %r' % (self.mode,)) mode = kwargs_.get('mode', self.mode) draw_ell = mode >= 1 draw_lines = mode == 2 if verbose: print('[ichipmatch_view] draw_lines = %r' % (draw_lines,)) print('[ichipmatch_view] draw_ell = %r' % (draw_ell,)) #pt.figure(fnum=fnum, docla=True, doclf=True) # NOTE: i remove the clf here. might cause issues pt.figure(fnum=fnum, docla=True, doclf=False) #show_matches_kw = self.__dict__.copy() show_matches_kw = dict( #fnum=fnum, pnum=pnum, draw_lines=draw_lines, draw_ell=draw_ell, colorbar_=True, vert=self.vert) show_matches_kw.update(kwargs_) if verbose: print('self.warp_homog = %r' % (self.warp_homog,)) if self.warp_homog: show_matches_kw['H1'] = self.H1 show_matches_kw['H2'] = self.H2 if verbose: print('show_matches_kw = %s' % (ut.dict_str(show_matches_kw, truncate=True))) #tup = show_matches(fm, fs, **show_matches_kw) ax, xywh1, xywh2 = pt.show_chipmatch2( self.rchip1, self.rchip2, self.kpts1, self.kpts2, fm=self.fm, fs=self.fs, pnum=pnum, **show_matches_kw) self.xywh2 = xywh2 ph.set_plotdat(ax, 'viztype', 'matches') if self.truth is not None and self.truth: truth_color = pt.TRUE_BLUE # if else pt.FALSE_RED pt.draw_border(ax, color=truth_color, lw=4) if self.title is not None: pt.set_title(self.title, ax=ax)
def annotate_matches(ibs, qres, aid2, offset1=(0, 0), offset2=(0, 0), xywh2=(0, 0, 0, 0), xywh1=(0, 0, 0, 0), **kwargs): # TODO Use this function when you clean show_matches in_image = kwargs.get('in_image', False) show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) printDBG('[viz] annotate_matches()') aid1 = qres.qaid truth = ibs.get_match_truth(aid1, aid2) truth_color = vh.get_truth_color(truth) # Build title title = vh.get_query_text(ibs, qres, aid2, truth, **kwargs) # Build xlbl ax = df2.gca() ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'qaid', aid1) ph.set_plotdat(ax, 'aid1', aid1) ph.set_plotdat(ax, 'aid2', aid2) if draw_lbl: name1, name2 = ibs.get_annot_names([aid1, aid2]) lbl1 = repr(name1) + ' : ' + 'q' + vh.get_aidstrs(aid1) lbl2 = repr(name2) + ' : ' + vh.get_aidstrs(aid2) else: lbl1, lbl2 = None, None if vh.NO_LBL_OVERRIDE: title = '' df2.set_title(title, ax) # Plot annotations over images if in_image: bbox1, bbox2 = vh.get_bboxes(ibs, [aid1, aid2], [offset1, offset2]) theta1, theta2 = ibs.get_annot_thetas([aid1, aid2]) # HACK! if show_query: df2.draw_bbox(bbox1, bbox_color=df2.ORANGE, lbl=lbl1, theta=theta1) bbox_color2 = truth_color if draw_border else df2.ORANGE df2.draw_bbox(bbox2, bbox_color=bbox_color2, lbl=lbl2, theta=theta2) else: xy, w, h = df2._axis_xy_width_height(ax) bbox2 = (xy[0], xy[1], w, h) theta2 = 0 if draw_border: df2.draw_border(ax, truth_color, 4, offset=offset2) if draw_lbl: # Custom user lbl for chips 1 and 2 (x1, y1, w1, h1) = xywh1 (x2, y2, w2, h2) = xywh2 df2.absolute_lbl(x1 + w1, y1, lbl1) df2.absolute_lbl(x2 + w2, y2, lbl2) # No matches draw a red box if aid2 not in qres.aid2_fm or len(qres.aid2_fm[aid2]) == 0: if draw_border: df2.draw_boxedX(bbox2, theta=theta2)
def clear_parent_axes(self, ax): """ for clearing axes that we appended anything to """ child_axes = ph.get_plotdat(ax, 'child_axes', []) ph.set_plotdat(ax, 'child_axes', []) for subax in child_axes: to_remove = None for tup in self.scope: if tup[1] is subax: to_remove = tup break if to_remove is not None: self.scope.remove(to_remove) subax.cla() self.fig.delaxes(subax) ph.del_plotdat(ax, df2.DF2_DIVIDER_KEY) ax.cla()
def append_button(self, text, divider=None, rect=None, callback=None, size='9%', location='bottom', ax=None, **kwargs): """ Adds a button to the current page """ if rect is not None: new_ax = df2.plt.axes(rect) if rect is None and divider is None: if ax is None: ax = df2.gca() divider = df2.ensure_divider(ax) if divider is not None: new_ax = divider.append_axes(location, size=size, pad=.05) if callback is not None: color, hovercolor = u'.85', u'.95' else: color, hovercolor = u'.88', u'.88' #color, hovercolor = u'.45', u'.45' #if isinstance(text, six.text_type): new_but = mpl.widgets.Button( new_ax, text, color=color, hovercolor=hovercolor) #elif isinstance(text, (list, tuple)): # labels = [False] * len(text) # labels[0] = True # new_but = mpl.widgets.CheckButtons(new_ax, text, labels) #else: # raise ValueError('bad input') if callback is not None: new_but.on_clicked(callback) else: button_text = new_but.ax.texts[0] button_text.set_color('.6') #button_text.set_color('r') #ut.embed() #print('new_but.color = %r' % (new_but.color,)) #else: # TODO: figure ou how to gray out these buttons # new_but.color = u'.1' # new_but.hovercolor = u'.1' # new_but.active = False # print('new_but.color = %r' % (new_but.color,)) ph.set_plotdat(new_ax, 'viztype', 'button') ph.set_plotdat(new_ax, 'text', text) #ph.set_plotdat(new_ax, 'parent_axes', ax) if ax is not None: child_axes = ph.get_plotdat(ax, 'child_axes', []) child_axes.append(new_ax) ph.set_plotdat(ax, 'child_axes', child_axes) for key, val in six.iteritems(kwargs): ph.set_plotdat(new_ax, key, val) # Keep buttons from losing scrop tup = (new_but, new_ax) self.scope.append(tup) return tup
def plot_image(self, index): px = index - self.start_index gpath = self.gpath_list[index] if self.vizkw is None: _vizkw = {} else: _vizkw = self.vizkw.copy() _vizkw.update({ 'fnum': self.fnum, 'pnum': self.pnum_(px), }) if ut.is_funclike(gpath): showfunc = gpath # HACK # override of plot image function showfunc(**_vizkw) import plottool as pt ax = pt.gca() else: if isinstance(gpath, six.string_types): img = vt.imread(gpath) else: img = gpath bbox_list = self.bboxes_list[index] #print('bbox_list %r in display for px: %r ' % (bbox_list, px)) theta_list = self.thetas_list[index] label_list = [ix + 1 for ix in range(len(bbox_list))] #Add true values for every bbox to display sel_list = [True for ix in range(len(bbox_list))] _vizkw.update({ #title should always be the image number 'title': str(index), 'bbox_list': bbox_list, 'theta_list': theta_list, 'sel_list': sel_list, 'label_list': label_list, }) #print(utool.dict_str(_vizkw)) #print('vizkw = ' + utool.dict_str(_vizkw)) _, ax = viz_image2.show_image(img, **_vizkw) if self.xlabel_list is not None: import plottool as pt pt.set_xlabel(self.xlabel_list[index]) #print(index) ph.set_plotdat(ax, 'bbox_list', bbox_list) ph.set_plotdat(ax, 'gpath', gpath) ph.set_plotdat(ax, 'px', str(px)) ph.set_plotdat(ax, 'index', index)
def plot_image(self, index): px = index - self.start_index gpath = self.gpath_list[index] if self.vizkw is None: _vizkw = {} else: _vizkw = self.vizkw.copy() _vizkw.update({ 'fnum': self.fnum, 'pnum': self.pnum_(px), }) if ut.is_funclike(gpath): showfunc = gpath # HACK # override of plot image function showfunc(**_vizkw) import plottool as pt ax = pt.gca() else: if isinstance(gpath, six.string_types): img = vt.imread(gpath) else: img = gpath bbox_list = self.bboxes_list[index] #print('bbox_list %r in display for px: %r ' % (bbox_list, px)) theta_list = self.thetas_list[index] label_list = [ix + 1 for ix in range(len(bbox_list))] #Add true values for every bbox to display sel_list = [True for ix in range(len(bbox_list))] _vizkw.update({ #title should always be the image number 'title': str(index), 'bbox_list' : bbox_list, 'theta_list' : theta_list, 'sel_list' : sel_list, 'label_list' : label_list, }) #print(utool.dict_str(_vizkw)) #print('vizkw = ' + utool.dict_str(_vizkw)) _, ax = viz_image2.show_image(img, **_vizkw) if self.xlabel_list is not None: import plottool as pt pt.set_xlabel(self.xlabel_list[index]) #print(index) ph.set_plotdat(ax, 'bbox_list', bbox_list) ph.set_plotdat(ax, 'gpath', gpath) ph.set_plotdat(ax, 'px', str(px)) ph.set_plotdat(ax, 'index', index)
def show_matches(fm, fs, fnum=1, pnum=None, title='', key=None, simp=None, cmap='hot', draw_lines=True, **locals_): #locals_ = locals() import plottool as pt from plottool import plot_helpers as ph # hack keys out of namespace keys = 'rchip1, rchip2, kpts1, kpts2'.split(', ') rchip1, rchip2, kpts1, kpts2 = ut.dict_take(locals_, keys) pt.figure(fnum=fnum, pnum=pnum) #doclf=True, docla=True) ax, xywh1, xywh2 = pt.show_chipmatch2(rchip1, rchip2, kpts1, kpts2, fm=fm, fs=fs, fnum=fnum, cmap=cmap, draw_lines=draw_lines, ori=True) ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'simp', simp) ph.set_plotdat(ax, 'key', key) title = title + '\n num=%d, sum=%.2f' % (len(fm), sum(fs)) pt.set_title(title) return ax, xywh1, xywh2
def append_button(self, text, divider=None, rect=None, callback=None, size='9%', **kwargs): """ Adds a button to the current page """ if divider is not None: new_ax = divider.append_axes('bottom', size='9%', pad=.05) if rect is not None: new_ax = df2.plt.axes(rect) new_but = mpl.widgets.Button(new_ax, text) if callback is not None: new_but.on_clicked(callback) ph.set_plotdat(new_ax, 'viztype', 'button') ph.set_plotdat(new_ax, 'text', text) for key, val in six.iteritems(kwargs): ph.set_plotdat(new_ax, key, val) # Keep buttons from losing scrop self.scope.append((new_but, new_ax))
def draw_image_overlay(ibs, ax, gid, sel_aids, draw_lbls=True, annote=True): try: raise NotImplementedError('use pt.viz_image2.draw_image_overlay') # draw chips in the image aid_list = ibs.get_image_aids(gid) bbox_list = ibs.get_annot_bboxes(aid_list) theta_list = ibs.get_annot_thetas(aid_list) text_list = vh.get_annot_text(ibs, aid_list, draw_lbls) annotation_centers = vh.get_bbox_centers(bbox_list) sel_list = [aid in sel_aids for aid in aid_list] viz_image2.draw_image_overlay(ax, bbox_list, theta_list, text_list, sel_list, draw_lbls, annote) # Draw all chip indexes in the image if annote: annotation_iter = zip(bbox_list, theta_list, text_list, sel_list) for bbox, theta, lbl, is_sel in annotation_iter: viz_image2.draw_chip_overlay(ax, bbox, theta, lbl, is_sel) # Put annotation centers in the axis ph.set_plotdat(ax, 'annotation_centers', np.array(annotation_centers)) ph.set_plotdat(ax, 'annotation_bbox_list', bbox_list) ph.set_plotdat(ax, 'aid_list', aid_list) except Exception as ex: ut.printex(ex, 'error drawing image overlay', key_list=['ibs', 'ax', 'gid', 'sel_aids']) raise
def annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=None, **kwargs): """ TODO: use this as the main function. """ # TODO Use this function when you clean show_matches in_image = kwargs.get('in_image', False) #show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) # List of annotation scores for each annot in the name #printDBG('[viz] annotate_matches3()') #truth = ibs.get_match_truth(aid1, aid2) #name_equality = ( # np.array(ibs.get_annot_nids(aid_list[1:])) == ibs.get_annot_nids(aid_list[0]) #).tolist() #truth = 1 if all(name_equality) else (2 if any(name_equality) else 0) #truth_color = vh.get_truth_color(truth) ## Build title #score = kwargs.pop('score', None) #rawscore = kwargs.pop('rawscore', None) #aid2_raw_rank = kwargs.pop('aid2_raw_rank', None) #print(kwargs) #title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'multi_match') ph.set_plotdat(ax, 'qaid', aid_list[0]) ph.set_plotdat(ax, 'num_matches', len(aid_list) - 1) ph.set_plotdat(ax, 'aid_list', aid_list[1:]) for count, aid in enumerate(aid_list, start=1): ph.set_plotdat(ax, 'aid%d' % (count,), aid) #name_equality = (ibs.get_annot_nids(aid_list[0]) == # np.array(ibs.get_annot_nids(aid_list[1:]))) #truth = 1 if np.all(name_equality) else (2 if np.any(name_equality) else 0) truth = get_multitruth(ibs, aid_list) if any(ibs.is_aid_unknown(aid_list[1:])) or ibs.is_aid_unknown(aid_list[0]): truth = ibs.const.TRUTH_UNKNOWN truth_color = vh.get_truth_color(truth) name_annot_scores = kwargs.get('name_annot_scores', None) if len(aid_list) == 2: # HACK; generalize to multple annots title = vh.get_query_text(ibs, None, aid_list[1], truth, qaid=aid_list[0], **kwargs) if not notitle: pt.set_title(title, ax) if draw_lbl: # Build labels nid_list = ibs.get_annot_nids(aid_list, distinguish_unknowns=False) name_list = ibs.get_annot_names(aid_list) lbls_list = [[] for _ in range(len(aid_list))] if kwargs.get('show_name', False): for count, (lbls, name) in enumerate(zip(lbls_list, name_list)): lbls.append(ut.repr2((name))) if kwargs.get('show_nid', True): for count, (lbls, nid) in enumerate(zip(lbls_list, nid_list)): # only label the first two images with nids LABEL_ALL_NIDS = False if count <= 1 or LABEL_ALL_NIDS: #lbls.append(vh.get_nidstrs(nid)) lbls.append(('q' if count == 0 else '') + vh.get_nidstrs(nid)) if kwargs.get('show_aid', True): for count, (lbls, aid) in enumerate(zip(lbls_list, aid_list)): lbls.append(('q' if count == 0 else '') + vh.get_aidstrs(aid)) if (kwargs.get('show_annot_score', True) and name_annot_scores is not None): max_digits = kwargs.get('score_precision', None) for (lbls, score) in zip(lbls_list[1:], name_annot_scores): lbls.append(ut.num_fmt(score, max_digits=max_digits)) lbl_list = [' : '.join(lbls) for lbls in lbls_list] else: lbl_list = [None] * len(aid_list) #pt.set_title(title, ax) # Plot annotations over images if in_image: in_image_bbox_list = vh.get_bboxes(ibs, aid_list, offset_list) in_image_theta_list = ibs.get_annot_thetas(aid_list) # HACK! #if show_query: # pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color = pt.ORANGE bbox_color = truth_color if draw_border else pt.ORANGE for bbox, theta, lbl in zip(in_image_bbox_list, in_image_theta_list, lbl_list): pt.draw_bbox(bbox, bbox_color=bbox_color, lbl=lbl, theta=theta) pass else: xy, w, h = pt.get_axis_xy_width_height(ax) #theta2 = 0 #if xywh2 is None: # #xywh2 = (xy[0], xy[1], w, h) # # weird when sidebyside is off y seems to be inverted # xywh2 = (0, 0, w, h) #if not show_query and xywh1 is None: # data_config2 = None if qreq_ is None else # qreq_.get_external_data_config2() # kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] # #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # # Draw any selected matches # #sm_kw = dict(rect=True, colors=pt.BLUE) # pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) #if draw_border: # pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_border: pt.draw_border(ax, color=truth_color, lw=4) if draw_lbl: # Custom user lbl for chips 1 and 2 #if show_query: # (x1, y1, w1, h1) = xywh1 # pt.absolute_lbl(x1 + w1, y1, lbl1) for bbox, lbl in zip(bbox_list, lbl_list): (x, y, w, h) = bbox pt.absolute_lbl(x + w, y, lbl) # No matches draw a red box if True: no_matches = name_fm_list is None or all([True if fm is None else len(fm) == 0 for fm in name_fm_list]) if no_matches: xy, w, h = pt.get_axis_xy_width_height(ax) #axes_bbox = (xy[0], xy[1], w, h) if draw_border: pass
def annotate_matches2(ibs, aid1, aid2, fm, fs, offset1=(0, 0), offset2=(0, 0), xywh2=None, # (0, 0, 0, 0), xywh1=None, # (0, 0, 0, 0), qreq_=None, **kwargs): """ TODO: use this as the main function. """ if True: aid_list = [aid1, aid2] bbox_list = [xywh1, xywh2] offset_list = [offset1, offset2] name_fm_list = [fm] name_fs_list = [fs] return annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=qreq_, **kwargs) else: # TODO: make sure all of this functionality is incorporated into annotate_matches3 in_image = kwargs.get('in_image', False) show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) truth = ibs.get_match_truth(aid1, aid2) truth_color = vh.get_truth_color(truth) # Build title title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'qaid', aid1) ph.set_plotdat(ax, 'aid1', aid1) ph.set_plotdat(ax, 'aid2', aid2) if draw_lbl: name1, name2 = ibs.get_annot_names([aid1, aid2]) nid1, nid2 = ibs.get_annot_name_rowids([aid1, aid2], distinguish_unknowns=False) #lbl1 = repr(name1) + ' : ' + 'q' + vh.get_aidstrs(aid1) #lbl2 = repr(name2) + ' : ' + vh.get_aidstrs(aid2) lbl1_list = [] lbl2_list = [] if kwargs.get('show_aid', True): lbl1_list.append('q' + vh.get_aidstrs(aid1)) lbl2_list.append(vh.get_aidstrs(aid2)) if kwargs.get('show_name', True): lbl1_list.append(repr((name1))) lbl2_list.append(repr((name2))) if kwargs.get('show_nid', True): lbl1_list.append(vh.get_nidstrs(nid1)) lbl2_list.append(vh.get_nidstrs(nid2)) lbl1 = ' : '.join(lbl1_list) lbl2 = ' : '.join(lbl2_list) else: lbl1, lbl2 = None, None if vh.NO_LBL_OVERRIDE: title = '' if not notitle: pt.set_title(title, ax) # Plot annotations over images if in_image: bbox1, bbox2 = vh.get_bboxes(ibs, [aid1, aid2], [offset1, offset2]) theta1, theta2 = ibs.get_annot_thetas([aid1, aid2]) # HACK! if show_query: pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color2 = truth_color if draw_border else pt.ORANGE pt.draw_bbox(bbox2, bbox_color=bbox_color2, lbl=lbl2, theta=theta2) else: xy, w, h = pt.get_axis_xy_width_height(ax) bbox2 = (xy[0], xy[1], w, h) theta2 = 0 if xywh2 is None: #xywh2 = (xy[0], xy[1], w, h) # weird when sidebyside is off y seems to be inverted xywh2 = (0, 0, w, h) if not show_query and xywh1 is None: data_config2 = (None if qreq_ is None else qreq_.get_external_data_config2()) # FIXME, pass data in kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # Draw any selected matches #sm_kw = dict(rect=True, colors=pt.BLUE) pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) if draw_border: pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_lbl: # Custom user lbl for chips 1 and 2 if show_query: (x1, y1, w1, h1) = xywh1 pt.absolute_lbl(x1 + w1, y1, lbl1) (x2, y2, w2, h2) = xywh2 pt.absolute_lbl(x2 + w2, y2, lbl2) if True: # No matches draw a red box if fm is None or len(fm) == 0: if draw_border: pass
def draw_feat_row(chip, fx, kp, sift, fnum, nRows, nCols=None, px=None, prevsift=None, origsift=None, aid=None, info='', type_=None, shape_labels=False, vecfield=False, multicolored_arms=False, draw_chip=False, draw_warped=True, draw_unwarped=True, draw_desc=True, rect=True, ori=True, pts=False, **kwargs): """ draw_feat_row SeeAlso: ibeis.viz.viz_nearest_descriptors ~/code/ibeis/ibeis/viz/viz_nearest_descriptors.py CommandLine: # Use this to find the fx you want to visualize python -m plottool.interact_keypoints --test-ishow_keypoints --show --fname zebra.png # Use this to visualize the featrow python -m plottool.viz_featrow --test-draw_feat_row --show python -m plottool.viz_featrow --test-draw_feat_row --show --fname zebra.png --fx=121 --feat-all --no-sift python -m plottool.viz_featrow --test-draw_feat_row --dpath figures --save ~/latex/crall-candidacy-2015/figures/viz_featrow.jpg Example: >>> # DISABLE_DOCTEST >>> from plottool.viz_featrow import * # NOQA >>> import plottool as pt >>> # build test data >>> kpts, vecs, imgBGR = pt.viz_keypoints.testdata_kpts() >>> chip = imgBGR >>> print('There are %d features' % (len(vecs))) >>> fx = ut.get_argval('--fx', type_=int, default=0) >>> kp = kpts[fx] >>> sift = vecs[fx] >>> fnum = 1 >>> nRows = 1 >>> nCols = 2 >>> px = 0 >>> hack = ut.get_argflag('--feat-all') >>> sift = sift if not ut.get_argflag('--no-sift') else None >>> draw_desc = sift is not None >>> kw = dict( >>> prevsift=None, origsift=None, aid=None, info='', type_=None, >>> shape_labels=False, vecfield=False, multicolored_arms=True, >>> draw_chip=hack, draw_unwarped=hack, draw_warped=True, draw_desc=draw_desc >>> ) >>> # execute function >>> result = draw_feat_row(chip, fx, kp, sift, fnum, nRows, nCols, px, >>> rect=False, ori=False, pts=False, **kw) >>> # verify results >>> print(result) >>> pt.show_if_requested() """ import numpy as np import vtool as vt # should not need ncols here if nCols is not None: if ut.VERBOSE: print('Warning nCols is no longer needed') #assert nCols_ == nCols nCols = (draw_chip + draw_unwarped + draw_warped + draw_desc) pnum_ = df2.make_pnum_nextgen(nRows, nCols, start=px) #pnum_ = df2.get_pnum_func(nRows, nCols, base=1) #countgen = itertools.count(1) #pnumgen_ = df2.make_pnum_nextgen(nRows, nCols, base=1) def _draw_patch(**kwargs): return df2.draw_keypoint_patch(chip, kp, sift, rect=rect, ori=ori, pts=pts, ori_color=custom_constants.DEEP_PINK, multicolored_arms=multicolored_arms, **kwargs) # Feature strings xy_str, shape_str, scale, ori_str = ph.kp_info(kp) if draw_chip: pnum = pnum_() df2.imshow(chip, fnum=fnum, pnum=pnum) kpts_kw = dict(ell_linewidth=5, ell_alpha=1.0) kpts_kw.update(kwargs) df2.draw_kpts2([kp], **kpts_kw) if draw_unwarped: # Draw the unwarped selected feature #ax = _draw_patch(fnum=fnum, pnum=pnum_(px + six.next(countgen))) #pnum = pnum_(px + six.next(countgen) pnum = pnum_() ax = _draw_patch(fnum=fnum, pnum=pnum) ph.set_plotdat(ax, 'viztype', 'unwarped') ph.set_plotdat(ax, 'aid', aid) ph.set_plotdat(ax, 'fx', fx) if shape_labels: unwarped_lbl = 'affine feature invV =\n' + shape_str + '\n' + ori_str custom_figure.set_xlabel(unwarped_lbl, ax) if draw_warped: # Draw the warped selected feature #ax = _draw_patch(fnum=fnum, pnum=pnum_(px + six.next(countgen)), warped=True) pnum = pnum_() ax = _draw_patch(fnum=fnum, pnum=pnum, warped=True, **kwargs) ph.set_plotdat(ax, 'viztype', 'warped') ph.set_plotdat(ax, 'aid', aid) ph.set_plotdat(ax, 'fx', fx) if shape_labels: warped_lbl = ('warped feature\n' + 'fx=%r scale=%.1f\n' + '%s') % (fx, scale, xy_str) else: warped_lbl = '' warped_lbl += info custom_figure.set_xlabel(warped_lbl, ax) if draw_desc: border_color = { 'None': None, 'query': None, 'match': custom_constants.BLUE, 'norm': custom_constants.ORANGE }.get(str(type_).lower(), None) if border_color is not None: df2.draw_border(ax, color=border_color) # Draw the SIFT representation #pnum = pnum_(px + six.next(countgen)) pnum = pnum_() sift_as_vecfield = ph.SIFT_OR_VECFIELD or vecfield if sift_as_vecfield: custom_figure.figure(fnum=fnum, pnum=pnum) df2.draw_keypoint_gradient_orientations(chip, kp, sift=sift) else: if sift.dtype.type == np.uint8: sigtitle = 'sift histogram' if (px % 3) == 0 else '' ax = df2.plot_sift_signature(sift, sigtitle, fnum=fnum, pnum=pnum) else: sigtitle = 'descriptor vector' if (px % 3) == 0 else '' ax = df2.plot_descriptor_signature(sift, sigtitle, fnum=fnum, pnum=pnum) ax._hs_viztype = 'histogram' #dist_list = ['L1', 'L2', 'hist_isect', 'emd'] #dist_list = ['L2', 'hist_isect'] #dist_list = ['L2'] #dist_list = ['bar_L2_sift', 'cos_sift'] #dist_list = ['L2_sift', 'bar_cos_sift'] dist_list = ['L2_sift'] dist_str_list = [] if origsift is not None: distmap_orig = vt.compute_distances(sift, origsift, dist_list) dist_str_list.append('query_dist: ' + ', '.join([ '(%s, %s)' % (key, formatdist(val)) for key, val in six.iteritems(distmap_orig) ])) if prevsift is not None: distmap_prev = vt.compute_distances(sift, prevsift, dist_list) dist_str_list.append('prev_dist: ' + ', '.join([ '(%s, %s)' % (key, formatdist(val)) for key, val in six.iteritems(distmap_prev) ])) dist_str = '\n'.join(dist_str_list) custom_figure.set_xlabel(dist_str) return px + nCols
def draw_feat_row( chip, fx, kp, sift, fnum, nRows, nCols=None, px=None, prevsift=None, origsift=None, aid=None, info="", type_=None, shape_labels=False, vecfield=False, multicolored_arms=False, draw_chip=False, draw_warped=True, draw_unwarped=True, draw_desc=True, rect=True, ori=True, pts=False, **kwargs ): """ draw_feat_row SeeAlso: ibeis.viz.viz_nearest_descriptors ~/code/ibeis/ibeis/viz/viz_nearest_descriptors.py CommandLine: # Use this to find the fx you want to visualize python -m plottool.interact_keypoints --test-ishow_keypoints --show --fname zebra.png # Use this to visualize the featrow python -m plottool.viz_featrow --test-draw_feat_row --show python -m plottool.viz_featrow --test-draw_feat_row --show --fname zebra.png --fx=121 --feat-all --no-sift python -m plottool.viz_featrow --test-draw_feat_row --dpath figures --save ~/latex/crall-candidacy-2015/figures/viz_featrow.jpg Example: >>> # DISABLE_DOCTEST >>> from plottool.viz_featrow import * # NOQA >>> import plottool as pt >>> # build test data >>> kpts, vecs, imgBGR = pt.viz_keypoints.testdata_kpts() >>> chip = imgBGR >>> print('There are %d features' % (len(vecs))) >>> fx = ut.get_argval('--fx', type_=int, default=0) >>> kp = kpts[fx] >>> sift = vecs[fx] >>> fnum = 1 >>> nRows = 1 >>> nCols = 2 >>> px = 0 >>> hack = ut.get_argflag('--feat-all') >>> sift = sift if not ut.get_argflag('--no-sift') else None >>> draw_desc = sift is not None >>> kw = dict( >>> prevsift=None, origsift=None, aid=None, info='', type_=None, >>> shape_labels=False, vecfield=False, multicolored_arms=True, >>> draw_chip=hack, draw_unwarped=hack, draw_warped=True, draw_desc=draw_desc >>> ) >>> # execute function >>> result = draw_feat_row(chip, fx, kp, sift, fnum, nRows, nCols, px, >>> rect=False, ori=False, pts=False, **kw) >>> # verify results >>> print(result) >>> pt.show_if_requested() """ import numpy as np import vtool as vt # should not need ncols here if nCols is not None: if ut.VERBOSE: print("Warning nCols is no longer needed") # assert nCols_ == nCols nCols = draw_chip + draw_unwarped + draw_warped + draw_desc pnum_ = df2.make_pnum_nextgen(nRows, nCols, start=px) # pnum_ = df2.get_pnum_func(nRows, nCols, base=1) # countgen = itertools.count(1) # pnumgen_ = df2.make_pnum_nextgen(nRows, nCols, base=1) def _draw_patch(**kwargs): return df2.draw_keypoint_patch( chip, kp, sift, rect=rect, ori=ori, pts=pts, ori_color=custom_constants.DEEP_PINK, multicolored_arms=multicolored_arms, **kwargs ) # Feature strings xy_str, shape_str, scale, ori_str = ph.kp_info(kp) if draw_chip: pnum = pnum_() df2.imshow(chip, fnum=fnum, pnum=pnum) kpts_kw = dict(ell_linewidth=5, ell_alpha=1.0) kpts_kw.update(kwargs) df2.draw_kpts2([kp], **kpts_kw) if draw_unwarped: # Draw the unwarped selected feature # ax = _draw_patch(fnum=fnum, pnum=pnum_(px + six.next(countgen))) # pnum = pnum_(px + six.next(countgen) pnum = pnum_() ax = _draw_patch(fnum=fnum, pnum=pnum) ph.set_plotdat(ax, "viztype", "unwarped") ph.set_plotdat(ax, "aid", aid) ph.set_plotdat(ax, "fx", fx) if shape_labels: unwarped_lbl = "affine feature invV =\n" + shape_str + "\n" + ori_str custom_figure.set_xlabel(unwarped_lbl, ax) if draw_warped: # Draw the warped selected feature # ax = _draw_patch(fnum=fnum, pnum=pnum_(px + six.next(countgen)), warped=True) pnum = pnum_() ax = _draw_patch(fnum=fnum, pnum=pnum, warped=True, **kwargs) ph.set_plotdat(ax, "viztype", "warped") ph.set_plotdat(ax, "aid", aid) ph.set_plotdat(ax, "fx", fx) if shape_labels: warped_lbl = ("warped feature\n" + "fx=%r scale=%.1f\n" + "%s") % (fx, scale, xy_str) else: warped_lbl = "" warped_lbl += info custom_figure.set_xlabel(warped_lbl, ax) if draw_desc: border_color = { "None": None, "query": None, "match": custom_constants.BLUE, "norm": custom_constants.ORANGE, }.get(str(type_).lower(), None) if border_color is not None: df2.draw_border(ax, color=border_color) # Draw the SIFT representation # pnum = pnum_(px + six.next(countgen)) pnum = pnum_() sift_as_vecfield = ph.SIFT_OR_VECFIELD or vecfield if sift_as_vecfield: custom_figure.figure(fnum=fnum, pnum=pnum) df2.draw_keypoint_gradient_orientations(chip, kp, sift=sift) else: if sift.dtype.type == np.uint8: sigtitle = "sift histogram" if (px % 3) == 0 else "" ax = df2.plot_sift_signature(sift, sigtitle, fnum=fnum, pnum=pnum) else: sigtitle = "descriptor vector" if (px % 3) == 0 else "" ax = df2.plot_descriptor_signature(sift, sigtitle, fnum=fnum, pnum=pnum) ax._hs_viztype = "histogram" # dist_list = ['L1', 'L2', 'hist_isect', 'emd'] # dist_list = ['L2', 'hist_isect'] # dist_list = ['L2'] # dist_list = ['bar_L2_sift', 'cos_sift'] # dist_list = ['L2_sift', 'bar_cos_sift'] dist_list = ["L2_sift"] dist_str_list = [] if origsift is not None: distmap_orig = vt.compute_distances(sift, origsift, dist_list) dist_str_list.append( "query_dist: " + ", ".join(["(%s, %s)" % (key, formatdist(val)) for key, val in six.iteritems(distmap_orig)]) ) if prevsift is not None: distmap_prev = vt.compute_distances(sift, prevsift, dist_list) dist_str_list.append( "prev_dist: " + ", ".join(["(%s, %s)" % (key, formatdist(val)) for key, val in six.iteritems(distmap_prev)]) ) dist_str = "\n".join(dist_str_list) custom_figure.set_xlabel(dist_str) return px + nCols
def show_image(ibs, gid, sel_aids=[], fnum=None, annote=True, draw_lbls=True, notitle=False, rich_title=False, pnum=(1, 1, 1), **kwargs): """ Driver function to show images Args: ibs (IBEISController): ibeis controller object gid (int): image row id sel_aids (list): fnum (int): figure number annote (bool): draw_lbls (bool): Returns: tuple: (fig, ax) CommandLine: python -m ibeis.viz.viz_image --test-show_image --show python -m ibeis.viz.viz_image --test-show_image --show --db GZ_ALL python -m ibeis.viz.viz_image --test-show_image --show --db GZ_ALL --gid 100 python -m ibeis.viz.viz_image --test-show_image --show --db PZ_MTEST --aid 10 python -m ibeis.viz.viz_image --test-show_image --show --db PZ_MTEST --aid 91 --no-annot --rich-title python -m ibeis.viz.viz_image --test-show_image --show --db GIR_Tanya --aid 1 --no-annot --rich-title Example: >>> # SLOW_DOCTEST >>> # VIZ_TEST >>> from ibeis.viz.viz_image import * # NOQA >>> import ibeis >>> # build test data >>> ibs = ibeis.opendb(ut.get_argval('--db', str, 'testdb1')) >>> #gid = ibs.get_valid_gids()[0] >>> gid = ut.get_argval('--gid', int, 1) >>> aid = ut.get_argval('--aid', int, None) >>> if aid is not None: >>> gid = ibs.get_annot_gids(aid) >>> sel_aids = [] >>> fnum = None >>> annote = not ut.get_argflag('--no-annot') >>> rich_title = ut.get_argflag('--rich-title') >>> draw_lbls = True >>> # execute function >>> (fig, ax) = show_image(ibs, gid, sel_aids, fnum, annote, draw_lbls, rich_title) >>> pt.show_if_requested() """ if fnum is None: fnum = pt.next_fnum() # Read Image img = ibs.get_images(gid) aid_list = ibs.get_image_aids(gid) if sel_aids == 'all': sel_aids = aid_list annotekw = get_annot_annotations(ibs, aid_list, sel_aids, draw_lbls) annotation_centers = vh.get_bbox_centers(annotekw['bbox_list']) title = vh.get_image_titles(ibs, gid) if rich_title: title += ', aids=%r' % (aid_list) title += ', db=%r' % (ibs.get_dbname()) showkw = { 'title' : title, 'annote' : annote, 'fnum' : fnum, 'pnum' : pnum, } if notitle: del showkw['title'] showkw.update(annotekw) fig, ax = viz_image2.show_image(img, **showkw) # Label the axis with data ph.set_plotdat(ax, 'annotation_centers', annotation_centers) ph.set_plotdat(ax, 'aid_list', aid_list) ph.set_plotdat(ax, 'viztype', 'image') ph.set_plotdat(ax, 'gid', gid) return fig, ax
def append_button(self, text, divider=None, rect=None, callback=None, size='9%', location='bottom', ax=None, **kwargs): """ Adds a button to the current page """ if rect is not None: new_ax = df2.plt.axes(rect) if rect is None and divider is None: if ax is None: ax = df2.gca() divider = df2.ensure_divider(ax) if divider is not None: new_ax = divider.append_axes(location, size=size, pad=.05) if callback is not None: color, hovercolor = u'.85', u'.95' else: color, hovercolor = u'.88', u'.88' #color, hovercolor = u'.45', u'.45' #if isinstance(text, six.text_type): new_but = mpl.widgets.Button(new_ax, text, color=color, hovercolor=hovercolor) #elif isinstance(text, (list, tuple)): # labels = [False] * len(text) # labels[0] = True # new_but = mpl.widgets.CheckButtons(new_ax, text, labels) #else: # raise ValueError('bad input') if callback is not None: new_but.on_clicked(callback) else: button_text = new_but.ax.texts[0] button_text.set_color('.6') #button_text.set_color('r') #ut.embed() #print('new_but.color = %r' % (new_but.color,)) #else: # TODO: figure ou how to gray out these buttons # new_but.color = u'.1' # new_but.hovercolor = u'.1' # new_but.active = False # print('new_but.color = %r' % (new_but.color,)) ph.set_plotdat(new_ax, 'viztype', 'button') ph.set_plotdat(new_ax, 'text', text) #ph.set_plotdat(new_ax, 'parent_axes', ax) if ax is not None: child_axes = ph.get_plotdat(ax, 'child_axes', []) child_axes.append(new_ax) ph.set_plotdat(ax, 'child_axes', child_axes) for key, val in six.iteritems(kwargs): ph.set_plotdat(new_ax, key, val) # Keep buttons from losing scrop tup = (new_but, new_ax) self.scope.append(tup) return tup
def annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=None, **kwargs): """ TODO: use this as the main function. """ # TODO Use this function when you clean show_matches in_image = kwargs.get('in_image', False) #show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) # List of annotation scores for each annot in the name #printDBG('[viz] annotate_matches3()') #truth = ibs.get_match_truth(aid1, aid2) #name_equality = ( # np.array(ibs.get_annot_nids(aid_list[1:])) == ibs.get_annot_nids(aid_list[0]) #).tolist() #truth = 1 if all(name_equality) else (2 if any(name_equality) else 0) #truth_color = vh.get_truth_color(truth) ## Build title #score = kwargs.pop('score', None) #rawscore = kwargs.pop('rawscore', None) #aid2_raw_rank = kwargs.pop('aid2_raw_rank', None) #print(kwargs) #title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'multi_match') ph.set_plotdat(ax, 'qaid', aid_list[0]) ph.set_plotdat(ax, 'num_matches', len(aid_list) - 1) ph.set_plotdat(ax, 'aid_list', aid_list[1:]) for count, aid in enumerate(aid_list, start=1): ph.set_plotdat(ax, 'aid%d' % (count, ), aid) #name_equality = (ibs.get_annot_nids(aid_list[0]) == # np.array(ibs.get_annot_nids(aid_list[1:]))) #truth = 1 if np.all(name_equality) else (2 if np.any(name_equality) else 0) truth = get_multitruth(ibs, aid_list) if any(ibs.is_aid_unknown(aid_list[1:])) or ibs.is_aid_unknown( aid_list[0]): truth = ibs.const.TRUTH_UNKNOWN truth_color = vh.get_truth_color(truth) name_annot_scores = kwargs.get('name_annot_scores', None) if len(aid_list) == 2: # HACK; generalize to multple annots title = vh.get_query_text(ibs, None, aid_list[1], truth, qaid=aid_list[0], **kwargs) if not notitle: pt.set_title(title, ax) if draw_lbl: # Build labels nid_list = ibs.get_annot_nids(aid_list, distinguish_unknowns=False) name_list = ibs.get_annot_names(aid_list) lbls_list = [[] for _ in range(len(aid_list))] if kwargs.get('show_name', False): for count, (lbls, name) in enumerate(zip(lbls_list, name_list)): lbls.append(ut.repr2((name))) if kwargs.get('show_nid', True): for count, (lbls, nid) in enumerate(zip(lbls_list, nid_list)): # only label the first two images with nids LABEL_ALL_NIDS = False if count <= 1 or LABEL_ALL_NIDS: #lbls.append(vh.get_nidstrs(nid)) lbls.append(('q' if count == 0 else '') + vh.get_nidstrs(nid)) if kwargs.get('show_aid', True): for count, (lbls, aid) in enumerate(zip(lbls_list, aid_list)): lbls.append(('q' if count == 0 else '') + vh.get_aidstrs(aid)) if (kwargs.get('show_annot_score', True) and name_annot_scores is not None): max_digits = kwargs.get('score_precision', None) for (lbls, score) in zip(lbls_list[1:], name_annot_scores): lbls.append(ut.num_fmt(score, max_digits=max_digits)) lbl_list = [' : '.join(lbls) for lbls in lbls_list] else: lbl_list = [None] * len(aid_list) #pt.set_title(title, ax) # Plot annotations over images if in_image: in_image_bbox_list = vh.get_bboxes(ibs, aid_list, offset_list) in_image_theta_list = ibs.get_annot_thetas(aid_list) # HACK! #if show_query: # pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color = pt.ORANGE bbox_color = truth_color if draw_border else pt.ORANGE for bbox, theta, lbl in zip(in_image_bbox_list, in_image_theta_list, lbl_list): pt.draw_bbox(bbox, bbox_color=bbox_color, lbl=lbl, theta=theta) pass else: xy, w, h = pt.get_axis_xy_width_height(ax) #theta2 = 0 #if xywh2 is None: # #xywh2 = (xy[0], xy[1], w, h) # # weird when sidebyside is off y seems to be inverted # xywh2 = (0, 0, w, h) #if not show_query and xywh1 is None: # data_config2 = None if qreq_ is None else # qreq_.get_external_data_config2() # kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] # #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # # Draw any selected matches # #sm_kw = dict(rect=True, colors=pt.BLUE) # pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) #if draw_border: # pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_border: pt.draw_border(ax, color=truth_color, lw=4) if draw_lbl: # Custom user lbl for chips 1 and 2 #if show_query: # (x1, y1, w1, h1) = xywh1 # pt.absolute_lbl(x1 + w1, y1, lbl1) for bbox, lbl in zip(bbox_list, lbl_list): (x, y, w, h) = bbox pt.absolute_lbl(x + w, y, lbl) # No matches draw a red box if True: no_matches = name_fm_list is None or all( [True if fm is None else len(fm) == 0 for fm in name_fm_list]) if no_matches: xy, w, h = pt.get_axis_xy_width_height(ax) #axes_bbox = (xy[0], xy[1], w, h) if draw_border: pass
def show_chip(ibs, aid, in_image=False, annote=True, title_suffix='', weight_label=None, weights=None, config2_=None, **kwargs): r""" Driver function to show chips Args: ibs (ibeis.IBEISController): aid (int): annotation rowid in_image (bool): displays annotation with the context of its source image annote (bool): enables overlay annoations title_suffix (str): weight_label (None): (default = None) weights (None): (default = None) config2_ (dict): (default = None) Kwargs: enable_chip_title_prefix, nokpts, kpts_subset, kpts, text_color, notitle, draw_lbls, show_aidstr, show_gname, show_name, show_nid, show_exemplar, show_num_gt, show_quality_text, show_yawtext, fnum, title, figtitle, pnum, interpolation, cmap, heatmap, data_colorbar, darken, update, xlabel, redraw_image, ax, alpha, docla, doclf, projection, use_gridspec, pts, ell color (3/4-tuple, ndarray, or str): colors for keypoints CommandLine: python -m ibeis.viz.viz_chip --test-show_chip --show --ecc python -c "import utool as ut; ut.print_auto_docstr('ibeis.viz.viz_chip', 'show_chip')" python -m ibeis.viz.viz_chip --test-show_chip --show --db NNP_Master3 --aids 14047 --no-annote python -m ibeis.viz.viz_chip --test-show_chip --show --db NNP_Master3 --aids 14047 --no-annote python -m ibeis.viz.viz_chip --test-show_chip --show --db PZ_MTEST --aid 1 --bgmethod=cnn python -m ibeis.viz.viz_chip --test-show_chip --show --db PZ_MTEST --aid 1 --bgmethod=cnn --scale_max=30 Example: >>> # VIZ_TEST >>> from ibeis.viz.viz_chip import * # NOQA >>> import numpy as np >>> import vtool as vt >>> in_image = False >>> ibs, aid_list, kwargs, config2_ = testdata_showchip() >>> aid = aid_list[0] >>> if ut.get_argflag('--ecc'): >>> kpts = ibs.get_annot_kpts(aid, config2_=config2_) >>> weights = ibs.get_annot_fgweights([aid], ensure=True, config2_=config2_)[0] >>> kpts = ut.random_sample(kpts[weights > .9], 200, seed=0) >>> ecc = vt.get_kpts_eccentricity(kpts) >>> scale = 1 / vt.get_scales(kpts) >>> s = ecc if config2_.affine_invariance else scale >>> colors = pt.scores_to_color(s, cmap_='jet') >>> kwargs['color'] = colors >>> kwargs['kpts'] = kpts >>> show_chip(ibs, aid, in_image=in_image, config2_=config2_, **kwargs) >>> pt.show_if_requested() """ if ut.VERBOSE: print('[viz] show_chip(aid=%r)' % (aid,)) #ibs.assert_valid_aids((aid,)) # Get chip #print('in_image = %r' % (in_image,)) chip = vh.get_chips(ibs, aid, in_image=in_image, config2_=config2_) # Create chip title chip_text = vh.get_annot_texts(ibs, [aid], **kwargs)[0] if kwargs.get('enable_chip_title_prefix', True): chip_title_text = chip_text + title_suffix else: chip_title_text = title_suffix chip_title_text = chip_title_text.strip('\n') # Draw chip fig, ax = pt.imshow(chip, **kwargs) # Populate axis user data vh.set_ibsdat(ax, 'viztype', 'chip') vh.set_ibsdat(ax, 'aid', aid) if annote and not kwargs.get('nokpts', False): # Get and draw keypoints if 'color' not in kwargs: if weight_label == 'fg_weights': if weights is None and ibs.has_species_detector(ibs.get_annot_species_texts(aid)): weight_label = 'fg_weights' weights = ibs.get_annot_fgweights([aid], ensure=True, config2_=config2_)[0] if weights is not None: cmap_ = 'hot' #if weight_label == 'dstncvs': # cmap_ = 'rainbow' color = pt.scores_to_color(weights, cmap_=cmap_, reverse_cmap=False) kwargs['color'] = color kwargs['ell_color'] = color kwargs['pts_color'] = color kpts_ = vh.get_kpts(ibs, aid, in_image, config2_=config2_, kpts_subset=kwargs.get('kpts_subset', None), kpts=kwargs.get('kpts', None)) try: del kwargs['kpts'] except KeyError: pass pt.viz_keypoints._annotate_kpts(kpts_, **kwargs) if not ut.get_argflag('--noaidlabel'): pt.upperleft_text(chip_text, color=kwargs.get('text_color', None)) use_title = not kwargs.get('notitle', False) if use_title: pt.set_title(chip_title_text) if in_image: gid = ibs.get_annot_gids(aid) aid_list = ibs.get_image_aids(gid) annotekw = viz_image.get_annot_annotations( ibs, aid_list, sel_aids=[aid], draw_lbls=kwargs.get('draw_lbls', True)) # Put annotation centers in the axis ph.set_plotdat(ax, 'annotation_bbox_list', annotekw['bbox_list']) ph.set_plotdat(ax, 'aid_list', aid_list) pt.viz_image2.draw_image_overlay(ax, **annotekw) zoom_ = ut.get_argval('--zoom', type_=float, default=None) if zoom_ is not None: import vtool as vt # Zoom into the chip for some image context rotated_verts = ibs.get_annot_rotated_verts(aid) bbox = ibs.get_annot_bboxes(aid) #print(bbox) #print(rotated_verts) rotated_bbox = vt.bbox_from_verts(rotated_verts) imgw, imgh = ibs.get_image_sizes(gid) pad_factor = zoom_ pad_length = min(bbox[2], bbox[3]) * pad_factor minx = max(rotated_bbox[0] - pad_length, 0) miny = max(rotated_bbox[1] - pad_length, 0) maxx = min((rotated_bbox[0] + rotated_bbox[2]) + pad_length, imgw) maxy = min((rotated_bbox[1] + rotated_bbox[3]) + pad_length, imgh) #maxy = imgh - maxy #miny = imgh - miny ax = pt.gca() ax.set_xlim(minx, maxx) ax.set_ylim(miny, maxy) ax.invert_yaxis() else: ph.set_plotdat(ax, 'chipshape', chip.shape) #if 'featweights' in vars() and 'color' in kwargs: if weights is not None and weight_label is not None: ## HACK HACK HACK if len(weights) > 0: cb = pt.colorbar(weights, kwargs['color']) cb.set_label(weight_label) return fig, ax
def annotate_matches2( ibs, aid1, aid2, fm, fs, offset1=(0, 0), offset2=(0, 0), xywh2=None, # (0, 0, 0, 0), xywh1=None, # (0, 0, 0, 0), qreq_=None, **kwargs): """ TODO: use this as the main function. """ if True: aid_list = [aid1, aid2] bbox_list = [xywh1, xywh2] offset_list = [offset1, offset2] name_fm_list = [fm] name_fs_list = [fs] return annotate_matches3(ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=qreq_, **kwargs) else: # TODO: make sure all of this functionality is incorporated into annotate_matches3 in_image = kwargs.get('in_image', False) show_query = kwargs.get('show_query', True) draw_border = kwargs.get('draw_border', True) draw_lbl = kwargs.get('draw_lbl', True) notitle = kwargs.get('notitle', False) truth = ibs.get_match_truth(aid1, aid2) truth_color = vh.get_truth_color(truth) # Build title title = vh.get_query_text(ibs, None, aid2, truth, qaid=aid1, **kwargs) # Build xlbl ax = pt.gca() ph.set_plotdat(ax, 'viztype', 'matches') ph.set_plotdat(ax, 'qaid', aid1) ph.set_plotdat(ax, 'aid1', aid1) ph.set_plotdat(ax, 'aid2', aid2) if draw_lbl: name1, name2 = ibs.get_annot_names([aid1, aid2]) nid1, nid2 = ibs.get_annot_name_rowids([aid1, aid2], distinguish_unknowns=False) #lbl1 = repr(name1) + ' : ' + 'q' + vh.get_aidstrs(aid1) #lbl2 = repr(name2) + ' : ' + vh.get_aidstrs(aid2) lbl1_list = [] lbl2_list = [] if kwargs.get('show_aid', True): lbl1_list.append('q' + vh.get_aidstrs(aid1)) lbl2_list.append(vh.get_aidstrs(aid2)) if kwargs.get('show_name', True): lbl1_list.append(repr((name1))) lbl2_list.append(repr((name2))) if kwargs.get('show_nid', True): lbl1_list.append(vh.get_nidstrs(nid1)) lbl2_list.append(vh.get_nidstrs(nid2)) lbl1 = ' : '.join(lbl1_list) lbl2 = ' : '.join(lbl2_list) else: lbl1, lbl2 = None, None if vh.NO_LBL_OVERRIDE: title = '' if not notitle: pt.set_title(title, ax) # Plot annotations over images if in_image: bbox1, bbox2 = vh.get_bboxes(ibs, [aid1, aid2], [offset1, offset2]) theta1, theta2 = ibs.get_annot_thetas([aid1, aid2]) # HACK! if show_query: pt.draw_bbox(bbox1, bbox_color=pt.ORANGE, lbl=lbl1, theta=theta1) bbox_color2 = truth_color if draw_border else pt.ORANGE pt.draw_bbox(bbox2, bbox_color=bbox_color2, lbl=lbl2, theta=theta2) else: xy, w, h = pt.get_axis_xy_width_height(ax) bbox2 = (xy[0], xy[1], w, h) theta2 = 0 if xywh2 is None: #xywh2 = (xy[0], xy[1], w, h) # weird when sidebyside is off y seems to be inverted xywh2 = (0, 0, w, h) if not show_query and xywh1 is None: data_config2 = (None if qreq_ is None else qreq_.get_external_data_config2()) # FIXME, pass data in kpts2 = ibs.get_annot_kpts([aid2], config2_=data_config2)[0] #pt.draw_kpts2(kpts2.take(fm.T[1], axis=0)) # Draw any selected matches #sm_kw = dict(rect=True, colors=pt.BLUE) pt.plot_fmatch(None, xywh2, None, kpts2, fm, fs=fs, **kwargs) if draw_border: pt.draw_border(ax, truth_color, 4, offset=offset2) if draw_lbl: # Custom user lbl for chips 1 and 2 if show_query: (x1, y1, w1, h1) = xywh1 pt.absolute_lbl(x1 + w1, y1, lbl1) (x2, y2, w2, h2) = xywh2 pt.absolute_lbl(x2 + w2, y2, lbl2) if True: # No matches draw a red box if fm is None or len(fm) == 0: if draw_border: pass
def show_chip(ibs, aid, in_image=False, annote=True, title_suffix='', weight_label=None, weights=None, config2_=None, **kwargs): r""" Driver function to show chips Args: ibs (ibeis.IBEISController): aid (int): annotation rowid in_image (bool): displays annotation with the context of its source image annote (bool): enables overlay annoations title_suffix (str): weight_label (None): (default = None) weights (None): (default = None) config2_ (dict): (default = None) Kwargs: enable_chip_title_prefix, nokpts, kpts_subset, kpts, text_color, notitle, draw_lbls, show_aidstr, show_gname, show_name, show_nid, show_exemplar, show_num_gt, show_quality_text, show_yawtext, fnum, title, figtitle, pnum, interpolation, cmap, heatmap, data_colorbar, darken, update, xlabel, redraw_image, ax, alpha, docla, doclf, projection, use_gridspec, pts, ell color (3/4-tuple, ndarray, or str): colors for keypoints CommandLine: python -m ibeis.viz.viz_chip --test-show_chip --show --ecc python -c "import utool as ut; ut.print_auto_docstr('ibeis.viz.viz_chip', 'show_chip')" python -m ibeis.viz.viz_chip --test-show_chip --show --db NNP_Master3 --aids 14047 --no-annote python -m ibeis.viz.viz_chip --test-show_chip --show --db NNP_Master3 --aids 14047 --no-annote python -m ibeis.viz.viz_chip --test-show_chip --show --db PZ_MTEST --aid 1 --bgmethod=cnn python -m ibeis.viz.viz_chip --test-show_chip --show --db PZ_MTEST --aid 1 --bgmethod=cnn --scale_max=30 Example: >>> # VIZ_TEST >>> from ibeis.viz.viz_chip import * # NOQA >>> import numpy as np >>> import vtool as vt >>> in_image = False >>> ibs, aid_list, kwargs, config2_ = testdata_showchip() >>> aid = aid_list[0] >>> if ut.get_argflag('--ecc'): >>> kpts = ibs.get_annot_kpts(aid, config2_=config2_) >>> weights = ibs.get_annot_fgweights([aid], ensure=True, config2_=config2_)[0] >>> kpts = ut.random_sample(kpts[weights > .9], 200, seed=0) >>> ecc = vt.get_kpts_eccentricity(kpts) >>> scale = 1 / vt.get_scales(kpts) >>> s = ecc if config2_.affine_invariance else scale >>> colors = pt.scores_to_color(s, cmap_='jet') >>> kwargs['color'] = colors >>> kwargs['kpts'] = kpts >>> show_chip(ibs, aid, in_image=in_image, config2_=config2_, **kwargs) >>> pt.show_if_requested() """ if ut.VERBOSE: print('[viz] show_chip(aid=%r)' % (aid, )) #ibs.assert_valid_aids((aid,)) # Get chip #print('in_image = %r' % (in_image,)) chip = vh.get_chips(ibs, aid, in_image=in_image, config2_=config2_) # Create chip title chip_text = vh.get_annot_texts(ibs, [aid], **kwargs)[0] if kwargs.get('enable_chip_title_prefix', True): chip_title_text = chip_text + title_suffix else: chip_title_text = title_suffix chip_title_text = chip_title_text.strip('\n') # Draw chip fig, ax = pt.imshow(chip, **kwargs) # Populate axis user data vh.set_ibsdat(ax, 'viztype', 'chip') vh.set_ibsdat(ax, 'aid', aid) if annote and not kwargs.get('nokpts', False): # Get and draw keypoints if 'color' not in kwargs: if weight_label == 'fg_weights': if weights is None and ibs.has_species_detector( ibs.get_annot_species_texts(aid)): weight_label = 'fg_weights' weights = ibs.get_annot_fgweights([aid], ensure=True, config2_=config2_)[0] if weights is not None: cmap_ = 'hot' #if weight_label == 'dstncvs': # cmap_ = 'rainbow' color = pt.scores_to_color(weights, cmap_=cmap_, reverse_cmap=False) kwargs['color'] = color kwargs['ell_color'] = color kwargs['pts_color'] = color kpts_ = vh.get_kpts(ibs, aid, in_image, config2_=config2_, kpts_subset=kwargs.get('kpts_subset', None), kpts=kwargs.get('kpts', None)) try: del kwargs['kpts'] except KeyError: pass pt.viz_keypoints._annotate_kpts(kpts_, **kwargs) if not ut.get_argflag('--noaidlabel'): pt.upperleft_text(chip_text, color=kwargs.get('text_color', None)) use_title = not kwargs.get('notitle', False) if use_title: pt.set_title(chip_title_text) if in_image: gid = ibs.get_annot_gids(aid) aid_list = ibs.get_image_aids(gid) annotekw = viz_image.get_annot_annotations(ibs, aid_list, sel_aids=[aid], draw_lbls=kwargs.get( 'draw_lbls', True)) # Put annotation centers in the axis ph.set_plotdat(ax, 'annotation_bbox_list', annotekw['bbox_list']) ph.set_plotdat(ax, 'aid_list', aid_list) pt.viz_image2.draw_image_overlay(ax, **annotekw) zoom_ = ut.get_argval('--zoom', type_=float, default=None) if zoom_ is not None: import vtool as vt # Zoom into the chip for some image context rotated_verts = ibs.get_annot_rotated_verts(aid) bbox = ibs.get_annot_bboxes(aid) #print(bbox) #print(rotated_verts) rotated_bbox = vt.bbox_from_verts(rotated_verts) imgw, imgh = ibs.get_image_sizes(gid) pad_factor = zoom_ pad_length = min(bbox[2], bbox[3]) * pad_factor minx = max(rotated_bbox[0] - pad_length, 0) miny = max(rotated_bbox[1] - pad_length, 0) maxx = min((rotated_bbox[0] + rotated_bbox[2]) + pad_length, imgw) maxy = min((rotated_bbox[1] + rotated_bbox[3]) + pad_length, imgh) #maxy = imgh - maxy #miny = imgh - miny ax = pt.gca() ax.set_xlim(minx, maxx) ax.set_ylim(miny, maxy) ax.invert_yaxis() else: ph.set_plotdat(ax, 'chipshape', chip.shape) #if 'featweights' in vars() and 'color' in kwargs: if weights is not None and weight_label is not None: ## HACK HACK HACK if len(weights) > 0: cb = pt.colorbar(weights, kwargs['color']) cb.set_label(weight_label) return fig, ax