Skip to content

Commit 0f9b979

Browse files
committed
Update Detector classes to run their tfjs detectors off of a single static Detector.currentFrame instance variable
1 parent 754c765 commit 0f9b979

File tree

6 files changed

+40
-6
lines changed

6 files changed

+40
-6
lines changed

js/detector/body_detector.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export class BodyDetector extends Detector {
2929
BodyDetector.instance = this;
3030

3131
this.mesh = mesh;
32-
this.inputElement = document.getElementById("jellron-video-canvas");
3332

3433
poseDetection.createDetector(
3534
poseDetection.SupportedModels.MoveNet,
@@ -56,7 +55,7 @@ export class BodyDetector extends Detector {
5655

5756
let rawBodies = [];
5857
try {
59-
rawBodies = await this.detector.estimatePoses(this.inputElement);
58+
rawBodies = await this.detector.estimatePoses(Detector.getCurrentFrame());
6059
} catch (e) {
6160
/*
6261
* Depending on the state of the video element, this can throw a "Requested texture size [0x0] is

js/detector/detector.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import {RunnableInterval} from "../runnable_interval.js";
2+
import {validateInstanceOf} from "../utility/validation.js";
23

34
export class Detector extends RunnableInterval {
5+
/** Current frame to be processed. */
6+
static currentFrame = null;
7+
48
/** Creates a new Detector. */
59
constructor() {
610
super();
@@ -25,4 +29,23 @@ export class Detector extends RunnableInterval {
2529
isReady() {
2630
return this.detector != null;
2731
}
32+
33+
/**
34+
* Retrieves the current frame.
35+
*
36+
* @returns {Tensor} Current frame.
37+
*/
38+
static getCurrentFrame() {
39+
return Detector.currentFrame;
40+
}
41+
42+
/**
43+
* Sets the current frame.
44+
*
45+
* @param frame New current frame.
46+
*/
47+
static setCurrentFrame(frame) {
48+
Detector.currentFrame?.dispose();
49+
Detector.currentFrame = frame;
50+
}
2851
}

js/detector/face_detector.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export class FaceDetector extends Detector {
2929
FaceDetector.instance = this;
3030

3131
this.mesh = mesh;
32-
this.inputElement = document.getElementById("jellron-video-canvas");
3332

3433
faceLandmarksDetection.createDetector(
3534
faceLandmarksDetection.SupportedModels.MediaPipeFaceMesh,
@@ -56,7 +55,7 @@ export class FaceDetector extends Detector {
5655

5756
let rawFaces = [];
5857
try {
59-
rawFaces = await this.detector.estimateFaces(this.inputElement);
58+
rawFaces = await this.detector.estimateFaces(Detector.getCurrentFrame());
6059
} catch (e) {
6160
/*
6261
* Depending on the state of the video element, this can throw a "Requested texture size [0x0] is

js/detector/hand_detector.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export class HandDetector extends Detector {
2929
HandDetector.instance = this;
3030

3131
this.mesh = mesh;
32-
this.inputElement = document.getElementById("jellron-video-canvas");
3332

3433
handPoseDetection.createDetector(
3534
handPoseDetection.SupportedModels.MediaPipeHands,
@@ -56,7 +55,7 @@ export class HandDetector extends Detector {
5655

5756
let rawHands = [];
5857
try {
59-
rawHands = await this.detector.estimateHands(this.inputElement);
58+
rawHands = await this.detector.estimateHands(Detector.getCurrentFrame());
6059
} catch (e) {
6160
/*
6261
* Depending on the state of the video element, this can throw a "Requested texture size [0x0] is

js/renderer/keypoint_renderer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {Detector} from "../detector/detector.js";
12
import {Keypoint} from "../keypoint.js";
23
import {Mesh} from "../mesh.js";
34
import {Renderer} from "./renderer.js";
@@ -37,6 +38,7 @@ export class KeypointRenderer extends Renderer {
3738
}
3839

3940
const scene = new Scene();
41+
const videoCanvas = document.getElementById("jellron-video-canvas");
4042

4143
this.dispatchEvent(new CustomEvent("started"));
4244
this.intervalId = setInterval(async () => {
@@ -110,6 +112,9 @@ export class KeypointRenderer extends Renderer {
110112

111113
this.glContext.render(scene, this.getCamera());
112114

115+
// We set this here because the KeypointRenderer runs at a lower framerate than VideoRenderer.
116+
Detector.setCurrentFrame(tf.browser.fromPixels(videoCanvas));
117+
113118
this.lastRuntime = performance.now() - currentTime;
114119
this.dispatchEvent(new CustomEvent("rendered", {detail: {runtime: this.lastRuntime}}));
115120
}, 1000 / KeypointRenderer.fps);

js/renderer/renderer.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ export class Renderer extends RunnableInterval {
5252
return camera;
5353
}
5454

55+
/**
56+
* Retrieves the canvas to use for rendering.
57+
*
58+
* @returns {HTMLCanvasElement} Canvas to use for rendering.
59+
*/
60+
getCanvas() {
61+
return this.canvas;
62+
}
63+
5564
/**
5665
* Sets the canvas to use for rendering.
5766
*

0 commit comments

Comments
 (0)