コード例 #1
0
ファイル: match_chips2.py プロジェクト: warunanc/hotspotter
def assign_matches_vsmany(args, qcx, cx2_kpts, cx2_desc, cx2_rchip_size):
    '''Matches cx2_desc[qcx] vs all database descriptors using 
    Input:
        qcx        - query chip index
        cx2_desc    - chip descriptor lookup table
        args - class with FLANN index of database descriptors
    Output: 
        cx2_fm - C x Mx2 array of matching feature indexes
        cx2_fs - C x Mx1 array of matching feature scores'''

    # args = hs.matcher.vsmany_args
    #helpers.println('Assigning vsmany feature matches from qcx=%d to %d chips'\ % (qcx, len(cx2_desc)))
    isQueryIndexed = True
    k_vsmany     = args.K + isQueryIndexed
    ax2_cx       = args.ax2_cx
    ax2_fx       = args.ax2_fx
    ax2_desc     = args.ax2_desc
    # Find each query descriptor's k+1 nearest neighbors
    nn_args = (args, qcx, cx2_kpts, cx2_desc, cx2_rchip_size, k_vsmany+1)
    nn_result = vsmany_nearest_neighbors(*nn_args)
    (qfx2_ax, qfx2_dists, qfx2_valid) = nn_result
    score_fn = scoring_func_map[params.__VSMANY_SCORE_FN__]
    qfx2_valid = qfx2_valid[:, 0:k_vsmany]
    vote_dists = qfx2_dists[:, 0:k_vsmany]
    norm_dists = qfx2_dists[:, k_vsmany] # k+1th descriptor for normalization
    # Score the feature matches
    qfx2_score = np.array([score_fn(_vdist.T, norm_dists)
                           for _vdist in vote_dists.T]).T
    # Vote using the inverted file 
    qfx2_cx = ax2_cx[qfx2_ax[:, 0:k_vsmany]]
    qfx2_fx = ax2_fx[qfx2_ax[:, 0:k_vsmany]]
    # Build feature matches
    cx2_fm = [[] for _ in xrange(len(cx2_desc))]
    cx2_fs = [[] for _ in xrange(len(cx2_desc))]
    nQuery = len(qfx2_ax)
    qfx2_qfx = helpers.tiled_range(nQuery, k_vsmany)
    #iter_matches = izip(qfx2_qfx.flat, qfx2_cx.flat, qfx2_fx.flat, qfx2_score.flat)
    iter_matches = izip(qfx2_qfx[qfx2_valid],
                        qfx2_cx[qfx2_valid],
                        qfx2_fx[qfx2_valid],
                        qfx2_score[qfx2_valid])
    for qfx, cx, fx, score in iter_matches:
        if qcx == cx: 
            continue # dont vote for yourself
        cx2_fm[cx].append((qfx, fx))
        cx2_fs[cx].append(score)
    # Convert to numpy
    for cx in xrange(len(cx2_desc)):
        fm = np.array(cx2_fm[cx], dtype=FM_DTYPE)
        fm = fm.reshape(len(fm), 2)
        cx2_fm[cx] = fm
    for cx in xrange(len(cx2_desc)): 
        fs = np.array(cx2_fs[cx], dtype=FS_DTYPE)
        #fs.shape = (len(fs), 1)
        cx2_fs[cx] = fs
    cx2_fm = np.array(cx2_fm)
    cx2_fs = np.array(cx2_fs)
    cx2_score = np.array([np.sum(fs) for fs in cx2_fs])
    return cx2_fm, cx2_fs, cx2_score
コード例 #2
0
# Find query's Nearest Neighbors in data
data_flann = quick_flann_index(data)
(qfx2_dx, qfx2_dists) = data_flann.nn_index(query, K, checks=checks)
qx2_nn = data[qfx2_dx]
# get k-reciprocal nearest neighbors max distance
qx2_nn.shape = (nQuery * K, dim)
(nn2_dx, nn2_dists) = data_flann.nn_index(qx2_nn, K, checks=checks)
nn2_data = data[nn2_dx]  # data's nearest neighbors
nn2_dists.shape = (nQuery, K, K)
qx2_nn.shape = (nQuery, K, dim)
qfx2_maxdist = nn2_dists.max(2)
# A neighbor is a K reciprocal if you are within the
# max distance of the assigned points K nearest neighbors
isReciprocal = qfx2_dists < qfx2_maxdist
krx2_nn = qx2_nn[isReciprocal]
krx2_qfx = helpers.tiled_range(nQuery, K)[isReciprocal]
krx2_query = query[krx2_qfx]

# Enforce viewable dimensionality
if dim != tdim:
    import sklearn.decomposition
    print('Plotting pca.transform dimensionality')
    pca = sklearn.decomposition.PCA(copy=True, n_components=tdim, whiten=False)
    pca.fit(data)
    query_ = pca.transform(query)
    data_ = pca.transform(data)
    nn2_data_ = pca.transform(nn2_data)
    qx2_nn_ = pca.transform(qx2_nn)
    krx2_query_ = pca.transform(krx2_query)
    krx2_nn_ = pca.transform(krx2_nn)
else:
コード例 #3
0
# Find query's Nearest Neighbors in data
data_flann = quick_flann_index(data)
(qfx2_dx, qfx2_dists) = data_flann.nn_index(query, K, checks=checks)
qx2_nn = data[qfx2_dx]
# get k-reciprocal nearest neighbors max distance
qx2_nn.shape = (nQuery*K, dim)
(nn2_dx, nn2_dists) = data_flann.nn_index(qx2_nn, K, checks=checks)
nn2_data = data[nn2_dx] # data's nearest neighbors
nn2_dists.shape = (nQuery, K, K)
qx2_nn.shape = (nQuery, K, dim)
qfx2_maxdist = nn2_dists.max(2)
# A neighbor is a K reciprocal if you are within the 
# max distance of the assigned points K nearest neighbors
isReciprocal = qfx2_dists < qfx2_maxdist
krx2_nn  = qx2_nn[isReciprocal]
krx2_qfx = helpers.tiled_range(nQuery, K)[isReciprocal] 
krx2_query = query[krx2_qfx]


# Enforce viewable dimensionality
if dim != tdim:
    import sklearn.decomposition
    print('Plotting pca.transform dimensionality')
    pca = sklearn.decomposition.PCA(copy=True, n_components=tdim, whiten=False)
    pca.fit(data)
    query_  = pca.transform(query)
    data_   = pca.transform(data)
    nn2_data_ = pca.transform(nn2_data)
    qx2_nn_ = pca.transform(qx2_nn)
    krx2_query_ = pca.transform(krx2_query)
    krx2_nn_ = pca.transform(krx2_nn)