diff --git a/TODO.md b/TODO.md index 89381e5a..5c1826b6 100644 --- a/TODO.md +++ b/TODO.md @@ -11,7 +11,7 @@ N/A ## In Progress - Switch to TypeScript 4.3 -- Add hints to Demo app +- Implement segmentation model ## Known Issues diff --git a/demo/index-worker.js b/demo/index-worker.js index 231abc85..f4cbb499 100644 --- a/demo/index-worker.js +++ b/demo/index-worker.js @@ -27,9 +27,18 @@ onmessage = async (msg) => { result.error = err.message; log('worker thread error:', err.message); } - // must strip canvas from return value as it cannot be transfered from worker thread - if (result.canvas) result.canvas = null; - // @ts-ignore tslint wrong type matching for worker - postMessage({ result }); + + if (result.canvas) { // convert canvas to imageData and send it by reference + const ctx = result.canvas.getContext('2d'); + const img = ctx?.getImageData(0, 0, result.canvas.width, result.canvas.height); + result.canvas = null; // must strip original canvas from return value as it cannot be transfered from worker thread + // @ts-ignore tslint wrong type matching for worker + if (img) postMessage({ result, image: img.data.buffer, width: msg.data.width, height: msg.data.height }, [img?.data.buffer]); + // @ts-ignore tslint wrong type matching for worker + else postMessage({ result }); + } else { + // @ts-ignore tslint wrong type matching for worker + postMessage({ result }); + } busy = false; }; diff --git a/demo/index.js b/demo/index.js index 5ba17d0d..0f3e8b7a 100644 --- a/demo/index.js +++ b/demo/index.js @@ -38,19 +38,21 @@ const userConfig = { enabled: false, flip: false, }, - face: { enabled: true, + face: { enabled: false, detector: { return: true }, mesh: { enabled: true }, iris: { enabled: false }, description: { enabled: false }, emotion: { enabled: false }, }, - hand: { enabled: false }, - // body: { enabled: true, modelPath: 'posenet.json' }, - // body: { enabled: true, modelPath: 'blazepose.json' }, - body: { enabled: false }, object: { enabled: false }, gesture: { enabled: true }, + hand: { enabled: false }, + body: { enabled: false }, + // body: { enabled: true, modelPath: 'posenet.json' }, + // body: { enabled: true, modelPath: 'blazepose.json' }, + // segmentation: { enabled: true, modelPath: 'meet.json' }, + // segmentation: { enabled: true, modelPath: 'selfie.json' }, */ }; @@ -267,9 +269,11 @@ async function drawResults(input) { if (ui.buffered) { ui.drawThread = requestAnimationFrame(() => drawResults(input)); } else { - log('stopping buffered refresh'); - if (ui.drawThread) cancelAnimationFrame(ui.drawThread); - ui.drawThread = null; + if (ui.drawThread) { + log('stopping buffered refresh'); + cancelAnimationFrame(ui.drawThread); + ui.drawThread = null; + } } } @@ -350,6 +354,8 @@ async function setupCamera() { video.onloadeddata = () => { if (settings.width > settings.height) canvas.style.width = '100vw'; else canvas.style.height = '100vh'; + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; ui.menuWidth.input.setAttribute('value', video.videoWidth); ui.menuHeight.input.setAttribute('value', video.videoHeight); if (live) video.play(); @@ -400,6 +406,16 @@ function webWorker(input, image, canvas, timestamp) { } if (document.getElementById('gl-bench')) document.getElementById('gl-bench').style.display = ui.bench ? 'block' : 'none'; lastDetectedResult = msg.data.result; + + if (msg.data.image) { + lastDetectedResult.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(msg.data.width, msg.data.height) : document.createElement('canvas'); + lastDetectedResult.canvas.width = msg.data.width; + lastDetectedResult.canvas.height = msg.data.height; + const ctx = lastDetectedResult.canvas.getContext('2d'); + const imageData = new ImageData(new Uint8ClampedArray(msg.data.image), msg.data.width, msg.data.height); + ctx.putImageData(imageData, 0, 0); + } + ui.framesDetect++; if (!ui.drawThread) drawResults(input); // eslint-disable-next-line no-use-before-define diff --git a/models/selfie.bin b/models/selfie.bin new file mode 100644 index 00000000..517c9e09 Binary files /dev/null and b/models/selfie.bin differ diff --git a/models/selfie.json b/models/selfie.json new file mode 100644 index 00000000..14b83960 --- /dev/null +++ b/models/selfie.json @@ -0,0 +1,395 @@ +{ + "format": "graph-model", + "generatedBy": "https://github.com/PINTO0309/PINTO_model_zoo/tree/main/109_Selfie_Segmentation", + "convertedBy": "https://github.com/vladmandic", + "signature": + { + "inputs": + { + "input_1:0": {"name":"input_1:0","dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"256"},{"size":"256"},{"size":"3"}]}} + }, + "outputs": + { + "activation_10:0": {"name":"activation_10:0","dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"256"},{"size":"256"},{"size":"1"}]}} + } + }, + "modelTopology": + { + "node": + [ + {"name":"segment/input_sizes","op":"Const","attr":{"dtype":{"type":"DT_INT32"},"value":{"tensor":{"dtype":"DT_INT32","tensorShape":{"dim":[{"size":"4"}]}}}}}, + {"name":"segment/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"2"},{"size":"2"},{"size":"1"},{"size":"16"}]}}}}}, + {"name":"Conv2D_41/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_40_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_42/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}}}}, + {"name":"conv2d_41_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_37/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_36_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_38/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_37_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_33/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_32_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_34/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_33_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_30/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"128"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_29_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_21/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"mul_19/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_26/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"96"}]}}}}}, + {"name":"conv2d_25_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}}}}, + {"name":"add_9/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"depthwise_7/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"5"},{"size":"5"},{"size":"96"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_7/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"add_10/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_27/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"96"},{"size":"24"}]}}}}}, + {"name":"conv2d_26_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}}}}, + {"name":"Conv2D_28/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"96"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_27_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_29/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"96"},{"size":"32"}]}}}}}, + {"name":"conv2d_28_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_17/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"mul_15/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D_22/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"96"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_21_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}}}}, + {"name":"add_7/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"depthwise_6/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"5"},{"size":"5"},{"size":"96"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_6/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}}}}, + {"name":"add_8/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D_23/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"96"},{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_22_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}}}}, + {"name":"Conv2D_24/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"96"}]}}}}}, + {"name":"conv2d_23_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_25/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"96"},{"size":"32"}]}}}}}, + {"name":"conv2d_24_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_13/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_11/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_18/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"128"}]}}}}}, + {"name":"conv2d_17_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}}}}, + {"name":"add_5/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_5/filter_in","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"5"},{"size":"5"},{"size":"128"},{"size":"1"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_conv2d_5/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}}}}, + {"name":"add_6/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D_19/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"128"},{"size":"32"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_18_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}}}}, + {"name":"Conv2D_20/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"128"}]}}}}}, + {"name":"conv2d_19_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_21/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"128"},{"size":"32"}]}}}}}, + {"name":"conv2d_20_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}}}}, + {"name":"mul_9/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_7/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D_14/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"128"}]}}}}}, + {"name":"conv2d_13_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"add_3/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_4/filter_in","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"5"},{"size":"5"},{"size":"128"},{"size":"1"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_conv2d_4/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}}}}, + {"name":"add_4/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D_15/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"128"},{"size":"32"}]}}}}}, + {"name":"conv2d_14_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}}}}, + {"name":"Conv2D_16/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"128"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_15_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_17/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"128"},{"size":"32"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_16_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_5/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"mul_3/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"conv2d_8_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}}}}, + {"name":"Conv2D_8/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"88"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_7_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"88"}]}}}}}, + {"name":"depthwise_2/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"88"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_2/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"88"}]}}}}}, + {"name":"Conv2D_9/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"88"},{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"mul_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"3"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"add/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"Conv2D_2/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_1_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"depthwise/filter_in","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"16"},{"size":"1"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_conv2d/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_3/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"8"}]}}}}}, + {"name":"conv2d_2_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"8"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_4/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"8"},{"size":"16"}]}}}}}, + {"name":"conv2d_3_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_5/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_4_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_6/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"72"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_5_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"72"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_1/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"72"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"72"}]}}}}}, + {"name":"Conv2D_7/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"72"},{"size":"24"}]}}}}}, + {"name":"conv2d_6_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}}}}, + {"name":"Conv2D_10/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"96"}]}}}}}, + {"name":"conv2d_9_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}}}}, + {"name":"add_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}}}}, + {"name":"depthwise_3/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"5"},{"size":"5"},{"size":"96"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_3/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}}}}, + {"name":"add_2/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_11/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"96"},{"size":"24"}]}}}}}, + {"name":"conv2d_10_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_12/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"96"}]}}}}}, + {"name":"conv2d_11_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"96"}]}}}}}, + {"name":"Conv2D_13/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"96"},{"size":"32"}]}}}}}, + {"name":"conv2d_12_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"32"}]}}}}}, + {"name":"Conv2D_31/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"32"},{"size":"128"}]}}}}}, + {"name":"conv2d_30_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"128"}]}}}}}, + {"name":"up_sampling2d_lambda/resize/size","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_INT32","tensorShape":{"dim":[{"size":"2"}]}}},"dtype":{"type":"DT_INT32"}}}, + {"name":"Conv2D_32/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"128"},{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_31_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}}}}, + {"name":"Conv2D_35/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"24"}]}}}}}, + {"name":"conv2d_34_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}}}}, + {"name":"depthwise_8/filter_in","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"24"},{"size":"1"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_conv2d_8/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"24"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"up_sampling2d_1_lambda/resize/size","op":"Const","attr":{"dtype":{"type":"DT_INT32"},"value":{"tensor":{"dtype":"DT_INT32","tensorShape":{"dim":[{"size":"2"}]}}}}}, + {"name":"Conv2D_36/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"24"},{"size":"16"}]}}}}}, + {"name":"conv2d_35_1/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"Conv2D_39/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}}}}, + {"name":"conv2d_38_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_9/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"16"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_9/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"up_sampling2d_2_lambda/resize/size","op":"Const","attr":{"dtype":{"type":"DT_INT32"},"value":{"tensor":{"dtype":"DT_INT32","tensorShape":{"dim":[{"size":"2"}]}}}}}, + {"name":"Conv2D_40/filter","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}}}}, + {"name":"conv2d_39_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_43/filter","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"},{"size":"1"},{"size":"16"},{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_42_1/y","op":"Const","attr":{"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}},"dtype":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_10/filter_in","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"3"},{"size":"3"},{"size":"16"},{"size":"1"}]}}}}}, + {"name":"depthwise_conv2d_10/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"16"}]}}}}}, + {"name":"segment_add/y","op":"Const","attr":{"dtype":{"type":"DT_FLOAT"},"value":{"tensor":{"dtype":"DT_FLOAT","tensorShape":{"dim":[{"size":"1"}]}}}}}, + {"name":"input_1","op":"Placeholder","attr":{"dtype":{"type":"DT_FLOAT"},"shape":{"shape":{"dim":[{"size":"1"},{"size":"256"},{"size":"256"},{"size":"3"}]}}}}, + {"name":"Conv2D","op":"Conv2D","input":["input_1","Conv2D/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"dilations":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"padding":{"s":"U0FNRQ=="},"strides":{"list":{"i":["1","2","2","1"]}},"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true}}}, + {"name":"conv2d_1","op":"Add","input":["Conv2D","conv2d_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul","op":"Mul","input":["mul_1/y","conv2d_1"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"add","op":"AddV2","input":["conv2d_1","add/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6","op":"Relu6","input":["add"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_1","op":"Mul","input":["mul","Relu6"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_2","op":"Conv2D","input":["mul_1","Conv2D_2/filter"],"device":"/device:CPU:0","attr":{"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"padding":{"s":"U0FNRQ=="}}}, + {"name":"conv2d_1_1","op":"Add","input":["Conv2D_2","conv2d_1_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu","op":"Relu","input":["conv2d_1_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise","op":"DepthwiseConv2dNative","input":["re_lu","depthwise/filter_in"],"attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","2","2","1"]}},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"explicit_paddings":{"list":{}}}}, + {"name":"depthwise_conv2d","op":"Add","input":["depthwise","depthwise_conv2d/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_1","op":"Relu","input":["depthwise_conv2d"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_avgpool/AvgPool","op":"AvgPool","input":["re_lu_1"],"attr":{"ksize":{"list":{"i":["1","64","64","1"]}},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","64","64","1"]}},"padding":{"s":"VkFMSUQ="}}}, + {"name":"Conv2D_3","op":"Conv2D","input":["average_pooling2d_avgpool/AvgPool","Conv2D_3/filter"],"device":"/device:CPU:0","attr":{"use_cudnn_on_gpu":{"b":true},"explicit_paddings":{"list":{}},"strides":{"list":{"i":["1","1","1","1"]}},"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"data_format":{"s":"TkhXQw=="},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_2_1","op":"Add","input":["Conv2D_3","conv2d_2_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_2","op":"Relu","input":["conv2d_2_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_4","op":"Conv2D","input":["re_lu_2","Conv2D_4/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_3_1","op":"Add","input":["Conv2D_4","conv2d_3_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation","op":"Sigmoid","input":["conv2d_3_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply","op":"Mul","input":["re_lu_1","activation"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_5","op":"Conv2D","input":["multiply","Conv2D_5/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="},"use_cudnn_on_gpu":{"b":true}}}, + {"name":"conv2d_4_1","op":"Add","input":["Conv2D_5","conv2d_4_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_6","op":"Conv2D","input":["conv2d_4_1","Conv2D_6/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_5_1","op":"Add","input":["Conv2D_6","conv2d_5_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_3","op":"Relu","input":["conv2d_5_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_1","op":"DepthwiseConv2dNative","input":["re_lu_3","depthwise_1/filter_in"],"attr":{"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","2","2","1"]}},"padding":{"s":"U0FNRQ=="},"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="}}}, + {"name":"depthwise_conv2d_1","op":"Add","input":["depthwise_1","depthwise_conv2d_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_4","op":"Relu","input":["depthwise_conv2d_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_7","op":"Conv2D","input":["re_lu_4","Conv2D_7/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true}}}, + {"name":"conv2d_6_1","op":"Add","input":["Conv2D_7","conv2d_6_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_8","op":"Conv2D","input":["conv2d_6_1","Conv2D_8/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"padding":{"s":"U0FNRQ=="},"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_7_1","op":"Add","input":["Conv2D_8","conv2d_7_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_5","op":"Relu","input":["conv2d_7_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_2","op":"DepthwiseConv2dNative","input":["re_lu_5","depthwise_2/filter_in"],"attr":{"padding":{"s":"U0FNRQ=="},"strides":{"list":{"i":["1","1","1","1"]}},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="}}}, + {"name":"depthwise_conv2d_2","op":"Add","input":["depthwise_2","depthwise_conv2d_2/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_6","op":"Relu","input":["depthwise_conv2d_2"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_9","op":"Conv2D","input":["re_lu_6","Conv2D_9/filter"],"device":"/device:CPU:0","attr":{"use_cudnn_on_gpu":{"b":true},"padding":{"s":"U0FNRQ=="},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"strides":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="}}}, + {"name":"ArithmeticOptimizer/AddOpsRewrite_Leaf_1_add__xeno_compat__1","op":"AddN","input":["Conv2D_9","conv2d_6_1"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_AddOpsRewriteStage":{"b":true},"N":{"i":"2"}}}, + {"name":"ArithmeticOptimizer/AddOpsRewrite_add__xeno_compat__1","op":"AddV2","input":["conv2d_8_1/y","ArithmeticOptimizer/AddOpsRewrite_Leaf_1_add__xeno_compat__1"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_AddOpsRewriteStage":{"b":true}}}, + {"name":"Conv2D_10","op":"Conv2D","input":["ArithmeticOptimizer/AddOpsRewrite_add__xeno_compat__1","Conv2D_10/filter"],"device":"/device:CPU:0","attr":{"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"dilations":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_9_1","op":"Add","input":["Conv2D_10","conv2d_9_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_2","op":"Mul","input":["mul_3/y","conv2d_9_1"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"add_1","op":"AddV2","input":["conv2d_9_1","add_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_1","op":"Relu6","input":["add_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_3","op":"Mul","input":["mul_2","Relu6_1"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"depthwise_3","op":"DepthwiseConv2dNative","input":["mul_3","depthwise_3/filter_in"],"attr":{"strides":{"list":{"i":["1","2","2","1"]}},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="}}}, + {"name":"depthwise_conv2d_3","op":"Add","input":["depthwise_3","depthwise_conv2d_3/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_4","op":"Mul","input":["mul_5/y","depthwise_conv2d_3"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"add_2","op":"AddV2","input":["depthwise_conv2d_3","add_2/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_2","op":"Relu6","input":["add_2"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_5","op":"Mul","input":["mul_4","Relu6_2"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_1_avgpool/AvgPool","op":"AvgPool","input":["mul_5"],"attr":{"padding":{"s":"VkFMSUQ="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","16","16","1"]}},"ksize":{"list":{"i":["1","16","16","1"]}}}}, + {"name":"Conv2D_11","op":"Conv2D","input":["average_pooling2d_1_avgpool/AvgPool","Conv2D_11/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"padding":{"s":"VkFMSUQ="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_10_1","op":"Add","input":["Conv2D_11","conv2d_10_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_7","op":"Relu","input":["conv2d_10_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_12","op":"Conv2D","input":["re_lu_7","Conv2D_12/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_11_1","op":"Add","input":["Conv2D_12","conv2d_11_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_1","op":"Sigmoid","input":["conv2d_11_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_1","op":"Mul","input":["mul_5","activation_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_13","op":"Conv2D","input":["multiply_1","Conv2D_13/filter"],"device":"/device:CPU:0","attr":{"strides":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"padding":{"s":"U0FNRQ=="},"data_format":{"s":"TkhXQw=="},"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_12_1","op":"Add","input":["Conv2D_13","conv2d_12_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_14","op":"Conv2D","input":["conv2d_12_1","Conv2D_14/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"use_cudnn_on_gpu":{"b":true},"explicit_paddings":{"list":{}},"padding":{"s":"U0FNRQ=="},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_13_1","op":"Add","input":["Conv2D_14","conv2d_13_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_6","op":"Mul","input":["mul_7/y","conv2d_13_1"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"add_3","op":"AddV2","input":["conv2d_13_1","add_3/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_3","op":"Relu6","input":["add_3"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_7","op":"Mul","input":["mul_6","Relu6_3"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"depthwise_4","op":"DepthwiseConv2dNative","input":["mul_7","depthwise_4/filter_in"],"attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}}}}, + {"name":"depthwise_conv2d_4","op":"Add","input":["depthwise_4","depthwise_conv2d_4/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_8","op":"Mul","input":["mul_9/y","depthwise_conv2d_4"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"add_4","op":"AddV2","input":["depthwise_conv2d_4","add_4/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_4","op":"Relu6","input":["add_4"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_9","op":"Mul","input":["mul_8","Relu6_4"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_2_avgpool/AvgPool","op":"AvgPool","input":["mul_9"],"attr":{"data_format":{"s":"TkhXQw=="},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","16","16","1"]}},"T":{"type":"DT_FLOAT"},"ksize":{"list":{"i":["1","16","16","1"]}}}}, + {"name":"Conv2D_15","op":"Conv2D","input":["average_pooling2d_2_avgpool/AvgPool","Conv2D_15/filter"],"device":"/device:CPU:0","attr":{"strides":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"padding":{"s":"VkFMSUQ="},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_14_1","op":"Add","input":["Conv2D_15","conv2d_14_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_8","op":"Relu","input":["conv2d_14_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_16","op":"Conv2D","input":["re_lu_8","Conv2D_16/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"T":{"type":"DT_FLOAT"},"padding":{"s":"VkFMSUQ="},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_15_1","op":"Add","input":["Conv2D_16","conv2d_15_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_2","op":"Sigmoid","input":["conv2d_15_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_2","op":"Mul","input":["mul_9","activation_2"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_17","op":"Conv2D","input":["multiply_2","Conv2D_17/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"padding":{"s":"U0FNRQ=="},"data_format":{"s":"TkhXQw=="}}}, + {"name":"conv2d_16_1","op":"Add","input":["Conv2D_17","conv2d_16_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_1__xeno_compat__1","op":"Add","input":["conv2d_16_1","conv2d_12_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_18","op":"Conv2D","input":["add_1__xeno_compat__1","Conv2D_18/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"padding":{"s":"U0FNRQ=="},"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_17_1","op":"Add","input":["Conv2D_18","conv2d_17_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_10","op":"Mul","input":["mul_11/y","conv2d_17_1"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"add_5","op":"AddV2","input":["conv2d_17_1","add_5/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_5","op":"Relu6","input":["add_5"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_11","op":"Mul","input":["mul_10","Relu6_5"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"depthwise_5","op":"DepthwiseConv2dNative","input":["mul_11","depthwise_5/filter_in"],"attr":{"data_format":{"s":"TkhXQw=="},"padding":{"s":"U0FNRQ=="},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_conv2d_5","op":"Add","input":["depthwise_5","depthwise_conv2d_5/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_12","op":"Mul","input":["mul_13/y","depthwise_conv2d_5"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"add_6","op":"AddV2","input":["depthwise_conv2d_5","add_6/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_6","op":"Relu6","input":["add_6"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_13","op":"Mul","input":["mul_12","Relu6_6"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"average_pooling2d_3_avgpool/AvgPool","op":"AvgPool","input":["mul_13"],"attr":{"ksize":{"list":{"i":["1","16","16","1"]}},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","16","16","1"]}},"padding":{"s":"VkFMSUQ="}}}, + {"name":"Conv2D_19","op":"Conv2D","input":["average_pooling2d_3_avgpool/AvgPool","Conv2D_19/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_18_1","op":"Add","input":["Conv2D_19","conv2d_18_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_9","op":"Relu","input":["conv2d_18_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_20","op":"Conv2D","input":["re_lu_9","Conv2D_20/filter"],"device":"/device:CPU:0","attr":{"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_19_1","op":"Add","input":["Conv2D_20","conv2d_19_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_3","op":"Sigmoid","input":["conv2d_19_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_3","op":"Mul","input":["mul_13","activation_3"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_21","op":"Conv2D","input":["multiply_3","Conv2D_21/filter"],"device":"/device:CPU:0","attr":{"padding":{"s":"U0FNRQ=="},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_20_1","op":"Add","input":["Conv2D_21","conv2d_20_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_2__xeno_compat__1","op":"Add","input":["conv2d_20_1","add_1__xeno_compat__1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_22","op":"Conv2D","input":["add_2__xeno_compat__1","Conv2D_22/filter"],"device":"/device:CPU:0","attr":{"padding":{"s":"U0FNRQ=="},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_21_1","op":"Add","input":["Conv2D_22","conv2d_21_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_14","op":"Mul","input":["mul_15/y","conv2d_21_1"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"add_7","op":"AddV2","input":["conv2d_21_1","add_7/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_7","op":"Relu6","input":["add_7"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_15","op":"Mul","input":["mul_14","Relu6_7"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_6","op":"DepthwiseConv2dNative","input":["mul_15","depthwise_6/filter_in"],"attr":{"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"padding":{"s":"U0FNRQ=="},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_conv2d_6","op":"Add","input":["depthwise_6","depthwise_conv2d_6/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_16","op":"Mul","input":["mul_17/y","depthwise_conv2d_6"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"add_8","op":"AddV2","input":["depthwise_conv2d_6","add_8/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_8","op":"Relu6","input":["add_8"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_17","op":"Mul","input":["mul_16","Relu6_8"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_4_avgpool/AvgPool","op":"AvgPool","input":["mul_17"],"attr":{"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","16","16","1"]}},"ksize":{"list":{"i":["1","16","16","1"]}},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="}}}, + {"name":"Conv2D_23","op":"Conv2D","input":["average_pooling2d_4_avgpool/AvgPool","Conv2D_23/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"explicit_paddings":{"list":{}},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"use_cudnn_on_gpu":{"b":true}}}, + {"name":"conv2d_22_1","op":"Add","input":["Conv2D_23","conv2d_22_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_10","op":"Relu","input":["conv2d_22_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_24","op":"Conv2D","input":["re_lu_10","Conv2D_24/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"padding":{"s":"VkFMSUQ="},"use_cudnn_on_gpu":{"b":true},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_23_1","op":"Add","input":["Conv2D_24","conv2d_23_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_4","op":"Sigmoid","input":["conv2d_23_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_4","op":"Mul","input":["mul_17","activation_4"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_25","op":"Conv2D","input":["multiply_4","Conv2D_25/filter"],"device":"/device:CPU:0","attr":{"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="}}}, + {"name":"conv2d_24_1","op":"Add","input":["Conv2D_25","conv2d_24_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_3__xeno_compat__1","op":"Add","input":["conv2d_24_1","add_2__xeno_compat__1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_26","op":"Conv2D","input":["add_3__xeno_compat__1","Conv2D_26/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","1","1","1"]}},"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"explicit_paddings":{"list":{}},"padding":{"s":"U0FNRQ=="},"data_format":{"s":"TkhXQw=="}}}, + {"name":"conv2d_25_1","op":"Add","input":["Conv2D_26","conv2d_25_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_18","op":"Mul","input":["mul_19/y","conv2d_25_1"],"attr":{"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true},"T":{"type":"DT_FLOAT"}}}, + {"name":"add_9","op":"AddV2","input":["conv2d_25_1","add_9/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_9","op":"Relu6","input":["add_9"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_19","op":"Mul","input":["mul_18","Relu6_9"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"depthwise_7","op":"DepthwiseConv2dNative","input":["mul_19","depthwise_7/filter_in"],"attr":{"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"padding":{"s":"U0FNRQ=="},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="}}}, + {"name":"depthwise_conv2d_7","op":"Add","input":["depthwise_7","depthwise_conv2d_7/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_20","op":"Mul","input":["mul_21/y","depthwise_conv2d_7"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"add_10","op":"AddV2","input":["depthwise_conv2d_7","add_10/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Relu6_10","op":"Relu6","input":["add_10"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"mul_21","op":"Mul","input":["mul_20","Relu6_10"],"attr":{"T":{"type":"DT_FLOAT"},"_grappler_ArithmeticOptimizer_MinimizeBroadcasts":{"b":true}}}, + {"name":"average_pooling2d_5_avgpool/AvgPool","op":"AvgPool","input":["mul_21"],"attr":{"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","16","16","1"]}},"ksize":{"list":{"i":["1","16","16","1"]}},"T":{"type":"DT_FLOAT"},"padding":{"s":"VkFMSUQ="}}}, + {"name":"Conv2D_27","op":"Conv2D","input":["average_pooling2d_5_avgpool/AvgPool","Conv2D_27/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"},"padding":{"s":"VkFMSUQ="},"use_cudnn_on_gpu":{"b":true},"strides":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_26_1","op":"Add","input":["Conv2D_27","conv2d_26_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_11","op":"Relu","input":["conv2d_26_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_28","op":"Conv2D","input":["re_lu_11","Conv2D_28/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"padding":{"s":"VkFMSUQ="},"use_cudnn_on_gpu":{"b":true},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_27_1","op":"Add","input":["Conv2D_28","conv2d_27_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_5","op":"Sigmoid","input":["conv2d_27_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_5","op":"Mul","input":["mul_21","activation_5"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_29","op":"Conv2D","input":["multiply_5","Conv2D_29/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"strides":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"T":{"type":"DT_FLOAT"},"padding":{"s":"U0FNRQ=="},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_28_1","op":"Add","input":["Conv2D_29","conv2d_28_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_4__xeno_compat__1","op":"Add","input":["conv2d_28_1","add_3__xeno_compat__1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_30","op":"Conv2D","input":["add_4__xeno_compat__1","Conv2D_30/filter"],"device":"/device:CPU:0","attr":{"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true}}}, + {"name":"average_pooling2d_6_avgpool/AvgPool","op":"AvgPool","input":["add_4__xeno_compat__1"],"attr":{"strides":{"list":{"i":["1","16","16","1"]}},"ksize":{"list":{"i":["1","16","16","1"]}},"T":{"type":"DT_FLOAT"},"padding":{"s":"VkFMSUQ="},"data_format":{"s":"TkhXQw=="}}}, + {"name":"conv2d_29_1","op":"Add","input":["Conv2D_30","conv2d_29_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_31","op":"Conv2D","input":["average_pooling2d_6_avgpool/AvgPool","Conv2D_31/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_12","op":"Relu","input":["conv2d_29_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_30_1","op":"Add","input":["Conv2D_31","conv2d_30_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_6","op":"Sigmoid","input":["conv2d_30_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_6","op":"Mul","input":["re_lu_12","activation_6"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"up_sampling2d_lambda/resize/ResizeBilinear","op":"ResizeBilinear","input":["multiply_6","up_sampling2d_lambda/resize/size"],"attr":{"half_pixel_centers":{"b":true},"T":{"type":"DT_FLOAT"},"align_corners":{"b":false}}}, + {"name":"Conv2D_32","op":"Conv2D","input":["up_sampling2d_lambda/resize/ResizeBilinear","Conv2D_32/filter"],"device":"/device:CPU:0","attr":{"data_format":{"s":"TkhXQw=="},"padding":{"s":"VkFMSUQ="},"use_cudnn_on_gpu":{"b":true},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_31_1","op":"Add","input":["Conv2D_32","conv2d_31_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_5__xeno_compat__1","op":"Add","input":["ArithmeticOptimizer/AddOpsRewrite_add__xeno_compat__1","conv2d_31_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_7_avgpool/AvgPool","op":"AvgPool","input":["add_5__xeno_compat__1"],"attr":{"padding":{"s":"VkFMSUQ="},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","32","32","1"]}},"ksize":{"list":{"i":["1","32","32","1"]}}}}, + {"name":"Conv2D_33","op":"Conv2D","input":["average_pooling2d_7_avgpool/AvgPool","Conv2D_33/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"},"use_cudnn_on_gpu":{"b":true},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="}}}, + {"name":"conv2d_32_1","op":"Add","input":["Conv2D_33","conv2d_32_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_13","op":"Relu","input":["conv2d_32_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_34","op":"Conv2D","input":["re_lu_13","Conv2D_34/filter"],"device":"/device:CPU:0","attr":{"strides":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"padding":{"s":"VkFMSUQ="},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="}}}, + {"name":"conv2d_33_1","op":"Add","input":["Conv2D_34","conv2d_33_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_7","op":"Sigmoid","input":["conv2d_33_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_7","op":"Mul","input":["ArithmeticOptimizer/AddOpsRewrite_add__xeno_compat__1","activation_7"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_6__xeno_compat__1","op":"Add","input":["multiply_7","conv2d_31_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_35","op":"Conv2D","input":["add_6__xeno_compat__1","Conv2D_35/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"explicit_paddings":{"list":{}},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="}}}, + {"name":"conv2d_34_1","op":"Add","input":["Conv2D_35","conv2d_34_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_14","op":"Relu","input":["conv2d_34_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_8","op":"DepthwiseConv2dNative","input":["re_lu_14","depthwise_8/filter_in"],"attr":{"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"padding":{"s":"U0FNRQ=="},"T":{"type":"DT_FLOAT"},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"depthwise_conv2d_8","op":"Add","input":["depthwise_8","depthwise_conv2d_8/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_15","op":"Relu","input":["depthwise_conv2d_8"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_7__xeno_compat__1","op":"Add","input":["re_lu_14","re_lu_15"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"up_sampling2d_1_lambda/resize/ResizeBilinear","op":"ResizeBilinear","input":["add_7__xeno_compat__1","up_sampling2d_1_lambda/resize/size"],"attr":{"half_pixel_centers":{"b":true},"T":{"type":"DT_FLOAT"},"align_corners":{"b":false}}}, + {"name":"Conv2D_36","op":"Conv2D","input":["up_sampling2d_1_lambda/resize/ResizeBilinear","Conv2D_36/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"data_format":{"s":"TkhXQw=="},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_35_1","op":"Add","input":["Conv2D_36","conv2d_35_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_8__xeno_compat__1","op":"Add","input":["conv2d_4_1","conv2d_35_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_8_avgpool/AvgPool","op":"AvgPool","input":["add_8__xeno_compat__1"],"attr":{"data_format":{"s":"TkhXQw=="},"ksize":{"list":{"i":["1","64","64","1"]}},"padding":{"s":"VkFMSUQ="},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","64","64","1"]}}}}, + {"name":"Conv2D_37","op":"Conv2D","input":["average_pooling2d_8_avgpool/AvgPool","Conv2D_37/filter"],"device":"/device:CPU:0","attr":{"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true},"padding":{"s":"VkFMSUQ="},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"strides":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_36_1","op":"Add","input":["Conv2D_37","conv2d_36_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_16","op":"Relu","input":["conv2d_36_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_38","op":"Conv2D","input":["re_lu_16","Conv2D_38/filter"],"device":"/device:CPU:0","attr":{"T":{"type":"DT_FLOAT"},"padding":{"s":"VkFMSUQ="},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_37_1","op":"Add","input":["Conv2D_38","conv2d_37_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_8","op":"Sigmoid","input":["conv2d_37_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_8","op":"Mul","input":["conv2d_4_1","activation_8"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_9__xeno_compat__1","op":"Add","input":["multiply_8","conv2d_35_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_39","op":"Conv2D","input":["add_9__xeno_compat__1","Conv2D_39/filter"],"device":"/device:CPU:0","attr":{"explicit_paddings":{"list":{}},"strides":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"data_format":{"s":"TkhXQw=="},"padding":{"s":"VkFMSUQ="},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_38_1","op":"Add","input":["Conv2D_39","conv2d_38_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_17","op":"Relu","input":["conv2d_38_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_9","op":"DepthwiseConv2dNative","input":["re_lu_17","depthwise_9/filter_in"],"attr":{"T":{"type":"DT_FLOAT"},"explicit_paddings":{"list":{}},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="},"data_format":{"s":"TkhXQw=="},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"depthwise_conv2d_9","op":"Add","input":["depthwise_9","depthwise_conv2d_9/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_18","op":"Relu","input":["depthwise_conv2d_9"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_10__xeno_compat__1","op":"Add","input":["re_lu_17","re_lu_18"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"up_sampling2d_2_lambda/resize/ResizeBilinear","op":"ResizeBilinear","input":["add_10__xeno_compat__1","up_sampling2d_2_lambda/resize/size"],"attr":{"half_pixel_centers":{"b":true},"T":{"type":"DT_FLOAT"},"align_corners":{"b":false}}}, + {"name":"Conv2D_40","op":"Conv2D","input":["up_sampling2d_2_lambda/resize/ResizeBilinear","Conv2D_40/filter"],"device":"/device:CPU:0","attr":{"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"use_cudnn_on_gpu":{"b":true}}}, + {"name":"conv2d_39_1","op":"Add","input":["Conv2D_40","conv2d_39_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_11__xeno_compat__1","op":"Add","input":["mul_1","conv2d_39_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"average_pooling2d_9_avgpool/AvgPool","op":"AvgPool","input":["add_11__xeno_compat__1"],"attr":{"padding":{"s":"VkFMSUQ="},"ksize":{"list":{"i":["1","128","128","1"]}},"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","128","128","1"]}},"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_41","op":"Conv2D","input":["average_pooling2d_9_avgpool/AvgPool","Conv2D_41/filter"],"device":"/device:CPU:0","attr":{"padding":{"s":"VkFMSUQ="},"data_format":{"s":"TkhXQw=="},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}}}}, + {"name":"conv2d_40_1","op":"Add","input":["Conv2D_41","conv2d_40_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_19","op":"Relu","input":["conv2d_40_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_42","op":"Conv2D","input":["re_lu_19","Conv2D_42/filter"],"device":"/device:CPU:0","attr":{"dilations":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","1","1","1"]}},"use_cudnn_on_gpu":{"b":true},"data_format":{"s":"TkhXQw=="},"padding":{"s":"VkFMSUQ="}}}, + {"name":"conv2d_41_1","op":"Add","input":["Conv2D_42","conv2d_41_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_9","op":"Sigmoid","input":["conv2d_41_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"multiply_9","op":"Mul","input":["mul_1","activation_9"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_12__xeno_compat__1","op":"Add","input":["multiply_9","conv2d_39_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"Conv2D_43","op":"Conv2D","input":["add_12__xeno_compat__1","Conv2D_43/filter"],"device":"/device:CPU:0","attr":{"data_format":{"s":"TkhXQw=="},"strides":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"VkFMSUQ="},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"T":{"type":"DT_FLOAT"}}}, + {"name":"conv2d_42_1","op":"Add","input":["Conv2D_43","conv2d_42_1/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_20","op":"Relu","input":["conv2d_42_1"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"depthwise_10","op":"DepthwiseConv2dNative","input":["re_lu_20","depthwise_10/filter_in"],"attr":{"data_format":{"s":"TkhXQw=="},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","1","1","1"]}},"explicit_paddings":{"list":{}},"dilations":{"list":{"i":["1","1","1","1"]}},"padding":{"s":"U0FNRQ=="}}}, + {"name":"depthwise_conv2d_10","op":"Add","input":["depthwise_10","depthwise_conv2d_10/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"re_lu_21","op":"Relu","input":["depthwise_conv2d_10"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"add_13__xeno_compat__1","op":"Add","input":["re_lu_20","re_lu_21"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"segment","op":"Conv2DBackpropInput","input":["segment/input_sizes","segment/filter","add_13__xeno_compat__1"],"attr":{"padding":{"s":"U0FNRQ=="},"explicit_paddings":{"list":{}},"data_format":{"s":"TkhXQw=="},"use_cudnn_on_gpu":{"b":true},"dilations":{"list":{"i":["1","1","1","1"]}},"T":{"type":"DT_FLOAT"},"strides":{"list":{"i":["1","2","2","1"]}}}}, + {"name":"segment_add","op":"Add","input":["segment","segment_add/y"],"attr":{"T":{"type":"DT_FLOAT"}}}, + {"name":"activation_10","op":"Sigmoid","input":["segment_add"],"attr":{"T":{"type":"DT_FLOAT"}}} + ], + "library": {}, + "versions": + { + "producer": 561 + } + }, + "weightsManifest": + [ + { + "paths": ["selfie.bin"], + "weights": [{"name":"segment/input_sizes","shape":[4],"dtype":"int32"},{"name":"segment/filter","shape":[2,2,1,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_41/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_40_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_42/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_41_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_37/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_36_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_38/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_37_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_33/filter","shape":[1,1,24,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_32_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_34/filter","shape":[1,1,24,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_33_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_30/filter","shape":[1,1,32,128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_29_1/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_21/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_19/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_26/filter","shape":[1,1,32,96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_25_1/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_9/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_7/filter_in","shape":[5,5,96,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_7/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_10/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_27/filter","shape":[1,1,96,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_26_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_28/filter","shape":[1,1,24,96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_27_1/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_29/filter","shape":[1,1,96,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_28_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_17/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_15/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_22/filter","shape":[1,1,32,96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_21_1/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_7/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_6/filter_in","shape":[5,5,96,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_6/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_8/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_23/filter","shape":[1,1,96,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_22_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_24/filter","shape":[1,1,24,96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_23_1/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_25/filter","shape":[1,1,96,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_24_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_13/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_11/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_18/filter","shape":[1,1,32,128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_17_1/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_5/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_5/filter_in","shape":[5,5,128,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_5/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_6/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_19/filter","shape":[1,1,128,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_18_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_20/filter","shape":[1,1,32,128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_19_1/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_21/filter","shape":[1,1,128,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_20_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_9/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_7/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_14/filter","shape":[1,1,32,128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_13_1/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_3/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_4/filter_in","shape":[5,5,128,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_4/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_4/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_15/filter","shape":[1,1,128,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_14_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_16/filter","shape":[1,1,32,128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_15_1/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_17/filter","shape":[1,1,128,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_16_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_5/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_3/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_8_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_8/filter","shape":[1,1,24,88],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_7_1/y","shape":[88],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_2/filter_in","shape":[3,3,88,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_2/y","shape":[88],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_9/filter","shape":[1,1,88,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"mul_1/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D/filter","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_2/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_1_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise/filter_in","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_3/filter","shape":[1,1,16,8],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_2_1/y","shape":[8],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_4/filter","shape":[1,1,8,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_3_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_5/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_4_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_6/filter","shape":[1,1,16,72],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_5_1/y","shape":[72],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_1/filter_in","shape":[3,3,72,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_1/y","shape":[72],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_7/filter","shape":[1,1,72,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_6_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_10/filter","shape":[1,1,24,96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_9_1/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_1/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_3/filter_in","shape":[5,5,96,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_3/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"add_2/y","shape":[],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_11/filter","shape":[1,1,96,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_10_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_12/filter","shape":[1,1,24,96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_11_1/y","shape":[96],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_13/filter","shape":[1,1,96,32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_12_1/y","shape":[32],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_31/filter","shape":[1,1,32,128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_30_1/y","shape":[128],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"up_sampling2d_lambda/resize/size","shape":[2],"dtype":"int32"},{"name":"Conv2D_32/filter","shape":[1,1,128,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_31_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_35/filter","shape":[1,1,24,24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_34_1/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_8/filter_in","shape":[3,3,24,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_8/y","shape":[24],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"up_sampling2d_1_lambda/resize/size","shape":[2],"dtype":"int32"},{"name":"Conv2D_36/filter","shape":[1,1,24,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_35_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_39/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_38_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_9/filter_in","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_9/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"up_sampling2d_2_lambda/resize/size","shape":[2],"dtype":"int32"},{"name":"Conv2D_40/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_39_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"Conv2D_43/filter","shape":[1,1,16,16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"conv2d_42_1/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_10/filter_in","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"depthwise_conv2d_10/y","shape":[16],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}},{"name":"segment_add/y","shape":[1],"dtype":"float32","quantization":{"dtype":"float16","original_dtype":"float32"}}] + } + ] +} \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index c893ab0b..986c63d9 100644 --- a/src/config.ts +++ b/src/config.ts @@ -196,6 +196,15 @@ export interface Config { maxDetected: number, skipFrames: number, }, + + /** Controlls and configures all body segmentation module + * - enabled: true/false + * - modelPath: object detection model, can be absolute path or relative to modelBasePath + */ + segmentation: { + enabled: boolean, + modelPath: string, + }, } const config: Config = { @@ -338,5 +347,11 @@ const config: Config = { skipFrames: 19, // how many max frames to go without re-running the detector // only used when cacheSensitivity is not zero }, + + segmentation: { + enabled: false, + modelPath: 'selfie.json', // experimental: object detection model, can be absolute path or relative to modelBasePath + // can be 'selfie' or 'meet' + }, }; export { config as defaults }; diff --git a/src/human.ts b/src/human.ts index 475fc5ab..3c2533b5 100644 --- a/src/human.ts +++ b/src/human.ts @@ -24,6 +24,7 @@ import * as image from './image/image'; import * as draw from './draw/draw'; import * as persons from './persons'; import * as interpolate from './interpolate'; +import * as segmentation from './segmentation/segmentation'; import * as sample from './sample'; import * as app from '../package.json'; import { Tensor } from './tfjs/types'; @@ -114,16 +115,7 @@ export class Human { nanodet: Model | null, centernet: Model | null, faceres: Model | null, - }; - /** @internal: Currently loaded classes */ - classes: { - facemesh: typeof facemesh; - emotion: typeof emotion; - body: typeof posenet | typeof blazepose | typeof movenet; - hand: typeof handpose; - nanodet: typeof nanodet; - centernet: typeof centernet; - faceres: typeof faceres; + segmentation: Model | null, }; /** Reference face triangualtion array of 468 points, used for triangle references between points */ faceTriangulation: typeof facemesh.triangulation; @@ -173,20 +165,12 @@ export class Human { nanodet: null, centernet: null, faceres: null, + segmentation: null, }; // export access to image processing // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function this.image = (input: Input) => image.process(input, this.config); // export raw access to underlying models - this.classes = { - facemesh, - emotion, - faceres, - body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose, - hand: handpose, - nanodet, - centernet, - }; this.faceTriangulation = facemesh.triangulation; this.faceUVMap = facemesh.uvmap; // include platform info @@ -274,8 +258,10 @@ export class Human { } if (this.config.async) { // load models concurrently [ + // @ts-ignore async model loading is not correctly inferred this.models.face, this.models.emotion, + // @ts-ignore async model loading is not correctly inferred this.models.handpose, this.models.posenet, this.models.blazepose, @@ -284,6 +270,7 @@ export class Human { this.models.nanodet, this.models.centernet, this.models.faceres, + this.models.segmentation, ] = await Promise.all([ this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null), this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null), @@ -295,6 +282,7 @@ export class Human { this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null), this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null), this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null), + this.models.segmentation || (this.config.segmentation.enabled ? segmentation.load(this.config) : null), ]); } else { // load models sequentially if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config); @@ -307,6 +295,7 @@ export class Human { if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config); if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config); if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config); + if (this.config.segmentation.enabled && !this.models.segmentation) this.models.segmentation = await segmentation.load(this.config); } if (this.#firstRun) { // print memory stats on first run @@ -568,6 +557,17 @@ export class Human { else if (this.performance.gesture) delete this.performance.gesture; } + // run segmentation + if (this.config.segmentation.enabled) { + this.analyze('Start Segmentation:'); + this.state = 'run:segmentation'; + timeStamp = now(); + await segmentation.predict(process, this.config); + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) this.performance.segmentation = elapsedTime; + this.analyze('End Segmentation:'); + } + this.performance.total = Math.trunc(now() - timeStart); this.state = 'idle'; this.result = { diff --git a/src/image/image.ts b/src/image/image.ts index 2b446511..653b6b62 100644 --- a/src/image/image.ts +++ b/src/image/image.ts @@ -138,7 +138,7 @@ export function process(input, config): { tensor: Tensor | null, canvas: Offscre const shape = [outCanvas.height, outCanvas.width, 3]; pixels = tf.tensor3d(outCanvas.data, shape, 'int32'); } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it - pixels = tf.browser.fromPixels(outCanvas); + pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null; } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata // we can use canvas as-is as it already has a context, so we do a silly one more canvas const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas'); @@ -146,7 +146,7 @@ export function process(input, config): { tensor: Tensor | null, canvas: Offscre tempCanvas.height = targetHeight; const tempCtx = tempCanvas.getContext('2d'); tempCtx?.drawImage(outCanvas, 0, 0); - pixels = tf.browser.fromPixels(tempCanvas); + pixels = tf.browser ? tf.browser.fromPixels(tempCanvas) : null; } else { // cpu and wasm kernel does not implement efficient fromPixels method // we can use canvas as-is as it already has a context, so we do a silly one more canvas const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas'); @@ -155,12 +155,14 @@ export function process(input, config): { tensor: Tensor | null, canvas: Offscre const tempCtx = tempCanvas.getContext('2d'); tempCtx?.drawImage(outCanvas, 0, 0); const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight); - pixels = tf.browser.fromPixels(data); + pixels = tf.browser ? tf.browser.fromPixels(data) : null; + } + if (pixels) { + const casted = pixels.toFloat(); + tensor = casted.expandDims(0); + pixels.dispose(); + casted.dispose(); } - const casted = pixels.toFloat(); - tensor = casted.expandDims(0); - pixels.dispose(); - casted.dispose(); } const canvas = config.filter.return ? outCanvas : null; return { tensor, canvas }; diff --git a/src/interpolate.ts b/src/interpolate.ts index 0009e23a..7459192c 100644 --- a/src/interpolate.ts +++ b/src/interpolate.ts @@ -21,6 +21,8 @@ export function calc(newResult: Result): Result { // - at 1sec delay buffer = 1 which means live data is used const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed) : 1; + bufferedResult.canvas = newResult.canvas; + // interpolate body results if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) { bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as Body[])); // deep clone once diff --git a/src/result.ts b/src/result.ts index 203cdd13..d8933576 100644 --- a/src/result.ts +++ b/src/result.ts @@ -176,7 +176,7 @@ export interface Result { /** global performance object with timing values for each operation */ performance: Record, /** optional processed canvas that can be used to draw input on screen */ - readonly canvas?: OffscreenCanvas | HTMLCanvasElement, + canvas?: OffscreenCanvas | HTMLCanvasElement, /** timestamp of detection representing the milliseconds elapsed since the UNIX epoch */ readonly timestamp: number, /** getter property that returns unified persons object */ diff --git a/src/segmentation/segmentation.ts b/src/segmentation/segmentation.ts new file mode 100644 index 00000000..cc84881a --- /dev/null +++ b/src/segmentation/segmentation.ts @@ -0,0 +1,75 @@ +/** + * EfficientPose Module + */ + +import { log, join } from '../helpers'; +import * as tf from '../../dist/tfjs.esm.js'; +import { GraphModel, Tensor } from '../tfjs/types'; +import { Config } from '../config'; +// import * as blur from './blur'; + +let model: GraphModel; +// let blurKernel; + +export type Segmentation = boolean; + +export async function load(config: Config): Promise { + if (!model) { + // @ts-ignore type mismatch on GraphModel + model = await tf.loadGraphModel(join(config.modelBasePath, config.segmentation.modelPath)); + if (!model || !model['modelUrl']) log('load model failed:', config.segmentation.modelPath); + else if (config.debug) log('load model:', model['modelUrl']); + } else if (config.debug) log('cached model:', model['modelUrl']); + // if (!blurKernel) blurKernel = blur.getGaussianKernel(50, 1, 1); + return model; +} + +export async function predict(input: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement }, config: Config): Promise { + if (!config.segmentation.enabled || !input.tensor || !input.canvas) return false; + if (!model || !model.inputs[0].shape) return false; + const resizeInput = tf.image.resizeBilinear(input.tensor, [model.inputs[0].shape[1], model.inputs[0].shape[2]], false); + const norm = resizeInput.div(255); + const res = model.predict(norm) as Tensor; + tf.dispose(resizeInput); + tf.dispose(norm); + + const overlay = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(input.canvas.width, input.canvas.height) : document.createElement('canvas'); + overlay.width = input.canvas.width; + overlay.height = input.canvas.height; + + const squeeze = tf.squeeze(res, 0); + let resizeOutput; + if (squeeze.shape[2] === 2) { // model meet has two channels for fg and bg + const softmax = squeeze.softmax(); + const [bg, fg] = tf.unstack(softmax, 2); + tf.dispose(softmax); + const expand = fg.expandDims(2); + tf.dispose(bg); + tf.dispose(fg); + resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]); + tf.dispose(expand); + } else { // model selfie has a single channel + resizeOutput = tf.image.resizeBilinear(squeeze, [input.tensor?.shape[1], input.tensor?.shape[2]]); + } + + // const blurred = blur.blur(resizeOutput, blurKernel); + if (tf.browser) await tf.browser.toPixels(resizeOutput, overlay); + // tf.dispose(blurred); + tf.dispose(resizeOutput); + tf.dispose(squeeze); + tf.dispose(res); + + const ctx = input.canvas.getContext('2d') as CanvasRenderingContext2D; + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // best options are: darken, color-burn, multiply + ctx.globalCompositeOperation = 'darken'; + await ctx?.drawImage(overlay, 0, 0); + ctx.globalCompositeOperation = 'source-in'; + return true; +} + +/* Segmentation todo: +- Smoothen +- Get latest canvas in interpolate +- Buffered fetches latest from video instead from interpolate +*/ diff --git a/wiki b/wiki index 0087af56..8e898a63 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 0087af5684c5722b2cf7ffd3db57b8117b7ac8c5 +Subproject commit 8e898a636f5254a3fe451b097c633c9965a8a680