Skip to content

Commit d098169

Browse files
fixed the face alignment bug in allFaces + default parameters
1 parent 5cc2741 commit d098169

File tree

5 files changed

+47
-41
lines changed

5 files changed

+47
-41
lines changed

src/FaceLandmarks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export class FaceLandmarks {
105105
const x = Math.floor(Math.max(0, refPoint.x - (relX * size)))
106106
const y = Math.floor(Math.max(0, refPoint.y - (relY * size)))
107107

108-
return new Rect(x, y, Math.min(size, this._imageWidth - x), Math.min(size, this._imageHeight - y))
108+
return new Rect(x, y, Math.min(size, this._imageWidth + x), Math.min(size, this._imageHeight + y))
109109
}
110110

111111
protected getRefPointsForAlignment(): Point[] {

src/allFacesFactory.ts

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,45 @@ import { extractFaceTensors } from './extractFaceTensors';
22
import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet';
33
import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet';
44
import { FaceLandmarks68 } from './faceLandmarkNet/FaceLandmarks68';
5+
import { FaceRecognitionNet } from './faceRecognitionNet/FaceRecognitionNet';
56
import { FullFaceDescription } from './FullFaceDescription';
67
import { Mtcnn } from './mtcnn/Mtcnn';
78
import { MtcnnForwardParams } from './mtcnn/types';
89
import { Rect } from './Rect';
910
import { TNetInput } from './types';
1011

12+
function computeDescriptorsFactory(
13+
recognitionNet: FaceRecognitionNet
14+
) {
15+
return async function(input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) {
16+
const alignedFaceTensors = await extractFaceTensors(input, alignedFaceBoxes)
17+
18+
const descriptors = useBatchProcessing
19+
? await recognitionNet.computeFaceDescriptor(alignedFaceTensors) as Float32Array[]
20+
: await Promise.all(alignedFaceTensors.map(
21+
faceTensor => recognitionNet.computeFaceDescriptor(faceTensor)
22+
)) as Float32Array[]
23+
24+
alignedFaceTensors.forEach(t => t.dispose())
25+
26+
return descriptors
27+
}
28+
}
29+
1130
export function allFacesFactory(
1231
detectionNet: FaceDetectionNet,
1332
landmarkNet: FaceLandmarkNet,
14-
computeDescriptors: (input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) => Promise<Float32Array[]>
33+
recognitionNet: FaceRecognitionNet
1534
) {
35+
const computeDescriptors = computeDescriptorsFactory(recognitionNet)
36+
1637
return async function(
1738
input: TNetInput,
18-
minConfidence: number,
39+
minConfidence: number = 0.8,
1940
useBatchProcessing: boolean = false
2041
): Promise<FullFaceDescription[]> {
2142

2243
const detections = await detectionNet.locateFaces(input, minConfidence)
23-
2444
const faceTensors = await extractFaceTensors(input, detections)
2545

2646
const faceLandmarksByFace = useBatchProcessing
@@ -50,11 +70,13 @@ export function allFacesFactory(
5070

5171
export function allFacesMtcnnFactory(
5272
mtcnn: Mtcnn,
53-
computeDescriptors: (input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) => Promise<Float32Array[]>
73+
recognitionNet: FaceRecognitionNet
5474
) {
75+
const computeDescriptors = computeDescriptorsFactory(recognitionNet)
76+
5577
return async function(
5678
input: TNetInput,
57-
mtcnnForwardParams: MtcnnForwardParams,
79+
mtcnnForwardParams: MtcnnForwardParams = {},
5880
useBatchProcessing: boolean = false
5981
): Promise<FullFaceDescription[]> {
6082

src/faceDetectionNet/FaceDetectionNet.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class FaceDetectionNet extends NeuralNetwork<NetParams> {
5050
public async locateFaces(
5151
input: TNetInput,
5252
minConfidence: number = 0.8,
53-
maxResults: number = 100,
53+
maxResults: number = 100
5454
): Promise<FaceDetection[]> {
5555

5656
const netInput = await toNetInput(input, true)

src/globalApi.ts

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as tf from '@tensorflow/tfjs-core';
22

33
import { allFacesFactory, allFacesMtcnnFactory } from './allFacesFactory';
4-
import { extractFaceTensors } from './extractFaceTensors';
54
import { FaceDetection } from './FaceDetection';
65
import { FaceDetectionNet } from './faceDetectionNet/FaceDetectionNet';
76
import { FaceLandmarkNet } from './faceLandmarkNet/FaceLandmarkNet';
@@ -11,7 +10,6 @@ import { FullFaceDescription } from './FullFaceDescription';
1110
import { Mtcnn } from './mtcnn/Mtcnn';
1211
import { MtcnnForwardParams, MtcnnResult } from './mtcnn/types';
1312
import { NetInput } from './NetInput';
14-
import { Rect } from './Rect';
1513
import { TNetInput } from './types';
1614

1715
export const detectionNet = new FaceDetectionNet()
@@ -79,39 +77,25 @@ export function mtcnn(
7977
return nets.mtcnn.forward(input, forwardParams)
8078
}
8179

82-
export const allFaces: (
80+
export type allFacesFunction = (
8381
input: tf.Tensor | NetInput | TNetInput,
84-
minConfidence: number,
82+
minConfidence?: number,
8583
useBatchProcessing?: boolean
86-
) => Promise<FullFaceDescription[]> = allFacesFactory(
87-
detectionNet,
88-
landmarkNet,
89-
computeDescriptorsFactory(nets.faceRecognitionNet)
84+
) => Promise<FullFaceDescription[]>
85+
86+
export const allFaces: allFacesFunction = allFacesFactory(
87+
nets.ssdMobilenet,
88+
nets.faceLandmark68Net,
89+
nets.faceRecognitionNet
9090
)
9191

92-
export const allFacesMtcnn: (
92+
export type allFacesMtcnnFunction = (
9393
input: tf.Tensor | NetInput | TNetInput,
94-
mtcnnForwardParams: MtcnnForwardParams,
94+
mtcnnForwardParams?: MtcnnForwardParams,
9595
useBatchProcessing?: boolean
96-
) => Promise<FullFaceDescription[]> = allFacesMtcnnFactory(
97-
nets.mtcnn,
98-
computeDescriptorsFactory(nets.faceRecognitionNet)
99-
)
96+
) => Promise<FullFaceDescription[]>
10097

101-
function computeDescriptorsFactory(
102-
recognitionNet: FaceRecognitionNet
103-
) {
104-
return async function(input: TNetInput, alignedFaceBoxes: Rect[], useBatchProcessing: boolean) {
105-
const alignedFaceTensors = await extractFaceTensors(input, alignedFaceBoxes)
106-
107-
const descriptors = useBatchProcessing
108-
? await recognitionNet.computeFaceDescriptor(alignedFaceTensors) as Float32Array[]
109-
: await Promise.all(alignedFaceTensors.map(
110-
faceTensor => recognitionNet.computeFaceDescriptor(faceTensor)
111-
)) as Float32Array[]
112-
113-
alignedFaceTensors.forEach(t => t.dispose())
114-
115-
return descriptors
116-
}
117-
}
98+
export const allFacesMtcnn: allFacesMtcnnFunction = allFacesMtcnnFactory(
99+
nets.mtcnn,
100+
nets.faceRecognitionNet
101+
)

src/mtcnn/Mtcnn.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
2828

2929
public async forwardInput(
3030
input: NetInput,
31-
forwardParams: MtcnnForwardParams
31+
forwardParams: MtcnnForwardParams = {}
3232
): Promise<{ results: MtcnnResult[], stats: any }> {
3333

3434
const { params } = this
@@ -132,7 +132,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
132132

133133
public async forward(
134134
input: TNetInput,
135-
forwardParams: MtcnnForwardParams
135+
forwardParams: MtcnnForwardParams = {}
136136
): Promise<MtcnnResult[]> {
137137
return (
138138
await this.forwardInput(
@@ -144,7 +144,7 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
144144

145145
public async forwardWithStats(
146146
input: TNetInput,
147-
forwardParams: MtcnnForwardParams
147+
forwardParams: MtcnnForwardParams = {}
148148
): Promise<{ results: MtcnnResult[], stats: any }> {
149149
return this.forwardInput(
150150
await toNetInput(input, true, true),

0 commit comments

Comments
 (0)