feat(faceswap): report whether the likeness actually transferred #24
@@ -55,6 +55,14 @@ type DetectedFace struct {
|
||||
Box [4]int
|
||||
// Score is the detector's confidence, 0-1.
|
||||
Score float64
|
||||
|
||||
// Yaw is how far the head is turned from camera, in degrees, or nil when
|
||||
// the provider does not report pose. Exposed on ENUMERATION, not just
|
||||
// after the fact, because it is how a caller picks a face a swap will
|
||||
// actually work on: past roughly ±45° the features carrying identity are
|
||||
// edge-on, and the result reads as a generic person however good the
|
||||
// transfer is. A bounding box cannot show this.
|
||||
Yaw *float64
|
||||
}
|
||||
|
||||
// Size returns the box dimensions. Derived rather than stored: carrying
|
||||
|
||||
@@ -41,11 +41,12 @@ type faceSwapModel struct {
|
||||
type facesResponse struct {
|
||||
Count int `json:"count"`
|
||||
Faces []struct {
|
||||
Index int `json:"index"`
|
||||
Box []int `json:"box"`
|
||||
Score float64 `json:"score"`
|
||||
Width int `json:"width"`
|
||||
Height int `json:"height"`
|
||||
Index int `json:"index"`
|
||||
Box []int `json:"box"`
|
||||
Score float64 `json:"score"`
|
||||
Width int `json:"width"`
|
||||
Height int `json:"height"`
|
||||
Yaw *float64 `json:"yaw"`
|
||||
} `json:"faces"`
|
||||
}
|
||||
|
||||
@@ -74,7 +75,7 @@ func (m *faceSwapModel) ListFaces(ctx context.Context, img imagegen.Image) ([]im
|
||||
}
|
||||
out := make([]imagegen.DetectedFace, 0, len(parsed.Faces))
|
||||
for _, f := range parsed.Faces {
|
||||
df := imagegen.DetectedFace{Index: f.Index, Score: f.Score}
|
||||
df := imagegen.DetectedFace{Index: f.Index, Score: f.Score, Yaw: f.Yaw}
|
||||
// A short box would silently index out of range below; treat a
|
||||
// malformed entry as a protocol error rather than zero-filling it,
|
||||
// because a wrong box sends the caller at the wrong face.
|
||||
|
||||
Reference in New Issue
Block a user