48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// defaultVerifyThreshold is the cosine-distance cutoff used when a request does
|
|
// not set one. Matches the insightface buffalo_l ArcFace R50 default the Python
|
|
// face backend ships with so the two implementations agree on verdicts out of
|
|
// the box.
|
|
const defaultVerifyThreshold float32 = 0.35
|
|
|
|
// loadOptions holds the parsed model-level options for face-detect.
|
|
type loadOptions struct {
|
|
verifyThreshold float32
|
|
modelName string
|
|
}
|
|
|
|
func splitOption(o string) (key, value string, ok bool) {
|
|
i := strings.Index(o, ":")
|
|
if i < 0 {
|
|
return "", "", false
|
|
}
|
|
return strings.TrimSpace(o[:i]), strings.TrimSpace(o[i+1:]), true
|
|
}
|
|
|
|
// parseOptions reads the backend "key:value" option slice. Unknown keys are
|
|
// ignored. Defaults: verify_threshold 0.35, model_name derived from the file.
|
|
func parseOptions(opts []string) loadOptions {
|
|
o := loadOptions{verifyThreshold: defaultVerifyThreshold}
|
|
for _, oo := range opts {
|
|
key, value, ok := splitOption(oo)
|
|
if !ok {
|
|
continue
|
|
}
|
|
switch key {
|
|
case "verify_threshold", "threshold":
|
|
if f, err := strconv.ParseFloat(value, 32); err == nil && f > 0 {
|
|
o.verifyThreshold = float32(f)
|
|
}
|
|
case "model_name":
|
|
o.modelName = value
|
|
}
|
|
}
|
|
return o
|
|
}
|