python实现fisher vector编码

最近实验要用到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)

   
发布了50 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_31207499/article/details/88636194