Skip to content

Commit 3f40b44

Browse files
minor webgl precision fixes + dispose webgl backends in between test suites to free up memory from cache
1 parent b301195 commit 3f40b44

17 files changed

+73
-37
lines changed

test/tests/dom/extractFaceTensors.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { createCanvasFromMedia, extractFaceTensors, Rect, tf } from '../../../src';
22
import { loadImage } from '../../env';
3+
import { describeWithBackend } from '../../utils';
34

4-
describe('extractFaceTensors', () => {
5+
describeWithBackend('extractFaceTensors', () => {
56

67
let imgTensor: tf.Tensor3D
78

test/tests/faceExpressionNet/faceExpressionNet.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import * as tf from '@tensorflow/tfjs-core';
33
import { createCanvasFromMedia, NetInput, toNetInput } from '../../../src';
44
import { FaceExpressionPrediction } from '../../../src/faceExpressionNet/types';
55
import { loadImage } from '../../env';
6-
import { describeWithNets, expectAllTensorsReleased } from '../../utils';
6+
import { describeWithBackend, describeWithNets, expectAllTensorsReleased } from '../../utils';
77

8-
describe('faceExpressionNet', () => {
8+
describeWithBackend('faceExpressionNet', () => {
99

1010
let imgElAngry: HTMLImageElement
1111
let imgElSurprised: HTMLImageElement

test/tests/faceLandmarkNet/faceLandmark68Net.test.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ import * as tf from '@tensorflow/tfjs-core';
22

33
import { createCanvasFromMedia, IDimensions, isTensor3D, NetInput, Point, TMediaElement, toNetInput } from '../../../src';
44
import { FaceLandmarks68 } from '../../../src/classes/FaceLandmarks68';
5-
import { FaceLandmark68Net } from '../../../src/faceLandmarkNet/FaceLandmark68Net';
65
import { loadImage, loadJson } from '../../env';
7-
import { describeWithNets, expectAllTensorsReleased, expectMaxDelta, expectPointClose } from '../../utils';
6+
import {
7+
describeWithBackend,
8+
describeWithNets,
9+
expectAllTensorsReleased,
10+
expectMaxDelta,
11+
expectPointClose,
12+
} from '../../utils';
813

914
function getInputDims (input: tf.Tensor | TMediaElement): IDimensions {
1015
if (input instanceof tf.Tensor) {
@@ -14,7 +19,7 @@ function getInputDims (input: tf.Tensor | TMediaElement): IDimensions {
1419
return input
1520
}
1621

17-
describe('faceLandmark68Net', () => {
22+
describeWithBackend('faceLandmark68Net', () => {
1823

1924
let imgEl1: HTMLImageElement
2025
let imgEl2: HTMLImageElement
@@ -44,7 +49,7 @@ describe('faceLandmark68Net', () => {
4449
expect(result.shift.y).toEqual(0)
4550
result.positions.forEach((pt, i) => {
4651
const { x, y } = faceLandmarkPositions1[i]
47-
expectPointClose(pt, { x, y }, 2)
52+
expectPointClose(pt, { x, y }, 3)
4853
})
4954
})
5055

test/tests/faceLandmarkNet/faceLandmark68Net.uncompressed.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Point } from '../../../src';
22
import { FaceLandmarks68 } from '../../../src/classes/FaceLandmarks68';
33
import { loadImage, loadJson } from '../../env';
4-
import { describeWithNets, expectPointClose } from '../../utils';
4+
import { describeWithBackend, describeWithNets, expectPointClose } from '../../utils';
55

6-
describe('faceLandmark68Net, uncompressed', () => {
6+
describeWithBackend('faceLandmark68Net, uncompressed', () => {
77

88
let imgEl1: HTMLImageElement
99
let imgElRect: HTMLImageElement

test/tests/faceLandmarkNet/faceLandmark68TinyNet.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as tf from '@tensorflow/tfjs-core';
33
import { createCanvasFromMedia, IDimensions, isTensor3D, NetInput, Point, TMediaElement, toNetInput } from '../../../src';
44
import { FaceLandmarks68 } from '../../../src/classes/FaceLandmarks68';
55
import { loadImage, loadJson } from '../../env';
6-
import { describeWithNets, expectAllTensorsReleased, expectPointClose } from '../../utils';
6+
import { describeWithBackend, describeWithNets, expectAllTensorsReleased, expectPointClose } from '../../utils';
77

88
function getInputDims (input: tf.Tensor | TMediaElement): IDimensions {
99
if (input instanceof tf.Tensor) {
@@ -13,7 +13,7 @@ function getInputDims (input: tf.Tensor | TMediaElement): IDimensions {
1313
return input
1414
}
1515

16-
describe('faceLandmark68TinyNet', () => {
16+
describeWithBackend('faceLandmark68TinyNet', () => {
1717

1818
let imgEl1: HTMLImageElement
1919
let imgEl2: HTMLImageElement

test/tests/faceLandmarkNet/faceLandmark68TinyNet.uncompressed.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Point } from '../../../src';
22
import { FaceLandmarks68 } from '../../../src/classes/FaceLandmarks68';
33
import { loadImage, loadJson } from '../../env';
4-
import { describeWithNets, expectPointClose } from '../../utils';
4+
import { describeWithNets, expectPointClose, describeWithBackend } from '../../utils';
55

6-
describe('faceLandmark68TinyNet, uncompressed', () => {
6+
describeWithBackend('faceLandmark68TinyNet, uncompressed', () => {
77

88
let imgEl1: HTMLImageElement
99
let imgElRect: HTMLImageElement

test/tests/faceRecognitionNet/faceRecognitionNet.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import * as tf from '@tensorflow/tfjs-core';
33
import { createCanvasFromMedia, NetInput, toNetInput } from '../../../src';
44
import { euclideanDistance } from '../../../src/euclideanDistance';
55
import { loadImage, loadJson } from '../../env';
6-
import { describeWithNets, expectAllTensorsReleased } from '../../utils';
6+
import { describeWithBackend, describeWithNets, expectAllTensorsReleased } from '../../utils';
77

8-
describe('faceRecognitionNet', () => {
8+
describeWithBackend('faceRecognitionNet', () => {
99

1010
let imgEl1: HTMLCanvasElement
1111
let imgEl2: HTMLCanvasElement

test/tests/faceRecognitionNet/faceRecognitionNet.uncompressed.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { createCanvasFromMedia } from '../../../src';
22
import { euclideanDistance } from '../../../src/euclideanDistance';
33
import { loadImage, loadJson } from '../../env';
4-
import { describeWithNets } from '../../utils';
4+
import { describeWithBackend, describeWithNets } from '../../utils';
55

6-
describe('faceRecognitionNet, uncompressed', () => {
6+
describeWithBackend('faceRecognitionNet, uncompressed', () => {
77

88
let imgEl1: HTMLCanvasElement
99
let imgElRect: HTMLCanvasElement

test/tests/mtcnn/mtcnn.forward.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { IPoint } from '../../../src';
22
import { loadImage, loadJson } from '../../env';
3-
import { describeWithNets } from '../../utils';
3+
import { describeWithBackend, describeWithNets } from '../../utils';
44
import { expectMtcnnResults } from './expectMtcnnResults';
55

6-
describe('mtcnn.forward', () => {
6+
describeWithBackend('mtcnn.forward', () => {
77

88
let imgEl: HTMLImageElement
99
let expectedMtcnnLandmarks: IPoint[][]

test/tests/mtcnn/mtcnn.forward.uncompressed.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { IPoint } from '../../../src';
22
import { loadImage, loadJson } from '../../env';
3-
import { describeWithNets } from '../../utils';
3+
import { describeWithBackend, describeWithNets } from '../../utils';
44
import { expectMtcnnResults } from './expectMtcnnResults';
55

6-
describe('mtcnn.forward', () => {
6+
describeWithBackend('mtcnn.forward', () => {
77

88
let imgEl: HTMLImageElement
99
let expectedMtcnnLandmarks: IPoint[][]

test/tests/mtcnn/mtcnn.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import { expectFaceDetectionsWithLandmarks } from '../../expectFaceDetectionsWit
66
import { expectFullFaceDescriptions } from '../../expectFullFaceDescriptions';
77
import {
88
assembleExpectedFullFaceDescriptions,
9+
describeWithBackend,
910
describeWithNets,
1011
expectAllTensorsReleased,
1112
ExpectedFullFaceDescription,
1213
} from '../../utils';
1314
import { expectedMtcnnBoxes } from './expectMtcnnResults';
1415

15-
describe('mtcnn', () => {
16+
describeWithBackend('mtcnn', () => {
1617

1718
let imgEl: HTMLImageElement
1819
let expectedFullFaceDescriptions: ExpectedFullFaceDescription[]
@@ -91,7 +92,7 @@ describe('mtcnn', () => {
9192
maxLandmarksDelta: 6,
9293
maxDescriptorDelta: 0.2
9394
}
94-
95+
9596
expect(!!result).toBeTruthy()
9697
expectFullFaceDescriptions(
9798
result ? [result] : [],

test/tests/ssdMobilenetv1/ssdMobilenetv1.locateFaces.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import * as faceapi from '../../../src';
22
import { loadImage } from '../../env';
33
import { expectFaceDetections } from '../../expectFaceDetections';
4-
import { describeWithNets, expectAllTensorsReleased } from '../../utils';
4+
import { describeWithBackend, describeWithNets } from '../../utils';
55
import { expectedSsdBoxes } from './expectedBoxes';
66

7-
describe('ssdMobilenetv1.locateFaces', () => {
7+
describeWithBackend('ssdMobilenetv1.locateFaces', () => {
88

99
let imgEl: HTMLImageElement
1010

test/tests/ssdMobilenetv1/ssdMobilenetv1.locateFaces.uncompressed.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import * as faceapi from '../../../src';
22
import { loadImage } from '../../env';
33
import { expectFaceDetections } from '../../expectFaceDetections';
4-
import { describeWithNets, expectAllTensorsReleased } from '../../utils';
4+
import { describeWithBackend, describeWithNets } from '../../utils';
55
import { expectedSsdBoxes } from './expectedBoxes';
66

7-
describe('ssdMobilenetv1.locateFaces, uncompressed', () => {
7+
describeWithBackend('ssdMobilenetv1.locateFaces, uncompressed', () => {
88

99
let imgEl: HTMLImageElement
1010

test/tests/ssdMobilenetv1/ssdMobilenetv1.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import * as faceapi from '../../../src';
2-
import { describeWithNets, expectAllTensorsReleased, assembleExpectedFullFaceDescriptions, ExpectedFullFaceDescription } from '../../utils';
3-
import { fetchImage, SsdMobilenetv1Options } from '../../../src';
2+
import { describeWithNets, expectAllTensorsReleased, assembleExpectedFullFaceDescriptions, ExpectedFullFaceDescription, describeWithBackend } from '../../utils';
3+
import { SsdMobilenetv1Options } from '../../../src';
44
import { expectFaceDetections } from '../../expectFaceDetections';
55
import { expectFullFaceDescriptions } from '../../expectFullFaceDescriptions';
66
import { expectFaceDetectionsWithLandmarks } from '../../expectFaceDetectionsWithLandmarks';
77
import { expectedSsdBoxes } from './expectedBoxes';
88
import { loadImage } from '../../env';
99

10-
describe('ssdMobilenetv1', () => {
10+
describeWithBackend('ssdMobilenetv1', () => {
1111

1212
let imgEl: HTMLImageElement
1313
let expectedFullFaceDescriptions: ExpectedFullFaceDescription[]
@@ -45,7 +45,7 @@ describe('ssdMobilenetv1', () => {
4545
const deltas = {
4646
maxScoreDelta: 0.05,
4747
maxBoxDelta: 5,
48-
maxLandmarksDelta: 2
48+
maxLandmarksDelta: 3
4949
}
5050
expect(results.length).toEqual(6)
5151
expectFaceDetectionsWithLandmarks(results, expectedFullFaceDescriptions, expectedScores, deltas)
@@ -64,7 +64,7 @@ describe('ssdMobilenetv1', () => {
6464
const deltas = {
6565
maxScoreDelta: 0.05,
6666
maxBoxDelta: 5,
67-
maxLandmarksDelta: 2,
67+
maxLandmarksDelta: 3,
6868
maxDescriptorDelta: 0.2
6969
}
7070
expect(results.length).toEqual(6)
@@ -84,7 +84,7 @@ describe('ssdMobilenetv1', () => {
8484
const deltas = {
8585
maxScoreDelta: 0.05,
8686
maxBoxDelta: 5,
87-
maxLandmarksDelta: 2,
87+
maxLandmarksDelta: 3,
8888
maxDescriptorDelta: 0.2
8989
}
9090

test/tests/tinyFaceDetector/tinyFaceDetector.locateFaces.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import * as faceapi from '../../../src';
22
import { loadImage } from '../../env';
33
import { expectFaceDetections } from '../../expectFaceDetections';
4-
import { describeWithNets, expectAllTensorsReleased } from '../../utils';
4+
import { describeWithBackend, describeWithNets } from '../../utils';
55
import { expectedTinyFaceDetectorBoxes } from './expectedBoxes';
66

7-
describe('tinyFaceDetector.locateFaces', () => {
7+
describeWithBackend('tinyFaceDetector.locateFaces', () => {
88

99
let imgEl: HTMLImageElement
1010

test/tests/tinyFaceDetector/tinyFaceDetector.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as faceapi from '../../../src';
2-
import { describeWithNets, expectAllTensorsReleased, assembleExpectedFullFaceDescriptions, ExpectedFullFaceDescription } from '../../utils';
2+
import { describeWithNets, expectAllTensorsReleased, assembleExpectedFullFaceDescriptions, ExpectedFullFaceDescription, describeWithBackend } from '../../utils';
33
import { TinyFaceDetectorOptions } from '../../../src';
44
import { expectFaceDetections } from '../../expectFaceDetections';
55
import { expectFullFaceDescriptions } from '../../expectFullFaceDescriptions';
@@ -24,7 +24,7 @@ function expectFaceExpressions(results: WithFaceExpressions<{}>[]) {
2424
})
2525
}
2626

27-
describe('tinyFaceDetector', () => {
27+
describeWithBackend('tinyFaceDetector', () => {
2828

2929
let imgEl: HTMLImageElement
3030
let expectedFullFaceDescriptions: ExpectedFullFaceDescription[]

test/utils.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,35 @@ export type DescribeWithNetsOptions = {
132132
withTinyYolov2?: WithTinyYolov2Options
133133
}
134134

135+
const gpgpu = tf.ENV.backend['gpgpu']
136+
137+
export function describeWithBackend(description: string, specDefinitions: () => void) {
138+
139+
if (!(gpgpu instanceof tf.webgl.GPGPUContext)) {
140+
describe(description, specDefinitions)
141+
return
142+
}
143+
144+
const defaultBackendName = tf.getBackend()
145+
const newBackendName = 'testBackend'
146+
const backend = new tf.webgl.MathBackendWebGL(gpgpu)
147+
148+
describe(description, () => {
149+
beforeAll(() => {
150+
tf.ENV.registerBackend(newBackendName, () => backend)
151+
tf.setBackend(newBackendName)
152+
})
153+
154+
afterAll(() => {
155+
tf.setBackend(defaultBackendName)
156+
tf.ENV.removeBackend(newBackendName)
157+
backend.dispose()
158+
})
159+
160+
specDefinitions()
161+
})
162+
}
163+
135164
export function describeWithNets(
136165
description: string,
137166
options: DescribeWithNetsOptions,

0 commit comments

Comments
 (0)