@@ -10,52 +10,60 @@ PoseNet
10
10
import * as tf from '@tensorflow/tfjs' ;
11
11
import * as posenet from '@tensorflow-models/posenet' ;
12
12
13
- import ImageAndVideo from './../ImageAndVideo' ;
14
-
15
13
const DEFAULTS = {
16
- imageScaleFactor : 0.5 ,
14
+ imageScaleFactor : 0.3 ,
17
15
outputStride : 16 ,
18
16
flipHorizontal : false ,
19
17
minConfidence : 0.5 ,
20
18
maxPoseDetections : 5 ,
21
19
scoreThreshold : 0.5 ,
22
20
nmsRadius : 20 ,
23
21
detectionType : 'single' ,
22
+ multiplier : 1.01 ,
24
23
} ;
25
24
26
- class PoseNet extends ImageAndVideo {
27
- constructor ( videoOrCallback , optionsOrCallback , cb = ( ) => { } ) {
28
- super ( videoOrCallback , 315 ) ;
25
+ class PoseNet {
26
+ constructor ( videoOrOptionsOrCallback , optionsOrCallback , cb = ( ) => { } ) {
29
27
let options = { } ;
30
28
let callback = cb ;
31
- this . detectionType = DEFAULTS . detectionType ;
29
+ let detectionType = null ;
30
+
31
+ if ( videoOrOptionsOrCallback instanceof HTMLVideoElement ) {
32
+ this . video = videoOrOptionsOrCallback ;
33
+ } else if ( typeof videoOrOptionsOrCallback === 'object' && videoOrOptionsOrCallback . elt instanceof HTMLVideoElement ) {
34
+ this . video = videoOrOptionsOrCallback . elt ; // Handle a p5.js video element
35
+ } else if ( typeof videoOrOptionsOrCallback === 'object' ) {
36
+ options = videoOrOptionsOrCallback ;
37
+ } else if ( typeof videoOrOptionsOrCallback === 'function' ) {
38
+ callback = videoOrOptionsOrCallback ;
39
+ }
32
40
33
- if ( typeof videoOrCallback === 'function' ) {
34
- callback = videoOrCallback ;
35
- } else if ( typeof optionsOrCallback === 'object' ) {
41
+ if ( typeof optionsOrCallback === 'object' ) {
36
42
options = optionsOrCallback ;
37
- this . detectionType = options . detectionType || DEFAULTS . detectionType ;
38
43
} else if ( typeof optionsOrCallback === 'function' ) {
39
44
callback = optionsOrCallback ;
40
- } else if ( optionsOrCallback === 'multiple ' ) {
41
- this . detectionType = optionsOrCallback ;
45
+ } else if ( typeof optionsOrCallback === 'string ' ) {
46
+ detectionType = optionsOrCallback ;
42
47
}
43
48
49
+ this . detectionType = detectionType || DEFAULTS . detectionType ;
44
50
this . imageScaleFactor = options . imageScaleFactor || DEFAULTS . imageScaleFactor ;
45
51
this . outputStride = options . outputStride || DEFAULTS . outputStride ;
46
52
this . flipHorizontal = options . flipHorizontal || DEFAULTS . flipHorizontal ;
47
53
this . minConfidence = options . minConfidence || DEFAULTS . minConfidence ;
54
+ this . multiplier = options . multiplier || DEFAULTS . multiplier ;
48
55
49
- // TODO: Specify model
50
- posenet . load ( )
56
+ posenet . load ( this . multiplier )
51
57
. then ( ( net ) => {
52
58
this . net = net ;
53
- if ( this . video && callback ) {
54
- if ( this . detectionType === 'single' ) {
55
- this . singlePose ( callback ) ;
56
- } else if ( this . detectionType === 'multiple' ) {
57
- this . multiPose ( callback ) ;
58
- }
59
+ if ( this . video ) {
60
+ ( this . video . onplay = ( ) => {
61
+ if ( this . detectionType === 'single' ) {
62
+ this . singlePose ( callback ) ;
63
+ } else if ( this . detectionType === 'multiple' ) {
64
+ this . multiPose ( callback ) ;
65
+ }
66
+ } ) ( ) ;
59
67
}
60
68
} )
61
69
. catch ( ( err ) => { console . error ( `Error loading the model: ${ err } ` ) ; } ) ;
@@ -68,11 +76,12 @@ class PoseNet extends ImageAndVideo {
68
76
/* eslint max-len: ["error", { "code": 180 }] */
69
77
singlePose ( inputOrCallback , cb = ( ) => { } ) {
70
78
let input ;
71
- let callback ;
79
+ let callback = cb ;
72
80
73
81
if ( inputOrCallback instanceof HTMLImageElement || inputOrCallback instanceof HTMLVideoElement ) {
74
82
input = inputOrCallback ;
75
- callback = cb ;
83
+ } else if ( typeof inputOrCallback === 'object' && ( inputOrCallback . elt instanceof HTMLImageElement || inputOrCallback . elt instanceof HTMLVideoElement ) ) {
84
+ input = inputOrCallback . elt ; // Handle p5.js image and video
76
85
} else if ( typeof inputOrCallback === 'function' && this . video ) {
77
86
input = this . video ;
78
87
callback = inputOrCallback ;
@@ -87,11 +96,12 @@ class PoseNet extends ImageAndVideo {
87
96
88
97
multiPose ( inputOrCallback , cb = ( ) => { } ) {
89
98
let input ;
90
- let callback ;
99
+ let callback = cb ;
91
100
92
101
if ( inputOrCallback instanceof HTMLImageElement || inputOrCallback instanceof HTMLVideoElement ) {
93
102
input = inputOrCallback ;
94
- callback = cb ;
103
+ } else if ( typeof inputOrCallback === 'object' && ( inputOrCallback . elt instanceof HTMLImageElement || inputOrCallback . elt instanceof HTMLVideoElement ) ) {
104
+ input = inputOrCallback . elt ; // Handle p5.js image and video
95
105
} else if ( typeof inputOrCallback === 'function' && this . video ) {
96
106
input = this . video ;
97
107
callback = inputOrCallback ;
0 commit comments