1
+ <!DOCTYPE html>
2
+ < html >
3
+ < head >
4
+ < script src ="face-api.js "> </ script >
5
+ < script src ="commons.js "> </ script >
6
+ < link rel ="stylesheet " href ="styles.css ">
7
+ < link rel ="stylesheet " href ="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.css ">
8
+ < script type ="text/javascript " src ="https://code.jquery.com/jquery-2.1.1.min.js "> </ script >
9
+ < script src ="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js "> </ script >
10
+ </ head >
11
+ < body >
12
+ < div id ="navbar "> </ div >
13
+ < div class ="center-content page-container ">
14
+ < div class ="progress " id ="loader ">
15
+ < div class ="indeterminate "> </ div >
16
+ </ div >
17
+ < div style ="position: relative " class ="margin ">
18
+ < img id ="inputImg " src ="" style ="max-width: 800px; " />
19
+ < canvas id ="overlay " />
20
+ </ div >
21
+ < div class ="row side-by-side ">
22
+ < div id ="selectList "> </ div >
23
+ < div class ="row ">
24
+ < label for ="imgUrlInput "> Get image from URL:</ label >
25
+ < input id ="imgUrlInput " type ="text " class ="bold ">
26
+ </ div >
27
+ < button
28
+ class ="waves-effect waves-light btn "
29
+ onclick ="loadImageFromUrl() "
30
+ >
31
+ Ok
32
+ </ button >
33
+ </ div >
34
+ < div class ="row side-by-side ">
35
+ < div class ="row ">
36
+ < label for ="minConfidence "> Min Confidence:</ label >
37
+ < input disabled value ="0.7 " id ="minConfidence " type ="text " class ="bold ">
38
+ </ div >
39
+ < button
40
+ class ="waves-effect waves-light btn "
41
+ onclick ="onDecreaseThreshold() "
42
+ >
43
+ < i class ="material-icons left "> -</ i >
44
+ </ button >
45
+ < button
46
+ class ="waves-effect waves-light btn "
47
+ onclick ="onIncreaseThreshold() "
48
+ >
49
+ < i class ="material-icons left "> +</ i >
50
+ </ button >
51
+ </ div >
52
+ </ div >
53
+
54
+ < script >
55
+ let minFaceSize = 50 //20 //
56
+ let scaleFactor = 0.709 // 0.2
57
+ let maxNumScales = 10 // 0.2
58
+ let stage1Threshold = 0.6
59
+ let stage2Threshold = 0.7
60
+ let stage3Threshold = 0.7
61
+ let mtcnn
62
+
63
+ function onIncreaseThreshold ( ) {
64
+ minConfidence = Math . min ( faceapi . round ( minConfidence + 0.1 ) , 1.0 )
65
+ $ ( '#minConfidence' ) . val ( minConfidence )
66
+ updateResults ( )
67
+ }
68
+
69
+ function onDecreaseThreshold ( ) {
70
+ minConfidence = Math . max ( faceapi . round ( minConfidence - 0.1 ) , 0.1 )
71
+ $ ( '#minConfidence' ) . val ( minConfidence )
72
+ updateResults ( )
73
+ }
74
+
75
+ async function loadImageFromUrl ( url ) {
76
+ const img = await requestExternalImage ( $ ( '#imgUrlInput' ) . val ( ) )
77
+ $ ( '#inputImg' ) . get ( 0 ) . src = img . src
78
+ updateResults ( )
79
+ }
80
+
81
+ async function updateResults ( ) {
82
+ const inputImgEl = $ ( '#inputImg' ) . get ( 0 )
83
+ const { width, height } = inputImgEl
84
+ const canvas = $ ( '#overlay' ) . get ( 0 )
85
+ canvas . width = width
86
+ canvas . height = height
87
+
88
+ const scoreThresholds = [ stage1Threshold , stage2Threshold , stage3Threshold ]
89
+ const { results, stats } = await mtcnn . forwardWithStats ( inputImgEl , minFaceSize , scaleFactor , maxNumScales , scoreThresholds )
90
+
91
+ console . log ( stats )
92
+
93
+ if ( results ) {
94
+ const { faceDetection, faceLandmarks } = results
95
+ results . forEach ( ( { faceDetection, faceLandmarks } ) => {
96
+ faceapi . drawDetection ( 'overlay' , faceDetection . forSize ( width , height ) )
97
+ faceapi . drawLandmarks ( 'overlay' , faceLandmarks . forSize ( width , height ) , { lineWidth : 4 , color : 'red' } )
98
+ } )
99
+ }
100
+ }
101
+
102
+ async function onSelectionChanged ( uri ) {
103
+ const imgBuf = await fetchImage ( uri )
104
+ $ ( `#inputImg` ) . get ( 0 ) . src = ( await faceapi . bufferToImage ( imgBuf ) ) . src
105
+ updateResults ( )
106
+ }
107
+
108
+ async function run ( ) {
109
+ const weightsBuffer = await ( await fetch ( '/uncompressed/mtcnn_model.weights' ) ) . arrayBuffer ( )
110
+ mtcnn = faceapi . mtcnn ( new Float32Array ( weightsBuffer ) )
111
+ $ ( '#loader' ) . hide ( )
112
+ onSelectionChanged ( $ ( '#selectList select' ) . val ( ) )
113
+ }
114
+
115
+ $ ( document ) . ready ( function ( ) {
116
+ renderNavBar ( '#navbar' , 'mtcnn_face_detection' )
117
+ renderImageSelectList (
118
+ '#selectList' ,
119
+ async ( uri ) => {
120
+ await onSelectionChanged ( uri )
121
+ } ,
122
+ 'bbt1.jpg'
123
+ )
124
+ run ( )
125
+ } )
126
+ </ script >
127
+ </ body >
128
+ </ html >
0 commit comments