From b4bcfe499ced38bf58c178939d1b4e52b0b61cf4 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 23 Sep 2021 13:47:18 +0200 Subject: [PATCH] People: Add min face size config option #22 --- internal/commands/config.go | 1 + internal/config/face.go | 9 +++++++++ internal/config/flags.go | 6 ++++++ internal/config/options.go | 1 + internal/photoprism/index_faces.go | 5 +---- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/internal/commands/config.go b/internal/commands/config.go index 8d95523e9..8c082c89a 100644 --- a/internal/commands/config.go +++ b/internal/commands/config.go @@ -142,6 +142,7 @@ func configAction(ctx *cli.Context) error { fmt.Printf("%-25s %d\n", "jpeg-quality", conf.JpegQuality()) // Facial recognition. + fmt.Printf("%-25s %d\n", "face-size", conf.FaceSize()) fmt.Printf("%-25s %f\n", "face-score", conf.FaceScore()) fmt.Printf("%-25s %d\n", "face-overlap", conf.FaceOverlap()) fmt.Printf("%-25s %d\n", "face-cluster-core", conf.FaceClusterCore()) diff --git a/internal/config/face.go b/internal/config/face.go index b500e6168..71ae03a2c 100644 --- a/internal/config/face.go +++ b/internal/config/face.go @@ -2,6 +2,15 @@ package config import "github.com/photoprism/photoprism/internal/face" +// FaceSize returns the face size threshold in pixels. +func (c *Config) FaceSize() int { + if c.options.FaceSize < 20 || c.options.FaceSize > 10000 { + return 40 + } + + return c.options.FaceSize +} + // FaceScore returns the face quality score threshold. func (c *Config) FaceScore() float64 { if c.options.FaceScore < 1 || c.options.FaceScore > 100 { diff --git a/internal/config/flags.go b/internal/config/flags.go index c999bf248..8cf181f3e 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -428,6 +428,12 @@ var GlobalFlags = []cli.Flag{ Value: 92, EnvVar: "PHOTOPRISM_JPEG_QUALITY", }, + cli.IntFlag{ + Name: "face-size", + Usage: "min face size in `PIXELS`", + Value: 40, + EnvVar: "PHOTOPRISM_FACE_SIZE", + }, cli.Float64Flag{ Name: "face-score", Usage: "face `QUALITY` threshold", diff --git a/internal/config/options.go b/internal/config/options.go index 477264364..da10e9d50 100644 --- a/internal/config/options.go +++ b/internal/config/options.go @@ -112,6 +112,7 @@ type Options struct { ThumbSizeUncached int `yaml:"ThumbSizeUncached" json:"ThumbSizeUncached" flag:"thumb-size-uncached"` JpegSize int `yaml:"JpegSize" json:"JpegSize" flag:"jpeg-size"` JpegQuality int `yaml:"JpegQuality" json:"JpegQuality" flag:"jpeg-quality"` + FaceSize int `yaml:"-" json:"-" flag:"face-size"` FaceScore float64 `yaml:"-" json:"-" flag:"face-score"` FaceOverlap int `yaml:"-" json:"-" flag:"face-overlap"` FaceClusterCore int `yaml:"-" json:"-" flag:"face-cluster-core"` diff --git a/internal/photoprism/index_faces.go b/internal/photoprism/index_faces.go index 09e10e2df..8fd651be6 100644 --- a/internal/photoprism/index_faces.go +++ b/internal/photoprism/index_faces.go @@ -15,15 +15,12 @@ func (ind *Index) Faces(jpeg *MediaFile, expected int) face.Faces { return face.Faces{} } - var minSize int var thumbSize thumb.Name // Select best thumbnail depending on configured size. if Config().ThumbSizePrecached() < 1280 { - minSize = 20 thumbSize = thumb.Fit720 } else { - minSize = 30 thumbSize = thumb.Fit1280 } @@ -41,7 +38,7 @@ func (ind *Index) Faces(jpeg *MediaFile, expected int) face.Faces { start := time.Now() - faces, err := ind.faceNet.Detect(thumbName, minSize, true, expected) + faces, err := ind.faceNet.Detect(thumbName, Config().FaceSize(), true, expected) if err != nil { log.Debugf("%s in %s", err, txt.Quote(jpeg.BaseName()))