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
# 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:
# 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)