@@ -18,12 +18,10 @@ const imgElement = document.getElementById('feedElement');
1818imgElement . src = './images/test.jpg' ;
1919const camElement = document . getElementById ( 'feedMediaElement' ) ;
2020let modelName = '' ;
21- let modelId = '' ;
22- let layout = 'nhwc' ;
21+ let layout = '' ;
2322let dataType = 'float32' ;
24- let instanceType = modelName + layout ;
23+ let instanceType = '' ;
2524let rafReq ;
26- let isFirstTimeLoad = true ;
2725let inputType = 'image' ;
2826let netInstance = null ;
2927let labels = null ;
@@ -33,48 +31,39 @@ let buildTime = 0;
3331let computeTime = 0 ;
3432let inputOptions ;
3533let deviceType = '' ;
36- let lastdeviceType = '' ;
37- let backend = '' ;
38- let lastBackend = '' ;
3934let stopRender = true ;
4035let isRendering = false ;
4136const disabledSelectors = [ '#tabs > li' , '.btn' ] ;
4237const modelIds = [
38+ 'efficientnet' ,
4339 'mobilenet' ,
44- 'squeezenet' ,
45- 'resnet50v2' ,
4640 'resnet50v1' ,
47- 'efficientnet' ,
41+ 'resnet50v2' ,
42+ 'squeezenet' ,
4843] ;
4944const modelList = {
50- 'cpu ' : {
45+ 'nhwc ' : {
5146 'float32' : [
5247 'mobilenet' ,
5348 'squeezenet' ,
5449 'resnet50v2' ,
5550 ] ,
56- 'uint8' : [
57- 'mobilenet' ,
58- ] ,
59- } ,
60- 'gpu' : {
61- 'float32' : [
51+ 'float16' : [
6252 'mobilenet' ,
6353 'squeezenet' ,
6454 'resnet50v2' ,
6555 ] ,
66- 'float16' : [
67- 'efficientnet' ,
56+ 'uint8' : [
6857 'mobilenet' ,
69- 'resnet50v1' ,
7058 ] ,
7159 } ,
72- 'npu' : {
73- 'float16' : [
74- 'efficientnet' ,
60+ 'nchw' : {
61+ 'float32' : [
7562 'mobilenet' ,
76- 'resnet50v1' ,
63+ 'squeezenet' ,
64+ 'resnet50v2' ,
7765 ] ,
66+ 'float16' : modelIds ,
7867 } ,
7968} ;
8069
@@ -87,58 +76,44 @@ async function fetchLabels(url) {
8776$ ( document ) . ready ( async ( ) => {
8877 $ ( '.icdisplay' ) . hide ( ) ;
8978 if ( await utils . isWebNN ( ) ) {
90- $ ( '#webnn_cpu ' ) . click ( ) ;
79+ $ ( '#cpu ' ) . click ( ) ;
9180 } else {
9281 console . log ( utils . webNNNotSupportMessage ( ) ) ;
9382 ui . addAlert ( utils . webNNNotSupportMessageHTML ( ) ) ;
9483 }
84+ layout = await utils . getDefaultLayout ( 'cpu' ) ;
9585} ) ;
9686
97- $ ( '#backendBtns .btn' ) . on ( 'change' , async ( e ) => {
87+ $ ( '#deviceTypeBtns .btn' ) . on ( 'change' , async ( e ) => {
9888 if ( inputType === 'camera' ) {
9989 await stopCamRender ( ) ;
10090 }
101- [ backend , deviceType ] = $ ( e . target ) . attr ( 'id' ) . split ( '_ ') ;
91+ deviceType = $ ( e . target ) . attr ( 'id' ) ;
10292 layout = await utils . getDefaultLayout ( deviceType ) ;
103- // Only show the supported models for each deviceType. Now fp16 nchw models
104- // are only supported on gpu/npu.
105- if ( deviceType == 'gpu' ) {
106- ui . handleBtnUI ( '#float16Label' , false ) ;
107- ui . handleBtnUI ( '#float32Label' , false ) ;
108- ui . handleBtnUI ( '#uint8Label' , true ) ;
109- $ ( '#float32' ) . click ( ) ;
110- utils . displayAvailableModels ( modelList , modelIds , deviceType , dataType ) ;
111- } else if ( deviceType == 'npu' ) {
112- ui . handleBtnUI ( '#float16Label' , false ) ;
93+ const showUint8 = layout === 'nhwc' ? true : false ;
94+ ui . handleBtnUI ( '#uint8Label' , ! showUint8 ) ;
95+ ui . handleBtnUI ( '#float16Label' , false ) ;
96+ // Only show the supported models for each deviceType.
97+ if ( deviceType == 'npu' ) {
11398 ui . handleBtnUI ( '#float32Label' , true ) ;
114- ui . handleBtnUI ( '#uint8Label' , true ) ;
11599 $ ( '#float16' ) . click ( ) ;
116- utils . displayAvailableModels ( modelList , modelIds , deviceType , 'float16' ) ;
117100 } else {
118- ui . handleBtnUI ( '#float16Label' , true ) ;
119101 ui . handleBtnUI ( '#float32Label' , false ) ;
120- ui . handleBtnUI ( '#uint8Label' , false ) ;
121102 $ ( '#float32' ) . click ( ) ;
122- utils . displayAvailableModels ( modelList , modelIds , deviceType , 'float32' ) ;
123103 }
124104
105+ utils . displayAvailableModels ( modelList , modelIds , layout , dataType ) ;
125106 // Uncheck selected model
126- if ( modelId != '' ) {
127- $ ( `#${ modelId } ` ) . parent ( ) . removeClass ( 'active' ) ;
107+ if ( modelName != '' ) {
108+ $ ( `#${ modelName } ` ) . parent ( ) . removeClass ( 'active' ) ;
128109 }
129110} ) ;
130111
131112$ ( '#modelBtns .btn' ) . on ( 'change' , async ( e ) => {
132113 if ( inputType === 'camera' ) {
133114 await stopCamRender ( ) ;
134115 }
135- modelId = $ ( e . target ) . attr ( 'id' ) ;
136- modelName = modelId ;
137- if ( dataType == 'float16' ) {
138- modelName += 'fp16' ;
139- } else if ( dataType == 'uint8' ) {
140- modelName += 'uint8' ;
141- }
116+ modelName = $ ( e . target ) . attr ( 'id' ) ;
142117
143118 await main ( ) ;
144119} ) ;
@@ -152,11 +127,15 @@ $('#modelBtns .btn').on('change', async (e) => {
152127// });
153128
154129$ ( '#dataTypeBtns .btn' ) . on ( 'change' , async ( e ) => {
130+ if ( inputType === 'camera' ) {
131+ await stopCamRender ( ) ;
132+ }
133+
155134 dataType = $ ( e . target ) . attr ( 'id' ) ;
156- utils . displayAvailableModels ( modelList , modelIds , deviceType , dataType ) ;
135+ utils . displayAvailableModels ( modelList , modelIds , layout , dataType ) ;
157136 // Uncheck selected model
158- if ( modelId != '' ) {
159- $ ( `#${ modelId } ` ) . parent ( ) . removeClass ( 'active' ) ;
137+ if ( modelName != '' ) {
138+ $ ( `#${ modelName } ` ) . parent ( ) . removeClass ( 'active' ) ;
160139 }
161140} ) ;
162141
@@ -299,50 +278,64 @@ function showPerfResult(medianComputeTime = undefined) {
299278 }
300279}
301280
302- function constructNetObject ( type ) {
303- const netObject = {
304- 'mobilenetfp16nchw' : new MobileNetV2Nchw ( 'float16' ) ,
305- 'resnet50v1fp16nchw' : new ResNet50V1FP16Nchw ( ) ,
306- 'efficientnetfp16nchw' : new EfficientNetFP16Nchw ( ) ,
307- 'mobilenetnchw' : new MobileNetV2Nchw ( ) ,
308- 'mobilenetnhwc' : new MobileNetV2Nhwc ( ) ,
309- 'mobilenetuint8nhwc' : new MobileNetV2Uint8Nhwc ( ) ,
310- 'squeezenetnchw' : new SqueezeNetNchw ( ) ,
311- 'squeezenetnhwc' : new SqueezeNetNhwc ( ) ,
312- 'resnet50v2nchw' : new ResNet50V2Nchw ( ) ,
313- 'resnet50v2nhwc' : new ResNet50V2Nhwc ( ) ,
314- } ;
281+ function constructNetObject ( modelName , layout , dataType ) {
282+ switch ( modelName ) {
283+ case 'efficientnet' :
284+ if ( layout == 'nchw' && dataType == 'float16' ) {
285+ return new EfficientNetFP16Nchw ( ) ;
286+ }
287+ break ;
288+ case 'mobilenet' :
289+ if ( layout == 'nhwc' && dataType == 'uint8' ) {
290+ return new MobileNetV2Uint8Nhwc ( ) ;
291+ } else if ( dataType != 'uint8' ) {
292+ return layout == 'nhwc' ?
293+ new MobileNetV2Nhwc ( dataType ) : new MobileNetV2Nchw ( dataType ) ;
294+ }
295+ break ;
296+ case 'resnet50v1' :
297+ if ( layout == 'nchw' && dataType == 'float16' ) {
298+ return new ResNet50V1FP16Nchw ( ) ;
299+ }
300+ break ;
301+ case 'resnet50v2' :
302+ if ( dataType != 'uint8' ) {
303+ return layout == 'nhwc' ?
304+ new ResNet50V2Nhwc ( dataType ) : new ResNet50V2Nchw ( dataType ) ;
305+ }
306+ break ;
307+ case 'squeezenet' :
308+ if ( dataType != 'uint8' ) {
309+ return layout == 'nhwc' ?
310+ new SqueezeNetNhwc ( ) : new SqueezeNetNchw ( ) ;
311+ }
312+ break ;
313+ }
315314
316- return netObject [ type ] ;
315+ throw new Error ( `Unknown model, name: ${ modelName } , layout: ${ layout } , ` +
316+ `dataType: ${ dataType } ` ) ;
317317}
318318
319319async function main ( ) {
320320 try {
321321 if ( modelName === '' ) return ;
322322 ui . handleClick ( disabledSelectors , true ) ;
323- if ( isFirstTimeLoad ) $ ( '#hint' ) . hide ( ) ;
323+ if ( instanceType == '' ) $ ( '#hint' ) . hide ( ) ;
324324 let start ;
325325 const [ numRuns , powerPreference ] = utils . getUrlParams ( ) ;
326326
327327 // Only do load() and build() when model first time loads,
328- // there's new model choosed, backend changed or device changed
329- if ( isFirstTimeLoad || instanceType !== modelName + layout ||
330- lastdeviceType != deviceType || lastBackend != backend ) {
331- if ( lastdeviceType != deviceType || lastBackend != backend ) {
332- // Set backend and device
333- lastdeviceType = lastdeviceType != deviceType ?
334- deviceType : lastdeviceType ;
335- lastBackend = lastBackend != backend ? backend : lastBackend ;
336- }
337- instanceType = modelName + layout ;
338- netInstance = constructNetObject ( instanceType ) ;
328+ // there's new model choosed
329+ if ( instanceType !== modelName + dataType + layout + deviceType ) {
330+ instanceType = modelName + dataType + layout + deviceType ;
331+ netInstance = constructNetObject ( modelName , layout , dataType ) ;
339332 inputOptions = netInstance . inputOptions ;
340333 labels = await fetchLabels ( inputOptions . labelUrl ) ;
341- isFirstTimeLoad = false ;
342- console . log ( `- Model name : ${ modelName } , Model layout: ${ layout } -` ) ;
334+ console . log (
335+ `- Model: ${ modelName } - ${ layout } - ${ dataType } - ${ deviceType } ` ) ;
343336 // UI shows model loading progress
344337 await ui . showProgressComponent ( 'current' , 'pending' , 'pending' ) ;
345- console . log ( '- Loading weights... ' ) ;
338+ console . log ( '- Loading weights...' ) ;
346339 const contextOptions = { deviceType} ;
347340 if ( powerPreference ) {
348341 contextOptions [ 'powerPreference' ] = powerPreference ;
0 commit comments