# -*- 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_)