Skip to main content

Frechet Coefficient

Project description

Frechet Coefficient

Frechet Coefficient is a Python package for calculating various similarity metrics between images, including Frechet Distance, Frechet Coefficient, and Hellinger Distance. It leverages pre-trained models from TensorFlow's Keras applications to extract features from images.

Table of Contents

Installation

To install the package, use the following command:

pip install frechet-coefficient

Requirements:

  • Python 3.10-3.12
  • TensorFlow 2.18.*
  • imageio 2.36.*

Usage

You can use the command-line interface (CLI) to calculate similarity metrics between two directories of images.

frechet-coefficient <path_to_directory1> <path_to_directory2> --metric <metric> [options]

Remember to use enough images to get a meaningful result. If your datasets are small, consider using --random_patches argument to calculate metrics on random patches of images.

Positional Arguments

  • dir1: Path to the first directory of images.
  • dir2: Path to the second directory of images.

Options

  • --metric: Metric to calculate (fd, fc, hd).
  • --batch_size: Batch size for processing images.
  • --num_of_images: Number of images to load from each directory.
  • --as_gray: Load images as grayscale.
  • --random_patches: Calculate metrics on random patches of images.
  • --patch_size: Size of the random patches.
  • --num_of_patch: Number of random patches to extract.
  • --model: Pre-trained model to use as feature extractor (inceptionv3, resnet50v2, xception, densenet201, convnexttiny, efficientnetv2s).
  • --verbose: Enable verbose output.

Example CLI Commands

To calculate the Frechet Distance between two sets of images, use the following command:

frechet-coefficient images/set1 images/set2 --metric fd

To calculate the Frechet Coefficient between two sets of images using the InceptionV3 model, use the following command:

frechet-coefficient images/set1 images/set2 --metric fc --model inceptionv3

To calculate the Hellinger Distance between two sets of images using random patches, use the following command:

frechet-coefficient images/set1 images/set2 --metric hd --random_patches --patch_size 128 --num_of_patch 10000

Python Code

You can also use python code to calculate similarity metrics between two sets of images.

import numpy as np
from typing import List
from frechet_coefficient import ImageSimilarityMetrics, load_images

# Initialize the ImageSimilarityMetrics class
ism = ImageSimilarityMetrics(model='inceptionv3', verbose=0)

images_1: List[np.ndarray] = load_images(path=...) # shape: (num_of_images, height, width, channels)
images_2: List[np.ndarray] = load_images(path=...) # shape: (num_of_images, height, width, channels)

# Calculate Frechet Distance
fd = ism.calculate_frechet_distance(images_1, images_2, batch_size=4)
# Calculate Frechet Coefficient
fc = ism.calculate_frechet_coefficient(images_1, images_2, batch_size=4)
# Calculate Hellinger Distance
hd = ism.calculate_hellinger_distance(images_1, images_2, batch_size=4)

# Calculate means vectors and covariance matrices
mean_1, cov_1 = ism.derive_mean_cov(images_1, batch_size=4)
mean_2, cov_2 = ism.derive_mean_cov(images_2, batch_size=4)

# Calculate metrics using mean vectors and covariance matrices
fd = ism.calculate_fd_with_mean_cov(mean_1, cov_1, mean_2, cov_2)
fc = ism.calculate_fc_with_mean_cov(mean_1, cov_1, mean_2, cov_2)
hd = ism.calculate_hd_with_mean_cov(mean_1, cov_1, mean_2, cov_2)

You can also calculate similarity metrics between two sets of images using random patches.

import numpy as np
from typing import List
from frechet_coefficient import ImageSimilarityMetrics, crop_random_patches, load_images

# Initialize the ImageSimilarityMetrics class
ism = ImageSimilarityMetrics(model='inceptionv3', verbose=0)

images_1: List[np.ndarray] = load_images(path=...) # shape: (num_of_images, height, width, channels)
images_2: List[np.ndarray] = load_images(path=...) # shape: (num_of_images, height, width, channels)

# Crop random patches from images
images_1_patches = crop_random_patches(images_1, size=(128, 128), num_of_patch=10000)
images_2_patches = crop_random_patches(images_2, size=(128, 128), num_of_patch=10000)

# Calculate Frechet Distance
fd = ism.calculate_frechet_distance(images_1_patches, images_2_patches, batch_size=4)
# Calculate Frechet Coefficient
fc = ism.calculate_frechet_coefficient(images_1_patches, images_2_patches, batch_size=4)
# Calculate Hellinger Distance
hd = ism.calculate_hellinger_distance(images_1_patches, images_2_patches, batch_size=4)

Metrics

  • fd: Frechet Distance (with InceptionV3 model is equivalent to FID)
  • fc: Frechet Coefficient
  • hd: Hellinger Distance

The Hellinger Distance is numerically unstable for small datasets. The main reason is poorly estimated covariance matrices. To mitigate this issue, you can use the --random_patches argument to calculate metrics on random patches of images with a very high number of patches (e.g., 50000).

Models

Features

  • Calculate Frechet Distance, Frechet Coefficient, and Hellinger Distance between two sets of images.
  • Support for multiple pre-trained models.
  • Option to calculate metrics on random patches of images.

Citation

If you use this package in your research, please consider citing the following paper:

  • not available yet

License

This project is licensed under the MIT License. See the [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

frechet_coefficient-1.0.4.tar.gz (10.2 kB view details)

Uploaded Source

Built Distribution

frechet_coefficient-1.0.4-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file frechet_coefficient-1.0.4.tar.gz.

File metadata

  • Download URL: frechet_coefficient-1.0.4.tar.gz
  • Upload date:
  • Size: 10.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for frechet_coefficient-1.0.4.tar.gz
Algorithm Hash digest
SHA256 14666b084fa5292b83554e7f525d4a5bf6fe6ccb35499e604e5c8bd9b0866f60
MD5 63762bd4f900595d470dd5595436d1ea
BLAKE2b-256 dc950d7a91b3535b866a4b080d2c0f264e0481b3866394b74eecbd652ef58f1a

See more details on using hashes here.

Provenance

The following attestation bundles were made for frechet_coefficient-1.0.4.tar.gz:

Publisher: github-release-workflow.yml on adriankucharski/frechet-coefficient

Attestations:

File details

Details for the file frechet_coefficient-1.0.4-py3-none-any.whl.

File metadata

File hashes

Hashes for frechet_coefficient-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 71dcebd8b3855980383fabe48c214e91506fe75ab847ecd1f3d61fef278bfd61
MD5 d51ccf3145f9bce1f5085e89ee0f1906
BLAKE2b-256 dfba1156dcd23e102fab96540960fdd04e8dfb3ebfa32725b197be5b7e5805c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for frechet_coefficient-1.0.4-py3-none-any.whl:

Publisher: github-release-workflow.yml on adriankucharski/frechet-coefficient

Attestations:

Supported by

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