# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
# Python
from six.moves import zip, range, map # NOQA
# UTool
import utool
import utool as ut
import vtool.patch as vtpatch
import vtool.image as vtimage # NOQA
import vtool as vt
#import vtool.image as vtimage
import numpy as np
from ibeis.model.preproc import preproc_probchip
from os.path import exists
from ibeis import constants as const
# Inject utool functions
(print, print_, printDBG, rrr, profile) = utool.inject(__name__, '[preproc_featweight]')
[docs]def test_featweight_worker():
"""
test function
python -m ibeis.model.preproc.preproc_featweight --test-gen_featweight_worker --show --cnn
"""
from ibeis.model.hots import _pipeline_helpers as plh
ibs, qreq_ = plh.get_pipeline_testdata(defaultdb='PZ_MTEST',
qaid_list=[1],
#qaid_list='all',
preload=False,
cfgdict={'featweight_detector': 'cnn'})
config2_ = qreq_.qparams
lazy = True
aid_list = qreq_.get_external_qaids()
#aid_list = ibs.get_valid_aids()[0:30]
kpts_list = ibs.get_annot_kpts(aid_list)
chipsize_list = ibs.get_annot_chip_sizes(aid_list, config2_=config2_)
probchip_fpath_list = preproc_probchip.compute_and_write_probchip(ibs,
aid_list,
lazy=lazy,
config2_=config2_)
print('probchip_fpath_list = %r' % (probchip_fpath_list,))
probchip_list = [vtimage.imread(fpath, grayscale=True) if exists(fpath) else None
for fpath in probchip_fpath_list]
_iter = list(zip(aid_list, kpts_list, probchip_list, chipsize_list))
_iter = ut.InteractiveIter(_iter, enabled=ut.get_argflag('--show'))
for aid, kpts, probchip, chipsize in _iter:
#kpts = kpts_list[0]
#aid = aid_list[0]
#probchip = probchip_list[0]
#chipsize = chipsize_list[0]
tup = (aid, kpts, probchip, chipsize)
(aid, weights) = gen_featweight_worker(tup)
if aid == 3 and ibs.get_dbname() == 'testdb1':
# Run Asserts if not interactive
weights_03_test = weights[0:3]
print('weights[0:3] = %r' % (weights_03_test,))
#weights_03_target = [ 0.098, 0.155, 0.422]
#weights_03_target = [ 0.324, 0.407, 0.688]
#weights_thresh = [ 0.09, 0.09, 0.09]
#ut.assert_almost_eq(weights_03_test, weights_03_target, weights_thresh)
ut.assert_inbounds(weights_03_test, 0, 1)
if not ut.show_was_requested():
break
if ut.show_was_requested():
import plottool as pt
#sfx, sfy = (probchip.shape[1] / chipsize[0], probchip.shape[0] / chipsize[1])
#kpts_ = vt.offset_kpts(kpts, (0, 0), (sfx, sfy))
pnum_ = pt.make_pnum_nextgen(1, 3) # *pt.get_square_row_cols(4))
fnum = 1
pt.figure(fnum=fnum, doclf=True)
###
pt.imshow(ibs.get_annot_chips(aid, config2_=config2_), pnum=pnum_(0), fnum=fnum)
if ut.get_argflag('--numlbl'):
pt.gca().set_xlabel('(1)')
###
pt.imshow(probchip, pnum=pnum_(2), fnum=fnum)
if ut.get_argflag('--numlbl'):
pt.gca().set_xlabel('(2)')
#pt.draw_kpts2(kpts_, ell_alpha=.4, color_list=pt.ORANGE)
###
#pt.imshow(probchip, pnum=pnum_(3), fnum=fnum)
#color_list = pt.draw_kpts2(kpts_, weights=weights, ell_alpha=.7, cmap_='jet')
#cb = pt.colorbar(weights, color_list)
#cb.set_label('featweights')
###
pt.imshow(ibs.get_annot_chips(aid, config2_=qreq_.qparams), pnum=pnum_(1), fnum=fnum)
#color_list = pt.draw_kpts2(kpts, weights=weights, ell_alpha=.3, cmap_='jet')
color_list = pt.draw_kpts2(kpts, weights=weights, ell_alpha=.3)
cb = pt.colorbar(weights, color_list)
cb.set_label('featweights')
if ut.get_argflag('--numlbl'):
pt.gca().set_xlabel('(3)')
#pt.draw_kpts2(kpts, ell_alpha=.4)
pt.draw()
pt.show_if_requested()
[docs]def gen_featweight_worker(tup):
"""
Function to be parallelized by multiprocessing / joblib / whatever.
Must take in one argument to be used by multiprocessing.map_async
Args:
tup (aid, tuple(kpts(ndarray), probchip_fpath )): keypoints and probability chip file path
aid, kpts, probchip_fpath
CommandLine:
python -m ibeis.model.preproc.preproc_featweight --test-gen_featweight_worker --show
python -m ibeis.model.preproc.preproc_featweight --test-gen_featweight_worker --show --dpath figures --save ~/latex/crall-candidacy-2015/figures/gen_featweight.jpg
python -m ibeis.model.preproc.preproc_featweight --test-gen_featweight_worker --show --db PZ_MTEST --qaid_list=1,2,3,4,5,6,7,8,9
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.model.preproc.preproc_featweight import * # NOQA
>>> test_featweight_worker()
Ignore::
import plottool as pt
pt.imshow(probchip_list[0])
patch_list = [vtpatch.get_warped_patch(probchip, kp)[0].astype(np.float32) / 255.0 for kp in kpts[0:1]]
patch_ = patch_list[0].copy()
patch = patch_
patch = patch_[-20:, :20, 0]
import vtool as vt
gaussian_patch = vt.gaussian_patch(patch.shape[1], patch.shape[0], shape=patch.shape[0:2], norm_01=False)
import cv2
sigma = 1/10
xkernel = (cv2.getGaussianKernel(patch.shape[1], sigma))
ykernel = (cv2.getGaussianKernel(patch.shape[0], sigma))
#ykernel = ykernel / ykernel.max()
#xkernel = ykernel / xkernel.max()
gaussian_kern2 = ykernel.dot(xkernel.T)
print(gaussian_kern2.sum())
patch2 = patch.copy()
patch2 = np.multiply(patch2, ykernel)
patch2 = np.multiply(patch2.T, xkernel).T
if len(patch3.shape) == 2:
patch3 = patch.copy() * gaussian_patch[:,:]
else:
patch3 = patch.copy() * gaussian_patch[:,:, None]
sum2 = patch2.sum() / (patch2.size)
sum3 = patch3.sum() / (patch3.size)
print(sum2)
print(sum3)
fig = pt.figure(fnum=1, pnum=(1, 3, 1), doclf=True, docla=True)
pt.imshow(patch * 255)
fig = pt.figure(fnum=1, pnum=(1, 3, 2))
pt.imshow(gaussian_kern2 * 255.0)
fig = pt.figure(fnum=1, pnum=(1, 3, 3))
pt.imshow(patch2 * 255.0)
pt.update()
"""
(aid, kpts, probchip, chipsize) = tup
if probchip is None:
# hack for undetected chips. SETS ALL FEATWEIGHTS TO .25 = 1/4
weights = np.full(len(kpts), .25, dtype=np.float32)
else:
sfx, sfy = (probchip.shape[1] / chipsize[0], probchip.shape[0] / chipsize[1])
kpts_ = vt.offset_kpts(kpts, (0, 0), (sfx, sfy))
#vtpatch.get_warped_patches()
patch_list = [vtpatch.get_warped_patch(probchip, kp)[0].astype(np.float32) / 255.0
for kp in kpts_]
weight_list = [vtpatch.gaussian_average_patch(patch) for patch in patch_list]
#weight_list = [patch.sum() / (patch.size) for patch in patch_list]
weights = np.array(weight_list, dtype=np.float32)
return (aid, weights)
[docs]def compute_fgweights(ibs, aid_list, config2_=None):
"""
Example:
>>> # SLOW_DOCTEST
>>> from ibeis.model.preproc.preproc_featweight import * # NOQA
>>> import ibeis
>>> ibs = ibeis.opendb('testdb1')
>>> aid_list = ibs.get_valid_aids()[1:2]
>>> config2_ = None
>>> featweight_list = compute_fgweights(ibs, aid_list)
>>> result = np.array_str(featweight_list[0][0:3], precision=3)
>>> print(result)
[ 0.125 0.061 0.053]
"""
nTasks = len(aid_list)
print('[preproc_featweight.compute_fgweights] Preparing to compute %d fgweights' % (nTasks,))
probchip_fpath_list = preproc_probchip.compute_and_write_probchip(ibs,
aid_list,
config2_=config2_)
chipsize_list = ibs.get_annot_chip_sizes(aid_list, config2_=config2_)
#if ut.DEBUG2:
# from PIL import Image
# probchip_size_list = [Image.open(fpath).size for fpath in probchip_fpath_list]
# #with ut.embed_on_exception_context:
# # does not need to happen anymore
# assert chipsize_list == probchip_size_list, 'probably need to clear chip or probchip cache'
kpts_list = ibs.get_annot_kpts(aid_list, config2_=config2_)
# Force grayscale reading of chips
probchip_list = [vtimage.imread(fpath, grayscale=True) if exists(fpath) else None
for fpath in probchip_fpath_list]
print('[preproc_featweight.compute_fgweights] Computing %d fgweights' % (nTasks,))
arg_iter = zip(aid_list, kpts_list, probchip_list, chipsize_list)
featweight_gen = utool.generate(gen_featweight_worker, arg_iter,
nTasks=nTasks, ordered=True, freq=10)
featweight_param_list = list(featweight_gen)
#arg_iter = zip(aid_list, kpts_list, probchip_list)
#featweight_param_list1 = [gen_featweight_worker((aid, kpts, probchip)) for
#aid, kpts, probchip in arg_iter]
#featweight_aids = ut.get_list_column(featweight_param_list, 0)
featweight_list = ut.get_list_column(featweight_param_list, 1)
print('[preproc_featweight.compute_fgweights] Done computing %d fgweights' % (nTasks,))
return featweight_list
[docs]def generate_featweight_properties(ibs, feat_rowid_list, config2_=None):
"""
Args:
ibs (IBEISController):
fid_list (list):
Returns:
featweight_list
CommandLine:
python -m ibeis.model.preproc.preproc_featweight --test-generate_featweight_properties
Example:
>>> # ENABLE_DOCTEST
>>> from ibeis.model.preproc.preproc_featweight import * # NOQA
>>> import ibeis
>>> ibs = ibeis.opendb('testdb1')
>>> config2_ = ibs.new_query_params(dict(fg_on=True, featweight_detector='rf'))
>>> aid_list = ibs.get_valid_aids()[1:2]
>>> fid_list = ibs.get_annot_feat_rowids(aid_list, ensure=True)
>>> #fid_list = ibs.get_valid_fids()[1:2]
>>> featweighttup_gen = generate_featweight_properties(ibs, fid_list, config2_=config2_)
>>> featweighttup_list = list(featweighttup_gen)
>>> featweight_list = featweighttup_list[0][0]
>>> featweight_test = featweight_list[0:3]
>>> featweight_target = [ 0.349, 0.218, 0.242]
>>> ut.assert_almost_eq(featweight_test, featweight_target, .3)
"""
# HACK: TODO AUTOGENERATE THIS
#cid_list = ibs.get_feat_cids(feat_rowid_list)
#aid_list = ibs.get_chip_aids(cid_list)
chip_rowid_list = ibs.dbcache.get(const.FEATURE_TABLE, ('chip_rowid',), feat_rowid_list)
aid_list = ibs.dbcache.get(const.CHIP_TABLE, ('annot_rowid',), chip_rowid_list)
featweight_list = compute_fgweights(ibs, aid_list, config2_=config2_)
return zip(featweight_list)
#def get_annot_probchip_fname_iter(ibs, aid_list):
# """ Returns probability chip path iterator
# Args:
# ibs (IBEISController):
# aid_list (list):
# Returns:
# probchip_fname_iter
# Example:
# >>> from ibeis.model.preproc.preproc_featweight import * # NOQA
# >>> import ibeis
# >>> ibs = ibeis.opendb('testdb1')
# >>> aid_list = ibs.get_valid_aids()
# >>> probchip_fname_iter = get_annot_probchip_fname_iter(ibs, aid_list)
# >>> probchip_fname_list = list(probchip_fname_iter)
# """
# cfpath_list = ibs.get_annot_chip_fpath(aid_list, config2_=config2_)
# cfname_list = [splitext(basename(cfpath))[0] for cfpath in cfpath_list]
# suffix = ibs.cfg.detect_cfg.get_cfgstr()
# ext = '.png'
# probchip_fname_iter = (''.join([cfname, suffix, ext]) for cfname in cfname_list)
# return probchip_fname_iter
#def get_annot_probchip_fpath_list(ibs, aid_list):
# cachedir = get_probchip_cachedir(ibs)
# probchip_fname_list = get_annot_probchip_fname_iter(ibs, aid_list)
# probchip_fpath_list = [join(cachedir, fname) for fname in probchip_fname_list]
# return probchip_fpath_list
#class FeatWeightConfig(object):
# # TODO: Put this in a config
# def __init__(fw_cfg):
# fw_cfg.sqrt_area = 800
[docs]def on_delete(ibs, featweight_rowid_list, config2_=None):
# no external data to remove
return 0
if __name__ == '__main__':
"""
CommandLine:
python -m ibeis.model.preproc.preproc_featweight
python -m ibeis.model.preproc.preproc_featweight --allexamples
python -m ibeis.model.preproc.preproc_featweight --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()