Skip to main content

Fisher Vectors based on Gaussian Mixture Model with TensorFlow deep learning support

Project description

DeepFV - Fisher Vectors with Deep Learning

A TensorFlow-based implementation of Improved Fisher Vectors as described in [1]. This package provides a modern, scalable approach to computing Fisher Vectors using deep learning techniques. For a concise description of Fisher Vectors see [2].

Features

  • Full & Diagonal Covariance Support: Model complex elliptical clusters with full covariance matrices, or use diagonal covariance for faster training
  • Mini-batch Training: Scalable to large datasets with mini-batch gradient descent
  • BIC-based Model Selection: Automatically determine optimal number of GMM components
  • GPU Acceleration: Built on TensorFlow 2.x for fast training on GPUs
  • MiniBatchKMeans Initialization: Smart initialization using scikit-learn's MiniBatchKMeans
  • Save/Load Models: Persist trained models for reuse
  • Normalized Fisher Vectors: Implements improved Fisher Vector normalization

Installation

Install from PyPI:

pip install DeepFV

Or install from source:

git clone https://github.com/sidhomj/DeepFV.git
cd DeepFV
pip install -r requirements.txt
pip install -e .

Quick Start

1. Prepare your data

import numpy as np

# Example: SIFT image features
shape = [300, 20, 32]  # (n_images, n_features_per_image, feature_dim)
image_data = np.concatenate([
    np.random.normal(-np.ones(30), size=shape),
    np.random.normal(np.ones(30), size=shape)
], axis=0)

2. Train with mini-batch gradient descent

from DeepFV import FisherVectorDL

# Create model with FULL covariance support
fv_dl = FisherVectorDL(
    n_kernels=10,
    feature_dim=32,
    covariance_type='full'  # or 'diag' for diagonal covariance
)

# Fit with mini-batch training
fv_dl.fit_minibatch(
    image_data,
    epochs=100,
    batch_size=1024*6,
    learning_rate=0.001,
    verbose=True
)

3. BIC-based model selection

# Automatically select optimal number of components
fv_dl = FisherVectorDL(feature_dim=32, covariance_type='full')
fv_dl.fit_by_bic(
    image_data,
    choices_n_kernels=[2, 5, 10, 20],
    epochs=80,
    batch_size=1024,
    verbose=True
)

print(f"Selected {fv_dl.n_kernels} components")

4. Compute Fisher Vectors

# Compute normalized Fisher Vectors
image_data_test = image_data[:20]
fisher_vectors = fv_dl.predict_fisher_vector(image_data_test, normalized=True)

# Output shape: (n_images, 2*n_kernels, feature_dim)
print(f"Fisher vector shape: {fisher_vectors.shape}")

5. Save and load models

# Save trained model
fv_dl.save_model('my_model.pkl')

# Load model later
from DeepFV import FisherVectorDL
fv_dl_loaded = FisherVectorDL.load_model('my_model.pkl')

Why FisherVectorDL?

Advantages over traditional GMM implementations:

  1. Full Covariance Support: Model rotated/tilted elliptical clusters, not just axis-aligned ones
  2. Scalability: Mini-batch training handles datasets too large to fit in memory
  3. Speed: GPU acceleration via TensorFlow for faster training
  4. Flexibility: Customizable learning rate, batch size, and number of epochs
  5. Modern Stack: Built on TensorFlow 2.x with eager execution
  6. Smart Initialization: Uses MiniBatchKMeans for better starting parameters

Testing

Run the test script to see a 2D visualization:

python test_fishervector_dl.py

This will:

  • Generate 3 elliptical Gaussian clusters
  • Train a GMM with full covariance
  • Use BIC to select optimal number of components
  • Compute and visualize Fisher Vectors
  • Save visualizations as PNG files

Contributors

Original Contributors:

References

Development

Building and Publishing

  1. Build the package:

    ./build_package.sh
    
  2. Test on TestPyPI (recommended):

    ./publish_to_testpypi.sh
    

    Then test installation:

    pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple DeepFV
    
  3. Publish to PyPI:

    ./publish_to_pypi.sh
    

PyPI Credentials Setup

Before publishing, you need PyPI credentials:

  1. Create accounts on PyPI and TestPyPI
  2. Create API tokens:
  3. Create ~/.pypirc:
    [distutils]
    index-servers =
        pypi
        testpypi
    
    [pypi]
    username = __token__
    password = pypi-your-api-token-here
    
    [testpypi]
    username = __token__
    password = pypi-your-testpypi-token-here
    

License

MIT License - see LICENSE file for details

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

deepfv-0.2.0.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

deepfv-0.2.0-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file deepfv-0.2.0.tar.gz.

File metadata

  • Download URL: deepfv-0.2.0.tar.gz
  • Upload date:
  • Size: 10.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for deepfv-0.2.0.tar.gz
Algorithm Hash digest
SHA256 704f852f297b641519fb25b8f52d7ef504e523d3d6e859209c39a905d0f96334
MD5 5b6b183c7c047ac57678b324e09d9090
BLAKE2b-256 add2efa4ccf6902d1f03b5384f9b1db6f118b41e9b3814b5b9094fc6cfa0542c

See more details on using hashes here.

File details

Details for the file deepfv-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: deepfv-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 11.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for deepfv-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7bd3e768be232e8c51218c9979632eaf1bdbbb488ec35a0fe49eaed8bb972eef
MD5 2f9eb8f5d7f5b6aa3e33f22e836039ad
BLAKE2b-256 ef1270a074595cccf5b8fa7222219f63003a32fcbde236c96b548bd4ba60e4c9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page