Skip to content

Commit 72d280c

Browse files
implemented faceLandmarkNet
1 parent fa5a59a commit 72d280c

File tree

5 files changed

+56
-29
lines changed

5 files changed

+56
-29
lines changed

src/commons/convLayer.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import * as tf from '@tensorflow/tfjs-core';
2+
3+
import { ConvParams } from './types';
4+
5+
export function convLayer(
6+
x: tf.Tensor4D,
7+
params: ConvParams,
8+
padding: 'valid' | 'same' = 'same'
9+
): tf.Tensor4D {
10+
return tf.tidy(() =>
11+
tf.add(
12+
tf.conv2d(x, params.filters, [1, 1], padding),
13+
params.bias
14+
)
15+
)
16+
}

src/faceDetectionNet/boxPredictionLayer.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,8 @@
11
import * as tf from '@tensorflow/tfjs-core';
22

3-
import { ConvParams } from '../commons/types';
3+
import { convLayer } from '../commons/convLayer';
44
import { FaceDetectionNet } from './types';
55

6-
function convWithBias(
7-
x: tf.Tensor4D,
8-
params: ConvParams
9-
) {
10-
return tf.tidy(() =>
11-
tf.add(
12-
tf.conv2d(x, params.filters, [1, 1], 'same'),
13-
params.bias
14-
)
15-
)
16-
}
176

187
export function boxPredictionLayer(
198
x: tf.Tensor4D,
@@ -24,11 +13,11 @@ export function boxPredictionLayer(
2413
const batchSize = x.shape[0]
2514

2615
const boxPredictionEncoding = tf.reshape(
27-
convWithBias(x, params.box_encoding_predictor_params),
16+
convLayer(x, params.box_encoding_predictor_params),
2817
[batchSize, -1, 1, 4]
2918
)
3019
const classPrediction = tf.reshape(
31-
convWithBias(x, params.class_predictor_params),
20+
convLayer(x, params.class_predictor_params),
3221
[batchSize, -1, 3]
3322
)
3423

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import * as tf from '@tensorflow/tfjs-core';
2+
3+
import { FaceLandmarkNet } from './types';
4+
5+
export function fullyConnectedLayer(
6+
x: tf.Tensor2D,
7+
params: FaceLandmarkNet.FCParams
8+
): tf.Tensor2D {
9+
return tf.tidy(() =>
10+
tf.add(
11+
tf.matMul(x, params.weights),
12+
params.bias
13+
)
14+
)
15+
}

src/faceLandmarkNet/index.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { NetInput } from '../NetInput';
55
import { padToSquare } from '../padToSquare';
66
import { TNetInput } from '../types';
77
import { extractParams } from './extractParams';
8+
import { convLayer } from '../commons/convLayer';
9+
import { fullyConnectedLayer } from './fullyConnectedLayer';
810

911
export function faceLandmarkNet(weights: Float32Array) {
1012
const params = extractParams(weights)
@@ -18,17 +20,22 @@ export function faceLandmarkNet(weights: Float32Array) {
1820
x = tf.image.resizeBilinear(x, [128, 128])
1921
}
2022

21-
// pool 1
22-
tf.maxPool(x, [2, 2], [2, 2], 'valid')
23-
// pool 2
24-
tf.maxPool(x, [2, 2], [2, 2], 'valid')
25-
// pool 3
26-
tf.maxPool(x, [2, 2], [2, 2], 'valid')
27-
// pool 4
28-
tf.maxPool(x, [2, 2], [1, 1], 'valid')
29-
// TODO
23+
let out = convLayer(x, params.conv0_params, 'valid')
24+
out = tf.maxPool(out, [2, 2], [2, 2], 'valid')
25+
out = convLayer(out, params.conv1_params, 'valid')
26+
out = convLayer(out, params.conv2_params, 'valid')
27+
out = tf.maxPool(out, [2, 2], [2, 2], 'valid')
28+
out = convLayer(out, params.conv3_params, 'valid')
29+
out = convLayer(out, params.conv4_params, 'valid')
30+
out = tf.maxPool(out, [2, 2], [2, 2], 'valid')
31+
out = convLayer(out, params.conv5_params, 'valid')
32+
out = convLayer(out, params.conv6_params, 'valid')
33+
out = tf.maxPool(out, [2, 2], [1, 1], 'valid')
34+
out = convLayer(out, params.conv7_params, 'valid')
35+
const fc0 = fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)
36+
const fc1 = fullyConnectedLayer(fc0, params.fc1_params)
3037

31-
return x
38+
return fc1
3239
})
3340
}
3441

src/faceRecognitionNet/convLayer.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@ import { FaceRecognitionNet } from './types';
77
function convLayer(
88
x: tf.Tensor4D,
99
params: FaceRecognitionNet.ConvLayerParams,
10-
stride: number,
10+
strides: [number, number],
1111
withRelu: boolean,
1212
padding: 'valid' | 'same' = 'same'
1313
): tf.Tensor4D {
1414
const { filters, bias } = params.conv
1515

16-
let out = tf.conv2d(x, filters, [stride, stride], padding)
16+
let out = tf.conv2d(x, filters, strides, padding)
1717
out = tf.add(out, bias)
1818
out = scale(out, params.scale)
1919
return withRelu ? tf.relu(out) : out
2020
}
2121

2222
export function conv(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams) {
23-
return convLayer(x, params, 1, true)
23+
return convLayer(x, params, [1, 1], true)
2424
}
2525

2626
export function convNoRelu(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams) {
27-
return convLayer(x, params, 1, false)
27+
return convLayer(x, params, [1, 1], false)
2828
}
2929

3030
export function convDown(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams) {
31-
return convLayer(x, params, 2, true, 'valid')
31+
return convLayer(x, params, [2, 2], true, 'valid')
3232
}

0 commit comments

Comments
 (0)