01d5156568
Signed-off-by: Michael Mayer <michael@photoprism.app>
99 lines
1.8 KiB
Go
99 lines
1.8 KiB
Go
package face
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
type Kind int
|
|
|
|
const (
|
|
RegularFace Kind = iota + 1
|
|
KidsFace
|
|
IgnoredFace
|
|
AmbiguousFace
|
|
)
|
|
|
|
var r = rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
|
// RandomDist returns a distance threshold for matching RandomDEmbeddings.
|
|
func RandomDist() float64 {
|
|
return RandomFloat64(0.75, 0.15)
|
|
}
|
|
|
|
// RandomFloat64 adds a random distance offset to a float64.
|
|
func RandomFloat64(f, d float64) float64 {
|
|
return f + (r.Float64()-0.5)*d
|
|
}
|
|
|
|
// RandomEmbeddings returns random embeddings for testing.
|
|
func RandomEmbeddings(n int, k Kind) (result Embeddings) {
|
|
if n <= 0 {
|
|
return Embeddings{}
|
|
}
|
|
|
|
result = make(Embeddings, n)
|
|
|
|
for i := range result {
|
|
switch k {
|
|
case RegularFace:
|
|
result[i] = RandomEmbedding()
|
|
case KidsFace:
|
|
result[i] = RandomKidsEmbedding()
|
|
case IgnoredFace:
|
|
result[i] = RandomIgnoredEmbedding()
|
|
}
|
|
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// RandomEmbedding returns a random embedding for testing.
|
|
func RandomEmbedding() (result Embedding) {
|
|
result = make(Embedding, 512)
|
|
|
|
d := 64 / 512.0
|
|
|
|
for {
|
|
i := 0
|
|
for i = range result {
|
|
result[i] = RandomFloat64(0, d)
|
|
}
|
|
if !result.SkipMatching() {
|
|
break
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// RandomKidsEmbedding returns a random kids embedding for testing.
|
|
func RandomKidsEmbedding() (result Embedding) {
|
|
result = make(Embedding, 512)
|
|
|
|
d := 0.1 / 512.0
|
|
n := 1 + r.Intn(len(KidsEmbeddings)-1)
|
|
e := KidsEmbeddings[n]
|
|
|
|
for i := range result {
|
|
result[i] = RandomFloat64(e[i], d)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// RandomIgnoredEmbedding returns a random ignored embedding for testing.
|
|
func RandomIgnoredEmbedding() (result Embedding) {
|
|
result = make(Embedding, 512)
|
|
|
|
d := 0.1 / 512.0
|
|
n := 1 + r.Intn(len(IgnoredEmbeddings)-1)
|
|
e := IgnoredEmbeddings[n]
|
|
|
|
for i := range result {
|
|
result[i] = RandomFloat64(e[i], d)
|
|
}
|
|
|
|
return result
|
|
}
|