Example #1
0
    def get_cfgstr(nnindexer, noquery=False):
        r""" returns string which uniquely identified configuration and support data

        Args:
            noquery (bool): if True cfgstr is only relevant to building the
                index. No search params are returned (default = False)

        Returns:
            str: flann_cfgstr

        CommandLine:
            python -m ibeis.algo.hots.neighbor_index --test-get_cfgstr

        Example:
            >>> # DISABLE_DOCTEST
            >>> from ibeis.algo.hots.neighbor_index import *  # NOQA
            >>> import ibeis
            >>> cfgdict = dict(fg_on=False)
            >>> qreq_ = ibeis.testdata_qreq_(defaultdb='testdb1', p='default:fg_on=False')
            >>> qreq_.load_indexer()
            >>> nnindexer = qreq_.indexer
            >>> noquery = True
            >>> flann_cfgstr = nnindexer.get_cfgstr(noquery)
            >>> result = ('flann_cfgstr = %s' % (str(flann_cfgstr),))
            >>> print(result)
            flann_cfgstr = _FLANN((algo=kdtree,seed=42,t=8,))_VECS((11260,128)gj5nea@ni0%f3aja)
        """
        flann_cfgstr_list = []
        use_params_hash = True
        use_data_hash = True
        if use_params_hash:
            flann_defaults = vt.get_flann_params(
                nnindexer.flann_params['algorithm'])
            #flann_params_clean = flann_defaults.copy()
            flann_params_clean = ut.sort_dict(flann_defaults)
            ut.updateif_haskey(flann_params_clean, nnindexer.flann_params)
            if noquery:
                ut.delete_dict_keys(flann_params_clean, ['checks'])
            shortnames = dict(algorithm='algo',
                              checks='chks',
                              random_seed='seed',
                              trees='t')
            short_params = ut.odict([
                (shortnames.get(key, key), str(val)[0:7])
                for key, val in six.iteritems(flann_params_clean)
            ])
            flann_valsig_ = ut.dict_str(short_params,
                                        nl=False,
                                        explicit=True,
                                        strvals=True)
            flann_valsig_ = flann_valsig_.lstrip('dict').replace(' ', '')
            #flann_valsig_ = str(list(flann_params.values()))
            #flann_valsig = ut.remove_chars(flann_valsig_, ', \'[]')
            flann_cfgstr_list.append('_FLANN(' + flann_valsig_ + ')')
        if use_data_hash:
            vecs_hashstr = ut.hashstr_arr(nnindexer.idx2_vec, '_VECS')
            flann_cfgstr_list.append(vecs_hashstr)
        flann_cfgstr = ''.join(flann_cfgstr_list)
        return flann_cfgstr
Example #2
0
    def get_cfgstr(nnindexer, noquery=False):
        r""" returns string which uniquely identified configuration and support data

        Args:
            noquery (bool): if True cfgstr is only relevant to building the
                index. No search params are returned (default = False)

        Returns:
            str: flann_cfgstr

        CommandLine:
            python -m ibeis.algo.hots.neighbor_index --test-get_cfgstr

        Example:
            >>> # DISABLE_DOCTEST
            >>> from ibeis.algo.hots.neighbor_index import *  # NOQA
            >>> import ibeis
            >>> cfgdict = dict(fg_on=False)
            >>> qreq_ = ibeis.testdata_qreq_(defaultdb='testdb1', p='default:fg_on=False')
            >>> qreq_.load_indexer()
            >>> nnindexer = qreq_.indexer
            >>> noquery = True
            >>> flann_cfgstr = nnindexer.get_cfgstr(noquery)
            >>> result = ('flann_cfgstr = %s' % (str(flann_cfgstr),))
            >>> print(result)
            flann_cfgstr = _FLANN((algo=kdtree,seed=42,t=8,))_VECS((11260,128)gj5nea@ni0%f3aja)
        """
        flann_cfgstr_list = []
        use_params_hash = True
        use_data_hash = True
        if use_params_hash:
            flann_defaults = vt.get_flann_params(nnindexer.flann_params['algorithm'])
            #flann_params_clean = flann_defaults.copy()
            flann_params_clean = ut.sort_dict(flann_defaults)
            ut.updateif_haskey(flann_params_clean, nnindexer.flann_params)
            if noquery:
                ut.delete_dict_keys(flann_params_clean, ['checks'])
            shortnames = dict(algorithm='algo', checks='chks', random_seed='seed', trees='t')
            short_params = ut.odict([(shortnames.get(key, key), str(val)[0:7])
                                     for key, val in six.iteritems(flann_params_clean)])
            flann_valsig_ = ut.dict_str(
                short_params, nl=False, explicit=True, strvals=True)
            flann_valsig_ = flann_valsig_.lstrip('dict').replace(' ', '')
            #flann_valsig_ = str(list(flann_params.values()))
            #flann_valsig = ut.remove_chars(flann_valsig_, ', \'[]')
            flann_cfgstr_list.append('_FLANN(' + flann_valsig_ + ')')
        if use_data_hash:
            vecs_hashstr = ut.hashstr_arr(nnindexer.idx2_vec, '_VECS')
            flann_cfgstr_list.append(vecs_hashstr)
        flann_cfgstr = ''.join(flann_cfgstr_list)
        return flann_cfgstr
Example #3
0
 def __init__(self, ibs, qaid2_qres, **kwargs):
     # Initialize variables. No logic
     self.fnum               = None
     self.nPerPage           = None
     self.ranks_lt           = None
     self.on_change_callback = None
     self.ibs = None
     self.nCands = 0  # number of candidate matches
     self.qaid2_qres = {}
     self.cand_match_list = []
     self.start_index = 0
     self.current_pagenum = -1
     self.current_match_aids = None
     self.current_qres       = None
     self.scope = []  # for keeping those widgets alive!
     self.nPages = 0
     self.stop_index  = -1
     self.interactkw = {
         'draw_fmatches': False,
         'draw_ell': True,
         'draw_rect': True,
         'draw_lines': True,
         'in_image': False,
         'draw_lbl': True,
         'show_timedelta': False,
     }
     self.toggleable_kws = odict([
         ('TOG: fmatch', 'draw_fmatches'),
         ('TOG: in_image', 'in_image'),
         ('TOG: timedelta', 'show_timedelta'),
         ('TOG: lbl', 'draw_lbl'),
     ])
     # Initialize Logic
     # main data
     self.ibs = ibs
     self.qaid2_qres = qaid2_qres
     # update keyword args
     params = default_interact_qres_params()
     ut.updateif_haskey(params, kwargs)
     self.__dict__.update(**params)
     # initialize matches
     self.init_candidates(qaid2_qres)
     # show first page
     self.show_page(0)
Example #4
0
 def __init__(self, ibs, qaid2_qres, **kwargs):
     # Initialize variables. No logic
     self.fnum = None
     self.nPerPage = None
     self.ranks_lt = None
     self.on_change_callback = None
     self.ibs = None
     self.nCands = 0  # number of candidate matches
     self.qaid2_qres = {}
     self.cand_match_list = []
     self.start_index = 0
     self.current_pagenum = -1
     self.current_match_aids = None
     self.current_qres = None
     self.scope = []  # for keeping those widgets alive!
     self.nPages = 0
     self.stop_index = -1
     self.interactkw = {
         'draw_fmatches': False,
         'draw_ell': True,
         'draw_rect': True,
         'draw_lines': True,
         'in_image': False,
         'draw_lbl': True,
         'show_timedelta': False,
     }
     self.toggleable_kws = odict([
         ('TOG: fmatch', 'draw_fmatches'),
         ('TOG: in_image', 'in_image'),
         ('TOG: timedelta', 'show_timedelta'),
         ('TOG: lbl', 'draw_lbl'),
     ])
     # Initialize Logic
     # main data
     self.ibs = ibs
     self.qaid2_qres = qaid2_qres
     # update keyword args
     params = default_interact_qres_params()
     ut.updateif_haskey(params, kwargs)
     self.__dict__.update(**params)
     # initialize matches
     self.init_candidates(qaid2_qres)
     # show first page
     self.show_page(0)
Example #5
0
def testdata_ratio_matches(fname1='easy1.png', fname2='easy2.png', **kwargs):
    r"""
    Runs simple ratio-test matching between two images.
    Technically this is not dummy data.

    Args:
        fname1 (str):
        fname2 (str):

    Returns:
        tuple : matches_testtup

    CommandLine:
        python -m vtool.tests.dummy --test-testdata_ratio_matches
        python -m vtool.tests.dummy --test-testdata_ratio_matches --help
        python -m vtool.tests.dummy --test-testdata_ratio_matches --show
        python -m vtool.tests.dummy --test-testdata_ratio_matches --show --ratio_thresh=1.1 --rotation_invariance

        python -m vtool.tests.dummy --test-testdata_ratio_matches --show --ratio_thresh=.625 --rotation_invariance --fname1 easy1.png --fname2 easy3.png
        python -m vtool.tests.dummy --test-testdata_ratio_matches --show --ratio_thresh=.625 --no-rotation_invariance --fname1 easy1.png --fname2 easy3.png

    Example:
        >>> # ENABLE_DOCTEST
        >>> from vtool.tests.dummy import *  # NOQA
        >>> import vtool as vt
        >>> # build test data
        >>> fname1 = ut.get_argval('--fname1', type_=str, default='easy1.png')
        >>> fname2 = ut.get_argval('--fname2', type_=str, default='easy2.png')
        >>> # execute function
        >>> default_dict = vt.get_extract_features_default_params()
        >>> default_dict['ratio_thresh'] = .625
        >>> kwargs = ut.argparse_dict(default_dict)
        >>> matches_testtup = testdata_ratio_matches(fname1, fname2, **kwargs)
        >>> (kpts1, kpts2, fm_RAT, fs_RAT, rchip1, rchip2) = matches_testtup
        >>> if ut.show_was_requested():
        >>>     import plottool as pt
        >>>     pt.show_chipmatch2(rchip1, rchip2, kpts1, kpts2, fm_RAT, fs_RAT, ori=True)
        >>>     num_matches = len(fm_RAT)
        >>>     score_sum = sum(fs_RAT)
        >>>     title = 'Simple matches using the Lowe\'s ratio test'
        >>>     title += '\n num_matches=%r, score_sum=%.2f' % (num_matches, score_sum)
        >>>     pt.set_figtitle(title)
        >>>     pt.show_if_requested()
    """
    import utool as ut
    import vtool as vt
    from vtool import image as gtool
    from vtool import features as feattool
    import pyflann
    # Get params
    ratio_thresh = kwargs.get('ratio_thresh', .625)
    print('ratio_thresh=%r' % (ratio_thresh, ))
    featkw = vt.get_extract_features_default_params()
    ut.updateif_haskey(featkw, kwargs)
    # Read Images
    fpath1 = ut.grab_test_imgpath(fname1)
    fpath2 = ut.grab_test_imgpath(fname2)
    # Extract Features
    kpts1, vecs1 = feattool.extract_features(fpath1, **featkw)
    kpts2, vecs2 = feattool.extract_features(fpath2, **featkw)
    rchip1 = gtool.imread(fpath1)
    rchip2 = gtool.imread(fpath2)

    # Run Algorithm
    def assign_nearest_neighbors(vecs1, vecs2, K=2):
        checks = 800
        flann_params = {'algorithm': 'kdtree', 'trees': 8}
        #pseudo_max_dist_sqrd = (np.sqrt(2) * 512) ** 2
        pseudo_max_dist_sqrd = 2 * (512**2)
        flann = vt.flann_cache(vecs1, flann_params=flann_params)
        try:
            fx2_to_fx1, _fx2_to_dist = flann.nn_index(vecs2,
                                                      num_neighbors=K,
                                                      checks=checks)
        except pyflann.FLANNException:
            print('vecs1.shape = %r' % (vecs1.shape, ))
            print('vecs2.shape = %r' % (vecs2.shape, ))
            print('vecs1.dtype = %r' % (vecs1.dtype, ))
            print('vecs2.dtype = %r' % (vecs2.dtype, ))
            raise
        fx2_to_dist = np.divide(_fx2_to_dist, pseudo_max_dist_sqrd)
        return fx2_to_fx1, fx2_to_dist

    def ratio_test(fx2_to_fx1, fx2_to_dist, ratio_thresh):
        fx2_to_ratio = np.divide(fx2_to_dist.T[0], fx2_to_dist.T[1])
        fx2_to_isvalid = fx2_to_ratio < ratio_thresh
        fx2_m = np.where(fx2_to_isvalid)[0]
        fx1_m = fx2_to_fx1.T[0].take(fx2_m)
        fs_RAT = np.subtract(1.0, fx2_to_ratio.take(fx2_m))
        fm_RAT = np.vstack((fx1_m, fx2_m)).T
        # return normalizer info as well
        fx1_m_normalizer = fx2_to_fx1.T[1].take(fx2_m)
        fm_norm_RAT = np.vstack((fx1_m_normalizer, fx2_m)).T
        return fm_RAT, fs_RAT, fm_norm_RAT

    # GET NEAREST NEIGHBORS
    fx2_to_fx1, fx2_to_dist = assign_nearest_neighbors(vecs1, vecs2, K=2)
    #fx2_m = np.arange(len(fx2_to_fx1))
    #fx1_m = fx2_to_fx1.T[0]
    #fm_ORIG = np.vstack((fx1_m, fx2_m)).T
    #fs_ORIG = fx2_to_dist.T[0]
    #fs_ORIG = 1 - np.divide(fx2_to_dist.T[0], fx2_to_dist.T[1])
    #np.ones(len(fm_ORIG))
    # APPLY RATIO TEST
    #ratio_thresh = .625
    fm_RAT, fs_RAT, fm_norm_RAT = ratio_test(fx2_to_fx1, fx2_to_dist,
                                             ratio_thresh)
    kpts1 = kpts1.astype(np.float64)
    kpts2 = kpts2.astype(np.float64)
    matches_testtup = (kpts1, kpts2, fm_RAT, fs_RAT, rchip1, rchip2)
    return matches_testtup
Example #6
0
def testdata_ratio_matches(fname1='easy1.png', fname2='easy2.png', **kwargs):
    r"""
    Runs simple ratio-test matching between two images.
    Technically this is not dummy data.

    Args:
        fname1 (str):
        fname2 (str):

    Returns:
        tuple : matches_testtup

    CommandLine:
        python -m vtool.tests.dummy --test-testdata_ratio_matches
        python -m vtool.tests.dummy --test-testdata_ratio_matches --help
        python -m vtool.tests.dummy --test-testdata_ratio_matches --show
        python -m vtool.tests.dummy --test-testdata_ratio_matches --show --ratio_thresh=1.1 --rotation_invariance

        python -m vtool.tests.dummy --test-testdata_ratio_matches --show --ratio_thresh=.625 --rotation_invariance --fname1 easy1.png --fname2 easy3.png
        python -m vtool.tests.dummy --test-testdata_ratio_matches --show --ratio_thresh=.625 --no-rotation_invariance --fname1 easy1.png --fname2 easy3.png

    Example:
        >>> # ENABLE_DOCTEST
        >>> from vtool.tests.dummy import *  # NOQA
        >>> import vtool as vt
        >>> # build test data
        >>> fname1 = ut.get_argval('--fname1', type_=str, default='easy1.png')
        >>> fname2 = ut.get_argval('--fname2', type_=str, default='easy2.png')
        >>> # execute function
        >>> default_dict = vt.get_extract_features_default_params()
        >>> default_dict['ratio_thresh'] = .625
        >>> kwargs = ut.argparse_dict(default_dict)
        >>> matches_testtup = testdata_ratio_matches(fname1, fname2, **kwargs)
        >>> (kpts1, kpts2, fm_RAT, fs_RAT, rchip1, rchip2) = matches_testtup
        >>> if ut.show_was_requested():
        >>>     import plottool as pt
        >>>     pt.show_chipmatch2(rchip1, rchip2, kpts1, kpts2, fm_RAT, fs_RAT, ori=True)
        >>>     num_matches = len(fm_RAT)
        >>>     score_sum = sum(fs_RAT)
        >>>     title = 'Simple matches using the Lowe\'s ratio test'
        >>>     title += '\n num_matches=%r, score_sum=%.2f' % (num_matches, score_sum)
        >>>     pt.set_figtitle(title)
        >>>     pt.show_if_requested()
    """
    import utool as ut
    import vtool as vt
    from vtool import image as gtool
    from vtool import features as feattool
    import pyflann
    # Get params
    ratio_thresh = kwargs.get('ratio_thresh', .625)
    print('ratio_thresh=%r' % (ratio_thresh,))
    featkw = vt.get_extract_features_default_params()
    ut.updateif_haskey(featkw, kwargs)
    # Read Images
    fpath1 = ut.grab_test_imgpath(fname1)
    fpath2 = ut.grab_test_imgpath(fname2)
    # Extract Features
    kpts1, vecs1 = feattool.extract_features(fpath1, **featkw)
    kpts2, vecs2 = feattool.extract_features(fpath2, **featkw)
    rchip1 = gtool.imread(fpath1)
    rchip2 = gtool.imread(fpath2)
    # Run Algorithm
    def assign_nearest_neighbors(vecs1, vecs2, K=2):
        checks = 800
        flann_params = {
            'algorithm': 'kdtree',
            'trees': 8
        }
        #pseudo_max_dist_sqrd = (np.sqrt(2) * 512) ** 2
        pseudo_max_dist_sqrd = 2 * (512 ** 2)
        flann = vt.flann_cache(vecs1, flann_params=flann_params)
        try:
            fx2_to_fx1, _fx2_to_dist = flann.nn_index(vecs2, num_neighbors=K, checks=checks)
        except pyflann.FLANNException:
            print('vecs1.shape = %r' % (vecs1.shape,))
            print('vecs2.shape = %r' % (vecs2.shape,))
            print('vecs1.dtype = %r' % (vecs1.dtype,))
            print('vecs2.dtype = %r' % (vecs2.dtype,))
            raise
        fx2_to_dist = np.divide(_fx2_to_dist, pseudo_max_dist_sqrd)
        return fx2_to_fx1, fx2_to_dist

    def ratio_test(fx2_to_fx1, fx2_to_dist, ratio_thresh):
        fx2_to_ratio = np.divide(fx2_to_dist.T[0], fx2_to_dist.T[1])
        fx2_to_isvalid = fx2_to_ratio < ratio_thresh
        fx2_m = np.where(fx2_to_isvalid)[0]
        fx1_m = fx2_to_fx1.T[0].take(fx2_m)
        fs_RAT = np.subtract(1.0, fx2_to_ratio.take(fx2_m))
        fm_RAT = np.vstack((fx1_m, fx2_m)).T
        # return normalizer info as well
        fx1_m_normalizer = fx2_to_fx1.T[1].take(fx2_m)
        fm_norm_RAT = np.vstack((fx1_m_normalizer, fx2_m)).T
        return fm_RAT, fs_RAT, fm_norm_RAT

    # GET NEAREST NEIGHBORS
    fx2_to_fx1, fx2_to_dist = assign_nearest_neighbors(vecs1, vecs2, K=2)
    #fx2_m = np.arange(len(fx2_to_fx1))
    #fx1_m = fx2_to_fx1.T[0]
    #fm_ORIG = np.vstack((fx1_m, fx2_m)).T
    #fs_ORIG = fx2_to_dist.T[0]
    #fs_ORIG = 1 - np.divide(fx2_to_dist.T[0], fx2_to_dist.T[1])
    #np.ones(len(fm_ORIG))
    # APPLY RATIO TEST
    #ratio_thresh = .625
    fm_RAT, fs_RAT, fm_norm_RAT = ratio_test(fx2_to_fx1, fx2_to_dist, ratio_thresh)
    kpts1 = kpts1.astype(np.float64)
    kpts2 = kpts2.astype(np.float64)
    matches_testtup = (kpts1, kpts2, fm_RAT, fs_RAT, rchip1, rchip2)
    return matches_testtup