Source code for ibeis.other.duct_tape

# -*- coding: utf-8 -*-
# developer convenience functions for ibs
from __future__ import absolute_import, division, print_function, unicode_literals
import utool as ut
from six.moves import zip
from ibeis import constants as const
(print, rrr, profile) = ut.inject2(__name__, '[duct_tape]')


[docs]def fix_compname_configs(ibs): """ duct tape to keep version in check """ #ibs.MANUAL_CONFIG_SUFFIX = '_MANUAL_' #+ ut.get_computer_name() #ibs.MANUAL_CONFIGID = ibs.add_config(ibs.MANUAL_CONFIG_SUFFIX) # We need to fix the manual config suffix to not use computer names anymore configid_list = ibs.get_valid_configids() cfgsuffix_list = ibs.get_config_suffixes(configid_list) ibs.MANUAL_CONFIG_SUFFIX = 'MANUAL_CONFIG' ibs.MANUAL_CONFIGID = ibs.add_config(ibs.MANUAL_CONFIG_SUFFIX) for rowid, suffix in filter(lambda tup: tup[1].startswith('_MANUAL_'), zip(configid_list, cfgsuffix_list)): print("EVALUATING: %r, %r" % (rowid, suffix)) # Fix the tables with bad config_rowids ibs.db.executeone( ''' UPDATE {AL_RELATION_TABLE} SET config_rowid=? WHERE config_rowid=? '''.format(**const.__dict__), params=(ibs.MANUAL_CONFIGID, rowid)) # Delete the bad config_suffixes ibs.db.executeone( ''' DELETE FROM {CONFIG_TABLE} WHERE config_rowid=? '''.format(**const.__dict__), params=(rowid,))
[docs]def remove_database_slag(ibs, delete_empty_names=False, delete_empty_imagesets=False, delete_annotations_for_missing_images=False, delete_image_labels_for_missing_types=False, delete_annot_labels_for_missing_types=False, delete_chips_for_missing_annotations=False, delete_features_for_missing_annotations=False, delete_invalid_eg_relations=False, delete_invalid_gl_relations=False, delete_invalid_al_relations=True): # ZERO ORDER if delete_empty_names: ibs.delete_empty_nids() if delete_empty_imagesets: ibs.delete_empty_imgsetids() # FIRST ORDER if delete_annotations_for_missing_images: ibs.db.executeone( ''' DELETE FROM {ANNOTATION_TABLE} WHERE image_rowid NOT IN (SELECT rowid FROM {IMAGE_TABLE}) '''.format(**const.__dict__)) if delete_image_labels_for_missing_types: ibs.db.executeone( ''' DELETE FROM {LBLIMAGE_TABLE} WHERE lbltype_rowid NOT IN (SELECT rowid FROM {LBLTYPE_TABLE}) '''.format(**const.__dict__)) if delete_annot_labels_for_missing_types: ibs.db.executeone( ''' DELETE FROM {LBLANNOT_TABLE} WHERE lbltype_rowid NOT IN (SELECT rowid FROM {LBLTYPE_TABLE}) '''.format(**const.__dict__)) # SECOND ORDER if delete_chips_for_missing_annotations: ibs.db.executeone( ''' DELETE FROM {CHIP_TABLE} WHERE annot_rowid NOT IN (SELECT rowid FROM {ANNOTATION_TABLE}) '''.format(**const.__dict__)) # OR config_rowid NOT IN (SELECT rowid FROM {CONFIG_TABLE}) if delete_features_for_missing_annotations: ibs.db.executeone( ''' DELETE FROM {FEATURE_TABLE} WHERE chip_rowid NOT IN (SELECT rowid FROM {CHIP_TABLE}) '''.format(**const.__dict__)) # OR config_rowid NOT IN (SELECT rowid FROM {CONFIG_TABLE}) if delete_invalid_eg_relations: ibs.db.executeone( ''' DELETE FROM {GSG_RELATION_TABLE} WHERE image_rowid NOT IN (SELECT rowid FROM {IMAGE_TABLE}) OR imageset_rowid NOT IN (SELECT rowid FROM {IMAGESET_TABLE}) '''.format(**const.__dict__)) # THIRD ORDER if delete_invalid_gl_relations: ibs.db.executeone( ''' DELETE FROM {GL_RELATION_TABLE} WHERE image_rowid NOT IN (SELECT rowid FROM {IMAGE_TABLE}) OR lblimage_rowid NOT IN (SELECT rowid FROM {LBLIMAGE_TABLE}) '''.format(**const.__dict__)) # OR config_rowid NOT IN (SELECT rowid FROM {CONFIG_TABLE}) if delete_invalid_al_relations: ibs.db.executeone( ''' DELETE FROM {AL_RELATION_TABLE} WHERE annot_rowid NOT IN (SELECT rowid FROM {ANNOTATION_TABLE}) OR lblannot_rowid NOT IN (SELECT rowid FROM {LBLANNOT_TABLE}) '''.format(**const.__dict__)) # OR config_rowid NOT IN (SELECT rowid FROM {CONFIG_TABLE})
[docs]def enforce_unkonwn_name_is_explicit(ibs): nid_list = ibs.get_valid_nids() text_list = ibs.get_name_texts(nid_list) problem_nids = [text for text, nid in zip(text_list, nid_list) if text == const.UNKNOWN] unknown_aids = ibs.get_name_aids(problem_nids) assert len(ut.flatten(unknown_aids)) == 0 # TODO Take unknown_aids and remove any name relationships to make unknown # implicit
[docs]def fix_nulled_yaws(ibs): aid_list = ibs.get_valid_aids() yaw_list = ibs.get_annot_yaws(aid_list) valid_list = [yaw == 0.0 for yaw in yaw_list] dirty_aid_list = ut.filter_items(aid_list, valid_list) print("[duct_tape] Nulling %d annotation yaws" % len(dirty_aid_list)) ibs.set_annot_yaws(dirty_aid_list, [None] * len(dirty_aid_list))
[docs]def parse_and_update_image_exif_orientations(ibs, verbose=False): from PIL import Image # NOQA from ibeis.algo.preproc.preproc_image import parse_exif from os.path import exists def _parse_orient(gpath): if verbose: print('[db_update (1.5.2)] Parsing: %r' % (gpath, )) pil_img = Image.open(gpath, 'r') # NOQA time, lat, lon, orient = parse_exif(pil_img) # Read exif tags return orient # Get images without orientations and add to the database gid_list_all = ibs.get_valid_gids() gpath_list = ibs.get_image_paths(gid_list_all) valid_list = [ exists(gpath) for gpath in gpath_list ] gid_list = ut.filter_items(gid_list_all, valid_list) orient_list = ibs.get_image_orientation(gid_list) zipped = zip(gid_list, orient_list) gid_list_ = [ gid for gid, orient in zipped if orient in [0, None] ] args = (len(gid_list_), len(gid_list_all), valid_list.count(False)) print('[db_update (1.5.2)] Parsing Exif orientations for %d / %d images (skipping %d)' % args) gpath_list_ = ibs.get_image_paths(gid_list_) orient_list_ = [ _parse_orient(gpath) for gpath in gpath_list_ ] ibs.set_image_orientation(gid_list_, orient_list_)