People: Tweak face detection thresholds #22
This commit is contained in:
parent
0050478be3
commit
8882cf0c61
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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))
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue