Source code for ibeis.viz.interact.interact_annotations2

# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
from plottool import interact_annotations
import plottool as pt  # NOQA
import utool as ut
print, rrr, profile = ut.inject2(__name__, '[interact_annot2]')


#DESTROY_OLD_WINDOW = True
DESTROY_OLD_WINDOW = False


[docs]def ishow_image2(ibs, gid, fnum=None, dodraw=True): r""" Args: ibs (IBEISController): ibeis controller object gid (int): dodraw (bool): CommandLine: python -m ibeis.viz.interact.interact_annotations2 --test-ishow_image2 --show Example: >>> # DISABLE_DOCTEST >>> from ibeis.viz.interact.interact_annotations2 import * # NOQA >>> import ibeis >>> # build test data >>> ibs = ibeis.opendb('testdb1') >>> gid = 2 >>> dodraw = True >>> # execute function >>> self = ishow_image2(ibs, gid, dodraw) >>> # verify results >>> result = str(self) >>> print(result) >>> pt.show_if_requested() """ self = ANNOTATION_Interaction2(ibs, gid, fnum=fnum, dodraw=dodraw) return self
[docs]class ANNOTATION_Interaction2(object): def __init__(self, ibs, gid, next_callback=None, prev_callback=None, rows_updated_callback=None, reset_window=True, dodraw=True, fnum=None): """ TODO: rename to interact image annotations? """ self.ibs = ibs self.gid = gid self.rows_updated_callback = rows_updated_callback img = ibs.get_images(self.gid) self.aid_list = ibs.get_image_aids(self.gid) bbox_list = ibs.get_annot_bboxes(self.aid_list) #verts_list = ibs.get_annot_verts(self.aid_list) # TODO theta_list = ibs.get_annot_thetas(self.aid_list) species_list = ibs.get_annot_species_texts(self.aid_list) #valid_species = ibs.get_all_species_texts() valid_species = [tup[1] for tup in ibs.get_working_species()] metadata_list = [ibs.get_annot_lazy_dict(aid) for aid in self.aid_list] for metadata in metadata_list: # eager eval on name metadata['name'] if True: interact_annotations.rrr() self.interact_ANNOTATIONS = interact_annotations.ANNOTATIONInteraction( img, bbox_list=bbox_list, theta_list=theta_list, species_list=species_list, metadata_list=metadata_list, commit_callback=self.commit_callback, # TODO: get default species in a better way default_species=self.ibs.cfg.detect_cfg.species_text, next_callback=next_callback, prev_callback=prev_callback, fnum=fnum, valid_species=valid_species, #figure_to_use=None if reset_window else self.interact_ANNOTATIONS.fig, ) if dodraw: pt.update()
[docs] def commit_callback(self, unchanged_indices, deleted_indices, changed_indices, changed_annottups, new_annottups): """ TODO: Rename to commit_callback Callback from interact_annotations to ibs for when data is modified """ print('[interact_annot2] enter commit_callback') print('[interact_annot2] nUnchanged=%d, nDelete=%d, nChanged=%d, nNew=%d' % (len(unchanged_indices), len(deleted_indices), len(changed_indices), len(new_annottups))) rows_updated = False # Delete annotations if len(deleted_indices) > 0: rows_updated = True deleted_aids = [self.aid_list[del_index] for del_index in deleted_indices] print('[interact_annot2] deleted_indexes: %r' % (deleted_indices,)) print('[interact_annot2] deleted_aids: %r' % (deleted_aids,)) self.ibs.delete_annots(deleted_aids) # Set/Change annotations if len(changed_annottups) > 0: changed_aid = [self.aid_list[index] for index in changed_indices] bbox_list1 = [bbox for (bbox, t, s) in changed_annottups] theta_list1 = [t for (bbox, t, s) in changed_annottups] species_list1 = [s for (bbox, t, s) in changed_annottups] print('[interact_annot2] changed_indexes: %r' % (changed_indices,)) print('[interact_annot2] changed_aid: %r' % (changed_aid,)) self.ibs.set_annot_species(changed_aid, species_list1) self.ibs.set_annot_thetas(changed_aid, theta_list1, delete_thumbs=False) self.ibs.set_annot_bboxes(changed_aid, bbox_list1, delete_thumbs=True) # Add annotations if len(new_annottups) > 0: # New list returns a list of tuples [(x, y, w, h, theta, species) ...] rows_updated = True bbox_list2 = [bbox for (bbox, t, s) in new_annottups] theta_list2 = [t for (bbox, t, s) in new_annottups] species_list2 = [s for (bbox, t, s) in new_annottups] gid_list = [self.gid] * len(new_annottups) new_aids = self.ibs.add_annots(gid_list, bbox_list=bbox_list2, theta_list=theta_list2, species_list=species_list2) print('[interact_annot2] new_indexes: %r' % (new_annottups,)) print('[interact_annot2] new_aids: %r' % (new_aids,)) print('[interact_annot2] about to exit callback') if rows_updated and self.rows_updated_callback is not None: self.rows_updated_callback() print('[interact_annot2] exit callback')
[docs] def update_image_and_callbacks(self, gid, nextcb, prevcb, do_save=True): if do_save: # save the current changes when pressing next or previous self.interact_ANNOTATIONS.save_and_exit(None, do_close=False) if DESTROY_OLD_WINDOW: ANNOTATION_Interaction2.__init__( self, self.ibs, gid, next_callback=nextcb, prev_callback=prevcb, rows_updated_callback=self.rows_updated_callback, reset_window=False) else: if True: self.interact_ANNOTATIONS.rrr() ibs = self.ibs self.gid = gid img = ibs.get_images(self.gid) self.aid_list = ibs.get_image_aids(self.gid) bbox_list = ibs.get_annot_bboxes(self.aid_list) theta_list = ibs.get_annot_thetas(self.aid_list) species_list = ibs.get_annot_species_texts(self.aid_list) metadata_list = [ibs.get_annot_lazy_dict(aid) for aid in self.aid_list] self.interact_ANNOTATIONS.update_image_and_callbacks( img, bbox_list=bbox_list, theta_list=theta_list, species_list=species_list, metadata_list=metadata_list, next_callback=nextcb, prev_callback=prevcb, )
if __name__ == '__main__': """ CommandLine: python -m ibeis.viz.interact.interact_annotations2 python -m ibeis.viz.interact.interact_annotations2 --allexamples python -m ibeis.viz.interact.interact_annotations2 --allexamples --noface --nosrc """ import multiprocessing multiprocessing.freeze_support() # for win32 import utool as ut # NOQA ut.doctest_funcs()