def reduce_cluster(D, num_clusters, params=config.default_config()): print('Clustering:') D = ascontiguousarray(D.astype('float32')) centroids, qerr, dis, labels, nassign = ynumpy.kmeans(D, num_clusters, init='kmeans++', nt=params['num_threads'], output='all', redo=3, niter=params['kmeans_max_iter'], verbose=False) #kmeans = KMeans(n_init=1, n_clusters=params['num_clusters'], n_jobs=2, max_iter=params['kmeans_max_iter']) #kmeans.fit(D) print('Done.') #centroids = kmeans.cluster_centers_ #labels = kmeans.labels_ return centroids, labels
def train_bovw_codebooks(tracklets_path, videonames, traintest_parts, feat_types, intermediates_path, pca_reduction=False, nt=1, verbose=False): try: makedirs(intermediates_path) except OSError: pass for k, part in enumerate(traintest_parts): train_inds = np.where(part <= 0)[0] # train codebook for each possible training parition total = len(train_inds) num_samples_per_vid = int(INTERNAL_PARAMETERS['n_samples'] / float(total)) # process the videos for i, feat_t in enumerate(feat_types): output_filepath = join(intermediates_path, 'bovw' + ('-' if pca_reduction else '-nopca-') + feat_t + '-' + str(k) + '.pkl') if isfile(output_filepath): if verbose: print('[train_bovw_codebooks] %s -> OK' % output_filepath) continue start_time = time.time() D = load_tracklets_sample(tracklets_path, videonames, train_inds, feat_t, num_samples_per_vid, verbose=verbose) # (special case) trajectory features are originally positions if feat_t == 'trj': D = convert_positions_to_displacements(D) if feat_t == 'mbh': Dx = preprocessing.normalize(D[:,:D.shape[1]/2], norm='l1', axis=1) Dy = preprocessing.normalize(D[:,D.shape[1]/2:], norm='l1', axis=1) D = np.hstack((Dx,Dy)) else: D = preprocessing.normalize(D, norm='l1', axis=1) if feat_t != 'trj': D = rootSIFT(D) # compute PCA map and reduce dimensionality if pca_reduction: pca = PCA(n_components=int(INTERNAL_PARAMETERS['reduction_factor']*D.shape[1]), copy=False) D = pca.fit_transform(D) # train codebook for later BOVW computation D = np.ascontiguousarray(D, dtype=np.float32) cb = ynumpy.kmeans(D, INTERNAL_PARAMETERS['bovw_codebook_k'], \ distance_type=2, nt=nt, niter=100, seed=0, redo=1, \ verbose=verbose, normalize=False, init='kmeans++') with open(output_filepath, 'wb') as f: cPickle.dump(dict(pca=(pca if pca_reduction else None), codebook=cb), f) elapsed_time = time.time() - start_time if verbose: print('[train_bovw_codebooks] %s -> DONE (in %.2f secs)' % (feat_t, elapsed_time))
def learnCodebooksPQ(learnFilename, dim, M, K, pointsCount, codebooksFilename, \ threadsCount=32, iterCount=30): if dim % M != 0: raise Exception('Dim is not a multiple of M!') else: vocabDim = dim / M codebooks = np.zeros((M, K, vocabDim), dtype='float32') points = readXvecs(learnFilename, dim, pointsCount) for m in xrange(M): subpoints = points[:,m*vocabDim:(m+1)*vocabDim].copy() (codebook, qerr, dis, assign, nassign) = ynumpy.kmeans(subpoints, K, nt=threadsCount, \ niter=iterCount, output='all') codebooks[m,:,:] = codebook codebooksFile = open(codebooksFilename, 'wb') pickle.dump((codebooks), codebooksFile) codebooksFile.close()
def learnCodebooksPQ(learnFilename, dim, M, K, pointsCount, codebooksFilename, \ threadsCount=32, iterCount=30): if dim % M != 0: raise Exception('Dim is not a multiple of M!') else: vocabDim = dim / M codebooks = np.zeros((M, K, vocabDim), dtype='float32') points = readXvecs(learnFilename, dim, pointsCount) for m in xrange(M): subpoints = points[:, m * vocabDim:(m + 1) * vocabDim].copy() (codebook, qerr, dis, assign, nassign) = ynumpy.kmeans(subpoints, K, nt=threadsCount, \ niter=iterCount, output='all') codebooks[m, :, :] = codebook codebooksFile = open(codebooksFilename, 'wb') pickle.dump((codebooks), codebooksFile) codebooksFile.close()
def reduce_multi_cluster(D, num_clusters, params=config.default_config()): print('Clustering:') D = ascontiguousarray(D.astype('float32')) #ncc = maximum(minimum(random.poisson(num_clusters, 15), 1000), 15) N = D.shape[0] #ncc = array([20, 50, 100, 250, 500, 1000, 2000, 4000, 6000]) ncc = array([25 * (2 ** p) for p in xrange(int(log2(N / 75)) )]) print(ncc) centroids = zeros((sum(ncc), D.shape[1])) labels = zeros((N, len(ncc)), dtype='int32') c = 0 for it, nc in enumerate(ncc): new_centroids, _, _, new_labels, _ = ynumpy.kmeans(D.astype('float32'), nc, init='random', nt=params['num_threads'], output='all', redo=1, niter=params['kmeans_max_iter'], verbose=False) centroids[c:c+nc, :] = new_centroids labels[:, it] = new_labels.squeeze() + c c += nc print('Done.') return centroids, labels
def run_asmk_script(): with ut.embed_on_exception_context: # NOQA """ >>> from wbia.algo.smk.script_smk import * """ # NOQA # ============================================== # PREPROCESSING CONFIGURATION # ============================================== config = { # 'data_year': 2013, 'data_year': None, 'dtype': 'float32', # 'root_sift': True, 'root_sift': False, # 'centering': True, 'centering': False, 'num_words': 2**16, # 'num_words': 1E6 # 'num_words': 8000, 'kmeans_impl': 'sklearn.mini', 'extern_words': False, 'extern_assign': False, 'assign_algo': 'kdtree', 'checks': 1024, 'int_rvec': True, 'only_xy': False, } # Define which params are relevant for which operations relevance = {} relevance['feats'] = ['dtype', 'root_sift', 'centering', 'data_year'] relevance['words'] = relevance['feats'] + [ 'num_words', 'extern_words', 'kmeans_impl', ] relevance['assign'] = relevance['words'] + [ 'checks', 'extern_assign', 'assign_algo', ] # relevance['ydata'] = relevance['assign'] + ['int_rvec'] # relevance['xdata'] = relevance['assign'] + ['only_xy', 'int_rvec'] nAssign = 1 class SMKCacher(ut.Cacher): def __init__(self, fname, ext='.cPkl'): relevant_params = relevance[fname] relevant_cfg = ut.dict_subset(config, relevant_params) cfgstr = ut.get_cfg_lbl(relevant_cfg) dbdir = ut.truepath('/raid/work/Oxford/') super(SMKCacher, self).__init__(fname, cfgstr, cache_dir=dbdir, ext=ext) # ============================================== # LOAD DATASET, EXTRACT AND POSTPROCESS FEATURES # ============================================== if config['data_year'] == 2007: data = load_oxford_2007() elif config['data_year'] == 2013: data = load_oxford_2013() elif config['data_year'] is None: data = load_oxford_wbia() offset_list = data['offset_list'] all_kpts = data['all_kpts'] raw_vecs = data['all_vecs'] query_uri_order = data['query_uri_order'] data_uri_order = data['data_uri_order'] # del data # ================ # PRE-PROCESS # ================ import vtool as vt # Alias names to avoid errors in interactive sessions proc_vecs = raw_vecs del raw_vecs feats_cacher = SMKCacher('feats', ext='.npy') all_vecs = feats_cacher.tryload() if all_vecs is None: if config['dtype'] == 'float32': logger.info('Converting vecs to float32') proc_vecs = proc_vecs.astype(np.float32) else: proc_vecs = proc_vecs raise NotImplementedError('other dtype') if config['root_sift']: with ut.Timer('Apply root sift'): np.sqrt(proc_vecs, out=proc_vecs) vt.normalize(proc_vecs, ord=2, axis=1, out=proc_vecs) if config['centering']: with ut.Timer('Apply centering'): mean_vec = np.mean(proc_vecs, axis=0) # Center and then re-normalize np.subtract(proc_vecs, mean_vec[None, :], out=proc_vecs) vt.normalize(proc_vecs, ord=2, axis=1, out=proc_vecs) if config['dtype'] == 'int8': smk_funcs all_vecs = proc_vecs feats_cacher.save(all_vecs) del proc_vecs # ===================================== # BUILD VISUAL VOCABULARY # ===================================== if config['extern_words']: words = data['words'] assert config['num_words'] is None or len( words) == config['num_words'] else: word_cacher = SMKCacher('words') words = word_cacher.tryload() if words is None: with ut.embed_on_exception_context: if config['kmeans_impl'] == 'sklearn.mini': import sklearn.cluster rng = np.random.RandomState(13421421) # init_size = int(config['num_words'] * 8) init_size = int(config['num_words'] * 4) # converged after 26043 iterations clusterer = sklearn.cluster.MiniBatchKMeans( config['num_words'], init_size=init_size, batch_size=1000, compute_labels=False, max_iter=20, random_state=rng, n_init=1, verbose=1, ) clusterer.fit(all_vecs) words = clusterer.cluster_centers_ elif config['kmeans_impl'] == 'yael': from yael import ynumpy centroids, qerr, dis, assign, nassign = ynumpy.kmeans( all_vecs, config['num_words'], init='kmeans++', verbose=True, output='all', ) words = centroids word_cacher.save(words) # ===================================== # ASSIGN EACH VECTOR TO ITS NEAREST WORD # ===================================== if config['extern_assign']: assert config[ 'extern_words'], 'need extern cluster to extern assign' idx_to_wxs = vt.atleast_nd(data['idx_to_wx'], 2) idx_to_maws = np.ones(idx_to_wxs.shape, dtype=np.float32) idx_to_wxs = np.ma.array(idx_to_wxs) idx_to_maws = np.ma.array(idx_to_maws) else: from wbia.algo.smk import vocab_indexer vocab = vocab_indexer.VisualVocab(words) dassign_cacher = SMKCacher('assign') assign_tup = dassign_cacher.tryload() if assign_tup is None: vocab.flann_params['algorithm'] = config['assign_algo'] vocab.build() # Takes 12 minutes to assign jegous vecs to 2**16 vocab with ut.Timer('assign vocab neighbors'): _idx_to_wx, _idx_to_wdist = vocab.nn_index( all_vecs, nAssign, checks=config['checks']) if nAssign > 1: idx_to_wxs, idx_to_maws = smk_funcs.weight_multi_assigns( _idx_to_wx, _idx_to_wdist, massign_alpha=1.2, massign_sigma=80.0, massign_equal_weights=True, ) else: idx_to_wxs = np.ma.masked_array(_idx_to_wx, fill_value=-1) idx_to_maws = np.ma.ones(idx_to_wxs.shape, fill_value=-1, dtype=np.float32) idx_to_maws.mask = idx_to_wxs.mask assign_tup = (idx_to_wxs, idx_to_maws) dassign_cacher.save(assign_tup) idx_to_wxs, idx_to_maws = assign_tup # Breakup vectors, keypoints, and word assignments by annotation wx_lists = [ idx_to_wxs[left:right] for left, right in ut.itertwo(offset_list) ] maw_lists = [ idx_to_maws[left:right] for left, right in ut.itertwo(offset_list) ] vecs_list = [ all_vecs[left:right] for left, right in ut.itertwo(offset_list) ] kpts_list = [ all_kpts[left:right] for left, right in ut.itertwo(offset_list) ] # ======================= # FIND QUERY SUBREGIONS # ======================= ibs, query_annots, data_annots, qx_to_dx = load_ordered_annots( data_uri_order, query_uri_order) daids = data_annots.aids qaids = query_annots.aids query_super_kpts = ut.take(kpts_list, qx_to_dx) query_super_vecs = ut.take(vecs_list, qx_to_dx) query_super_wxs = ut.take(wx_lists, qx_to_dx) query_super_maws = ut.take(maw_lists, qx_to_dx) # Mark which keypoints are within the bbox of the query query_flags_list = [] only_xy = config['only_xy'] for kpts_, bbox in zip(query_super_kpts, query_annots.bboxes): flags = kpts_inside_bbox(kpts_, bbox, only_xy=only_xy) query_flags_list.append(flags) logger.info('Queries are crops of existing database images.') logger.info('Looking at average percents') percent_list = [ flags_.sum() / flags_.shape[0] for flags_ in query_flags_list ] percent_stats = ut.get_stats(percent_list) logger.info('percent_stats = %s' % (ut.repr4(percent_stats), )) import vtool as vt query_kpts = vt.zipcompress(query_super_kpts, query_flags_list, axis=0) query_vecs = vt.zipcompress(query_super_vecs, query_flags_list, axis=0) query_wxs = vt.zipcompress(query_super_wxs, query_flags_list, axis=0) query_maws = vt.zipcompress(query_super_maws, query_flags_list, axis=0) # ======================= # CONSTRUCT QUERY / DATABASE REPR # ======================= # int_rvec = not config['dtype'].startswith('float') int_rvec = config['int_rvec'] X_list = [] _prog = ut.ProgPartial(length=len(qaids), label='new X', bs=True, adjust=True) for aid, fx_to_wxs, fx_to_maws in _prog( zip(qaids, query_wxs, query_maws)): X = new_external_annot(aid, fx_to_wxs, fx_to_maws, int_rvec) X_list.append(X) # ydata_cacher = SMKCacher('ydata') # Y_list = ydata_cacher.tryload() # if Y_list is None: Y_list = [] _prog = ut.ProgPartial(length=len(daids), label='new Y', bs=True, adjust=True) for aid, fx_to_wxs, fx_to_maws in _prog(zip(daids, wx_lists, maw_lists)): Y = new_external_annot(aid, fx_to_wxs, fx_to_maws, int_rvec) Y_list.append(Y) # ydata_cacher.save(Y_list) # ====================== # Add in some groundtruth logger.info('Add in some groundtruth') for Y, nid in zip(Y_list, ibs.get_annot_nids(daids)): Y.nid = nid for X, nid in zip(X_list, ibs.get_annot_nids(qaids)): X.nid = nid for Y, qual in zip(Y_list, ibs.get_annot_quality_texts(daids)): Y.qual = qual # ====================== # Add in other properties for Y, vecs, kpts in zip(Y_list, vecs_list, kpts_list): Y.vecs = vecs Y.kpts = kpts imgdir = ut.truepath('/raid/work/Oxford/oxbuild_images') for Y, imgid in zip(Y_list, data_uri_order): gpath = ut.unixjoin(imgdir, imgid + '.jpg') Y.gpath = gpath for X, vecs, kpts in zip(X_list, query_vecs, query_kpts): X.kpts = kpts X.vecs = vecs # ====================== logger.info('Building inverted list') daids = [Y.aid for Y in Y_list] # wx_list = sorted(ut.list_union(*[Y.wx_list for Y in Y_list])) wx_list = sorted(set.union(*[Y.wx_set for Y in Y_list])) assert daids == data_annots.aids assert len(wx_list) <= config['num_words'] wx_to_aids = smk_funcs.invert_lists(daids, [Y.wx_list for Y in Y_list], all_wxs=wx_list) # Compute IDF weights logger.info('Compute IDF weights') ndocs_total = len(daids) # Use only the unique number of words ndocs_per_word = np.array([len(set(wx_to_aids[wx])) for wx in wx_list]) logger.info('ndocs_perword stats: ' + ut.repr4(ut.get_stats(ndocs_per_word))) idf_per_word = smk_funcs.inv_doc_freq(ndocs_total, ndocs_per_word) wx_to_weight = dict(zip(wx_list, idf_per_word)) logger.info('idf stats: ' + ut.repr4(ut.get_stats(wx_to_weight.values()))) # Filter junk Y_list_ = [Y for Y in Y_list if Y.qual != 'junk'] # ======================= # CHOOSE QUERY KERNEL # ======================= params = { 'asmk': dict(alpha=3.0, thresh=0.0), 'bow': dict(), 'bow2': dict(), } # method = 'bow' method = 'bow2' method = 'asmk' smk = SMK(wx_to_weight, method=method, **params[method]) # Specific info for the type of query if method == 'asmk': # Make residual vectors if True: # The stacked way is 50x faster # TODO: extend for multi-assignment and record fxs flat_query_vecs = np.vstack(query_vecs) flat_query_wxs = np.vstack(query_wxs) flat_query_offsets = np.array( [0] + ut.cumsum(ut.lmap(len, query_wxs))) flat_wxs_assign = flat_query_wxs flat_offsets = flat_query_offsets flat_vecs = flat_query_vecs tup = smk_funcs.compute_stacked_agg_rvecs( words, flat_wxs_assign, flat_vecs, flat_offsets) all_agg_vecs, all_error_flags, agg_offset_list = tup if int_rvec: all_agg_vecs = smk_funcs.cast_residual_integer( all_agg_vecs) agg_rvecs_list = [ all_agg_vecs[left:right] for left, right in ut.itertwo(agg_offset_list) ] agg_flags_list = [ all_error_flags[left:right] for left, right in ut.itertwo(agg_offset_list) ] for X, agg_rvecs, agg_flags in zip(X_list, agg_rvecs_list, agg_flags_list): X.agg_rvecs = agg_rvecs X.agg_flags = agg_flags[:, None] flat_wxs_assign = idx_to_wxs flat_offsets = offset_list flat_vecs = all_vecs tup = smk_funcs.compute_stacked_agg_rvecs( words, flat_wxs_assign, flat_vecs, flat_offsets) all_agg_vecs, all_error_flags, agg_offset_list = tup if int_rvec: all_agg_vecs = smk_funcs.cast_residual_integer( all_agg_vecs) agg_rvecs_list = [ all_agg_vecs[left:right] for left, right in ut.itertwo(agg_offset_list) ] agg_flags_list = [ all_error_flags[left:right] for left, right in ut.itertwo(agg_offset_list) ] for Y, agg_rvecs, agg_flags in zip(Y_list, agg_rvecs_list, agg_flags_list): Y.agg_rvecs = agg_rvecs Y.agg_flags = agg_flags[:, None] else: # This non-stacked way is about 500x slower _prog = ut.ProgPartial(label='agg Y rvecs', bs=True, adjust=True) for Y in _prog(Y_list_): make_agg_vecs(Y, words, Y.vecs) _prog = ut.ProgPartial(label='agg X rvecs', bs=True, adjust=True) for X in _prog(X_list): make_agg_vecs(X, words, X.vecs) elif method == 'bow2': # Hack for orig tf-idf bow vector nwords = len(words) for X in ut.ProgIter(X_list, label='make bow vector'): ensure_tf(X) bow_vector(X, wx_to_weight, nwords) for Y in ut.ProgIter(Y_list_, label='make bow vector'): ensure_tf(Y) bow_vector(Y, wx_to_weight, nwords) if method != 'bow2': for X in ut.ProgIter(X_list, 'compute X gamma'): X.gamma = smk.gamma(X) for Y in ut.ProgIter(Y_list_, 'compute Y gamma'): Y.gamma = smk.gamma(Y) # Execute matches (could go faster by enumerating candidates) scores_list = [] for X in ut.ProgIter(X_list, label='query %s' % (smk, )): scores = [smk.kernel(X, Y) for Y in Y_list_] scores = np.array(scores) scores = np.nan_to_num(scores) scores_list.append(scores) import sklearn.metrics avep_list = [] _iter = list(zip(scores_list, X_list)) _iter = ut.ProgIter(_iter, label='evaluate %s' % (smk, )) for scores, X in _iter: truth = [X.nid == Y.nid for Y in Y_list_] avep = sklearn.metrics.average_precision_score(truth, scores) avep_list.append(avep) avep_list = np.array(avep_list) mAP = np.mean(avep_list) logger.info('mAP = %r' % (mAP, ))
print "generating random data" v = numpy.random.normal(0, 1, size = (20, 4)).astype(numpy.float32) v[10:,:] += numpy.tile(numpy.random.uniform(-10, 10, size = (1, 4)), (10, 1)) else: print "vectors = " print v print "meta info = " print meta print "kmeans:" centroids = ynumpy.kmeans(v, 3) print "result centroids =" print centroids[:10,:] print "gmm:" gmm = ynumpy.gmm_learn(v, 3) (w, mu, sigma) = gmm print "mu = " print mu print "sigma = " print sigma
print e print "generating random data" v = numpy.random.normal(0, 1, size=(20, 4)).astype(numpy.float32) v[10:, :] += numpy.tile(numpy.random.uniform(-10, 10, size=(1, 4)), (10, 1)) else: print "vectors = " print v print "meta info = " print meta print "kmeans:" centroids = ynumpy.kmeans(v, 3) print "result centroids =" print centroids[:10, :] print "gmm:" gmm = ynumpy.gmm_learn(v, 3) (w, mu, sigma) = gmm print "mu = " print mu print "sigma = " print sigma
def train_bovw_codebooks(tracklets_path, videonames, traintest_parts, feat_types, intermediates_path, pca_reduction=False, nt=4): if not exists(intermediates_path): makedirs(intermediates_path) for k, part in enumerate(traintest_parts): train_inds = np.where(part <= 0)[0] # train codebook for each possible training parition total = len(train_inds) num_samples_per_vid = int(INTERNAL_PARAMETERS['n_samples'] / float(total)) # process the videos for i, feat_t in enumerate(feat_types): output_filepath = intermediates_path + 'bovw' + ('_pca-' if pca_reduction else '-') + feat_t + '-' + str(k) + '.pkl' if isfile(output_filepath): print('%s -> OK' % output_filepath) continue start_time = time.time() D = None # feat_t's sampled tracklets ptr = 0 for j in range(0, total): idx = train_inds[j] filepath = tracklets_path + feat_t + '/' + videonames[idx] + '.pkl' if not isfile(filepath): sys.stderr.write('# ERROR: missing training instance' ' {}\n'.format(filepath)) sys.stderr.flush() quit() with open(filepath, 'rb') as f: d = cPickle.load(f) # init sample if D is None: D = np.zeros((INTERNAL_PARAMETERS['n_samples'], d.shape[1]), dtype=np.float32) # create a random permutation for sampling some tracklets in this vids randp = np.random.permutation(d.shape[0]) if d.shape[0] > num_samples_per_vid: randp = randp[:num_samples_per_vid] D[ptr:ptr+len(randp),:] = d[randp,:] ptr += len(randp) D = D[:ptr,:] # cut out extra reserved space # (special case) trajectory features are originally positions if feat_t == 'trj': D = convert_positions_to_displacements(D) D = rootSIFT(preprocessing.normalize(D, norm='l1', axis=1)) # compute PCA map and reduce dimensionality if pca_reduction: pca = PCA(n_components=int(INTERNAL_PARAMETERS['reduction_factor']*D.shape[1]), copy=False) D = pca.fit_transform(D) # train codebook for later BOVW computation D = np.ascontiguousarray(D, dtype=np.float32) cb = ynumpy.kmeans(D, INTERNAL_PARAMETERS['bovw_codebook_k'], \ distance_type=2, nt=nt, niter=20, seed=0, redo=3, \ verbose=True, normalize=False, init='random') with open(output_filepath, 'wb') as f: cPickle.dump(dict(pca=(pca if pca_reduction else None), codebook=cb), f) elapsed_time = time.time() - start_time print('%s -> DONE (in %.2f secs)' % (feat_t, elapsed_time))
sample = sample - mean cov = np.dot(sample.T, sample) # compute PCA matrix and keep only 64 dimensions eigvals, eigvecs = np.linalg.eig(cov) perm = eigvals.argsort() # sort by increasing eigenvalue pca_transform = eigvecs[:, perm[64:128]] # eigenvectors for the 64 last eigenvalues # transform sample with PCA (note that numpy imposes line-vectors, # so we right-multiply the vectors) sample = np.dot(sample, pca_transform) # train Kmeans print "start train kmeans ......." print sample.shape[0] k = 128 # number of cluster to create d = sample.shape[1] # dimensionality of the vectors n = sample.shape[0] # number of vectors nt = 20 # number of threads to use niter = 0 # number of iterations (0 for convergence) redo = 1 # number of redo t0 = time.time() (centroids, qerr, dis, assign, nassign) = ynumpy.kmeans(v, k, nt = nt, niter = niter, redo = redo, output = 'full') t1 = time.time() print "kmeans performed in %.3f s" % (t1 - t0) np.save("centroids.data", centroids)
def train_bovw_codebooks(tracklets_path, videonames, traintest_parts, feat_types, intermediates_path, pca_reduction=False, nt=1, verbose=False): try: makedirs(intermediates_path) except OSError: pass for k, part in enumerate(traintest_parts): train_inds = np.where( part <= 0)[0] # train codebook for each possible training parition total = len(train_inds) num_samples_per_vid = int(INTERNAL_PARAMETERS['n_samples'] / float(total)) # process the videos for i, feat_t in enumerate(feat_types): output_filepath = join( intermediates_path, 'bovw' + ('-' if pca_reduction else '-nopca-') + feat_t + '-' + str(k) + '.pkl') if isfile(output_filepath): if verbose: print('[train_bovw_codebooks] %s -> OK' % output_filepath) continue start_time = time.time() D = load_tracklets_sample(tracklets_path, videonames, train_inds, feat_t, num_samples_per_vid, verbose=verbose) # (special case) trajectory features are originally positions if feat_t == 'trj': D = convert_positions_to_displacements(D) if feat_t == 'mbh': Dx = preprocessing.normalize(D[:, :D.shape[1] / 2], norm='l1', axis=1) Dy = preprocessing.normalize(D[:, D.shape[1] / 2:], norm='l1', axis=1) D = np.hstack((Dx, Dy)) else: D = preprocessing.normalize(D, norm='l1', axis=1) if feat_t != 'trj': D = rootSIFT(D) # compute PCA map and reduce dimensionality if pca_reduction: pca = PCA(n_components=int( INTERNAL_PARAMETERS['reduction_factor'] * D.shape[1]), copy=False) D = pca.fit_transform(D) # train codebook for later BOVW computation D = np.ascontiguousarray(D, dtype=np.float32) cb = ynumpy.kmeans(D, INTERNAL_PARAMETERS['bovw_codebook_k'], \ distance_type=2, nt=nt, niter=100, seed=0, redo=1, \ verbose=verbose, normalize=False, init='kmeans++') with open(output_filepath, 'wb') as f: cPickle.dump( dict(pca=(pca if pca_reduction else None), codebook=cb), f) elapsed_time = time.time() - start_time if verbose: print('[train_bovw_codebooks] %s -> DONE (in %.2f secs)' % (feat_t, elapsed_time))