People: Tweak face detection thresholds #22

This commit is contained in:
Michael Mayer 2021-09-21 11:03:07 +02:00
parent 0050478be3
commit 8882cf0c61
5 changed files with 30 additions and 15 deletions

View file

@ -133,7 +133,7 @@ func (m *Face) Match(embeddings Embeddings) (match bool, dist float64) {
case dist < 0:
// Should never happen.
return false, dist
case dist > (m.SampleRadius + face.ClusterRadius):
case dist > (m.SampleRadius + face.MatchRadius):
// Too far.
return false, dist
case m.CollisionRadius > 0.1 && dist > m.CollisionRadius:

View file

@ -6,9 +6,10 @@ import (
var CropSize = crop.Sizes[crop.Tile160]
var ClusterCore = 4
var ClusterRadius = 0.58
var ClusterMinScore = 15
var ClusterMinSize = 100
var ClusterMinSize = 95
var ClusterRadius = 0.58
var MatchRadius = 0.46
var SampleThreshold = 2 * ClusterCore
var OverlapThreshold = 42
var OverlapThresholdFloor = OverlapThreshold - 1
@ -18,12 +19,14 @@ var ScoreThreshold = float32(9.0)
func ScaleScoreThreshold(scale int) float32 {
// Smaller faces require higher quality.
switch {
case scale <= 25:
return ScoreThreshold + 21.0
case scale < 30:
return ScoreThreshold + 12.5
case scale < 26:
return ScoreThreshold + 26.0
case scale < 32:
return ScoreThreshold + 16.0
case scale < 40:
return ScoreThreshold + 11.0
case scale < 50:
return ScoreThreshold + 9.5
return ScoreThreshold + 9.0
case scale < 80:
return ScoreThreshold + 6.0
case scale < 110:

View file

@ -7,13 +7,25 @@ import (
)
func TestScaleScoreThreshold(t *testing.T) {
t.Run("Small", func(t *testing.T) {
assert.Equal(t, float32(30), ScaleScoreThreshold(10))
t.Run("XXS", func(t *testing.T) {
assert.Equal(t, float32(35), ScaleScoreThreshold(21))
})
t.Run("Medium", func(t *testing.T) {
t.Run("XS", func(t *testing.T) {
assert.Equal(t, float32(25), ScaleScoreThreshold(27))
})
t.Run("S", func(t *testing.T) {
assert.Equal(t, float32(20), ScaleScoreThreshold(33))
})
t.Run("M", func(t *testing.T) {
assert.Equal(t, float32(18), ScaleScoreThreshold(45))
})
t.Run("L", func(t *testing.T) {
assert.Equal(t, float32(15), ScaleScoreThreshold(75))
})
t.Run("Large", func(t *testing.T) {
assert.Equal(t, float32(9), ScaleScoreThreshold(200))
t.Run("XL", func(t *testing.T) {
assert.Equal(t, float32(11), ScaleScoreThreshold(100))
})
t.Run("XXL", func(t *testing.T) {
assert.Equal(t, float32(9), ScaleScoreThreshold(250))
})
}

View file

@ -71,7 +71,7 @@ func (w *Faces) Audit(fix bool) (err error) {
conflicts++
r := f1.SampleRadius + face.ClusterRadius
r := f1.SampleRadius + face.MatchRadius
log.Infof("face %s: conflict at dist %f, Ø %f from %d samples, collision Ø %f", f1.ID, dist, r, f1.Samples, f1.CollisionRadius)

View file

@ -178,7 +178,7 @@ func ResolveFaceCollisions() (conflicts, resolved int, err error) {
conflicts++
r := f1.SampleRadius + face.ClusterRadius
r := f1.SampleRadius + face.MatchRadius
log.Infof("face %s: conflict at dist %f, Ø %f from %d samples, collision Ø %f", f1.ID, dist, r, f1.Samples, f1.CollisionRadius)