最近实验要用到fisher vector,但是自己写不出来,网上关于python实现的也很少,不过老天不负有心人,怎么说python强大呢,本渣渣找到了一个大佬写的第三方库fishervector,安装完成之后直接调用函数就OK啦!安装方式也很简单,就是直接pip就可以了,具体的可以看这个大佬的github!
# -*- coding: utf-8 -*- """ Created on Mon Jan 7 14:05:59 2019 @author: 13260 """ from fishervector import FisherVectorGMM import numpy as np """ 功能:保存特征文件 输入:path 保存路径 feature 待保存的特征文件 输出:无 """ def save_file(data,path): np.save(path,data) print("[INFO] File have been saved !") """ 功能:加载文件 输入:文件路径 输出:加载的文件 """ def load_file(f_path,l_path): features = np.load(f_path) labels = np.load(l_path) print("[INFO] Feature and label file have been loaded !") return features,labels """ 功能:对图像特征进行FV编码 输入:提取的卷积特征集合 输出:编码之后的fisher vector 形式:(num,2*k,d) """ def fisher_vector(feature,path,num,train_rate): features = np.load(feature) length = features.shape[0] max_num = length*train_rate train_data = features[:max_num] test_data = features[max_num:] fv_gmm = FisherVectorGMM(n_kernels=num).fit(train_data) print("[INFO] GMM training is completed !") fisher_v = fv_gmm.predict(test_data) print("[INFO] Fisher vector is completed !") return fisher_v """ 功能:将获得的fisher vector进行展开 输入:待展开的向量,形式(num,row,dimen) 输出:展开后的向量,形式(num,row*) """ def fv_flatten(feature): length = feature.shape[0] flatten_fv = [] for i in range(length): tmp = feature[i].flatten() flatten_fv.append(tmp) flatten_fv = np.array(flatten_fv) print("[INFO] Feature flatten is completed !") return flatten_fv if __name__ == "__main__": path = "F:/python/features/DenseNet/densenet_fv.npy" feature = np.load(path) f = fv_flatten(feature) s_path = "F:/python/features/DenseNet/densenet_fv_flatten.npy" save_file(f,s_path)