mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-01-20 06:37:59 +01:00
51 lines
1.5 KiB
Elixir
51 lines
1.5 KiB
Elixir
defmodule PhilomenaMedia.Features do
|
|
@moduledoc """
|
|
Features are a set of 768 weighted classification outputs produced from a
|
|
vision transformer (ViT). The individual classifications are arbitrary and
|
|
not meaningful to analyze, but the vectors can be used to compare similarity
|
|
between images using the cosine similarity measurement.
|
|
|
|
Since cosine similarity is not a metric, it is substituted for normalized L2
|
|
distance by the feature extractor; every vector that it returns is normalized,
|
|
and traversing the k nearest neighbors in a vector space index will iterate
|
|
vectors in the same order as their cosine similarity.
|
|
"""
|
|
|
|
alias PhilomenaMedia.Remote
|
|
|
|
@type t :: %__MODULE__{
|
|
features: [float()]
|
|
}
|
|
|
|
defstruct [:features]
|
|
|
|
@doc """
|
|
Gets the features of the given image file.
|
|
|
|
The image file must be in the PNG or JPEG format.
|
|
|
|
> #### Info {: .info}
|
|
>
|
|
> Clients should prefer to use `PhilomenaMedia.Processors.features/2`, as it handles
|
|
> media files of any type supported by this library, not just PNG or JPEG.
|
|
|
|
## Examples
|
|
|
|
iex> Features.file("image.png")
|
|
{:ok, %Features{features: [0.03156396001577377, -0.04559657722711563, ...]}}
|
|
|
|
iex> Features.file("nonexistent.jpg")
|
|
:error
|
|
|
|
"""
|
|
@spec file(Path.t()) :: {:ok, t()} | :error
|
|
def file(input) do
|
|
case Remote.get_features(input) do
|
|
{:ok, features} ->
|
|
{:ok, %__MODULE__{features: features}}
|
|
|
|
_error ->
|
|
:error
|
|
end
|
|
end
|
|
end
|