UNPKG

@tensorflow-models/body-pix

Version:

Pretrained BodyPix model in TensorFlow.js

19 lines (18 loc) 43 kB
/** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ import*as tf from"@tensorflow/tfjs-core";import{tidy,Tensor,util,browser,pad3d,image,oneHot,scalar,range,div,getBackend,tensor,backend}from"@tensorflow/tfjs-core";import{loadGraphModel}from"@tensorflow/tfjs-converter";var extendStatics=function(e,t){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function __extends(e,t){function n(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var __assign=function(){return(__assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function __awaiter(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{d(r.next(e))}catch(e){i(e)}}function s(e){try{d(r.throw(e))}catch(e){i(e)}}function d(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}d((r=r.apply(e,t||[])).next())})}function __generator(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}}function toFlattenedOneHotPartMap(e){var t=e.shape[2],n=e.argMax(2).reshape([-1]);return oneHot(n,t)}function clipByMask2d(e,t){return e.mul(t)}function toMaskTensor(e,t){return tidy(function(){return e.greater(scalar(t)).toInt()})}function decodePartSegmentation(e,t){var n=t.shape,r=n[0],o=n[1],i=n[2];return tidy(function(){var n=toFlattenedOneHotPartMap(t),a=range(0,i,1,"int32").expandDims(1);return clipByMask2d(n.matMul(a).toInt().reshape([r,o]).add(scalar(1,"int32")),e).sub(scalar(1,"int32"))})}function decodeOnlyPartSegmentation(e){var t=e.shape,n=t[0],r=t[1],o=t[2];return tidy(function(){var t=toFlattenedOneHotPartMap(e),i=range(0,o,1,"int32").expandDims(1);return t.matMul(i).toInt().reshape([n,r])})}var BaseModel=function(){function e(e,t){this.model=e,this.outputStride=t;var n=this.model.inputs[0].shape;util.assert(-1===n[1]&&-1===n[2],function(){return"Input shape ["+n[1]+", "+n[2]+"] must both be equal to or -1"})}return e.prototype.predict=function(e){var t=this;return tidy(function(){var n=t.preprocessInput(e.toFloat()).expandDims(0),r=t.model.predict(n).map(function(e){return e.squeeze([0])}),o=t.nameOutputResults(r);return{heatmapScores:o.heatmap.sigmoid(),offsets:o.offsets,displacementFwd:o.displacementFwd,displacementBwd:o.displacementBwd,segmentation:o.segmentation,partHeatmaps:o.partHeatmaps,longOffsets:o.longOffsets,partOffsets:o.partOffsets}})},e.prototype.dispose=function(){this.model.dispose()},e}(),MobileNet=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.preprocessInput=function(e){return tidy(function(){return div(e,127.5).sub(1)})},t.prototype.nameOutputResults=function(e){return{offsets:e[0],segmentation:e[1],partHeatmaps:e[2],longOffsets:e[3],heatmap:e[4],displacementFwd:e[5],displacementBwd:e[6],partOffsets:e[7]}},t}(BaseModel),PART_NAMES=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],NUM_KEYPOINTS=PART_NAMES.length,PART_IDS=PART_NAMES.reduce(function(e,t,n){return e[t]=n,e},{}),CONNECTED_PART_NAMES=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],POSE_CHAIN=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]],CONNECTED_PART_INDICES=CONNECTED_PART_NAMES.map(function(e){var t=e[0],n=e[1];return[PART_IDS[t],PART_IDS[n]]});function getScale(e,t,n){var r=e[0],o=e[1],i=t[0],a=t[1],s=n.top,d=n.bottom;return[a/(n.left+n.right+o),i/(s+d+r)]}function getOffsetPoint(e,t,n,r){return{y:r.get(e,t,n),x:r.get(e,t,n+NUM_KEYPOINTS)}}function getImageCoords(e,t,n){var r=getOffsetPoint(e.heatmapY,e.heatmapX,e.id,n),o=r.y,i=r.x;return{x:e.heatmapX*t+i,y:e.heatmapY*t+o}}function clamp(e,t,n){return e<t?t:e>n?n:e}function squaredDistance(e,t,n,r){var o=n-e,i=r-t;return o*o+i*i}function addVectors(e,t){return{x:e.x+t.x,y:e.y+t.y}}function computeDistance(e,t,n){void 0===n&&(n=.3);for(var r=0,o=0,i=0;i<e.length;i++)t.keypoints[i].score>n&&(o+=1,r+=Math.pow(e[i].x-t.keypoints[i].position.x,2)+Math.pow(e[i].y-t.keypoints[i].position.y,2));return 0===o?r=1/0:r/=o,r}function convertToPositionInOuput(e,t,n,r){var o=t[0],i=t[1],a=n[0],s=n[1],d=Math.round(((o+e.y+1)*s-1)/r);return{x:Math.round(((i+e.x+1)*a-1)/r),y:d}}function getEmbedding(e,t,n,r,o,i,a){for(var s=a[0],d=a[1],u=n(e),l=u.y*r+u.x,f=o[NUM_KEYPOINTS*(2*l)+t],c=o[NUM_KEYPOINTS*(2*l+1)+t],p=e.y+f,h=e.x+c,m=0;m<i;m++){p=Math.min(p,s-1);var g=n({x:h=Math.min(h,d-1),y:p}),v=g.y*r+g.x;p+=f=o[NUM_KEYPOINTS*(2*v)+t],h+=c=o[NUM_KEYPOINTS*(2*v+1)+t]}return{x:h,y:p}}function matchEmbeddingToInstance(e,t,n,r,o,i,a,s,d,u){for(var l=o[0],f=o[1],c=i[0],p=i[1],h=s[0],m=s[1],g=[],v=function(e){return convertToPositionInOuput(e,[l,f],[c,p],d)},S=0;S<r;S++){var _=getEmbedding(e,S,v,a,t,u,[h,m]);g.push(_)}for(var I=-1,w=1/0,E=0;E<n.length;E++){var T=computeDistance(g,n[E]);T<w&&(I=E,w=T)}return I}function getOutputResolution(e,t){var n=e[0],r=e[1];return[Math.round((r-1)/t+1),Math.round((n-1)/t+1)]}function decodeMultipleMasksCPU(e,t,n,r,o,i,a,s,d,u){var l=a[0],f=a[1];void 0===u&&(u=5);for(var c=n.map(function(e){return new Uint8Array(r*o).fill(0)}),p=s.top,h=s.left,m=getScale([r,o],[l,f],s),g=m[0],v=m[1],S=getOutputResolution([l,f],i)[0],_=0;_<r;_+=1)for(var I=0;I<o;I+=1){var w=_*o+I;if(1===e[w]){var E=matchEmbeddingToInstance({x:I,y:_},t,n,u,[p,h],[g,v],S,[r,o],i,d);E>=0&&(c[E][w]=1)}}return c}function decodeMultiplePartMasksCPU(e,t,n,r,o,i,a,s,d,u,l){var f=s[0],c=s[1];void 0===l&&(l=5);for(var p=r.map(function(e){return new Int32Array(o*i).fill(-1)}),h=d.top,m=d.left,g=getScale([o,i],[f,c],d),v=g[0],S=g[1],_=getOutputResolution([f,c],a)[0],I=0;I<o;I+=1)for(var w=0;w<i;w+=1){var E=I*i+w;if(1===e[E]){var T=matchEmbeddingToInstance({x:w,y:I},t,r,l,[h,m],[v,S],_,[o,i],a,u);T>=0&&(p[T][E]=n[E])}}return p}function decodeMultipleMasksWebGl(e,t,n,r,o,i,a,s,d,u,l){for(var f=a[0],c=a[1],p=e.shape,h=p[0],m=p[1],g=t.shape.slice(0,2),v=g[0],S=g[1],_=t.reshape([v,S,2,NUM_KEYPOINTS]),I=new Float32Array(l*NUM_KEYPOINTS*3).fill(0),w=0;w<n.length;w++)for(var E=w*NUM_KEYPOINTS*3,T=n[w],N=0;N<NUM_KEYPOINTS;N++){var A=T.keypoints[N],P=E+3*N;I[P]=A.score,I[P+1]=A.position.y,I[P+2]=A.position.x}var y=getScale([r,o],[f,c],s),O=y[0],M=y[1],b=tensor(I,[l,NUM_KEYPOINTS,3]),R=s.top,C=s.left,x={variableNames:["segmentation","longOffsets","poses"],outputShape:[h,m],userCode:"\n int convertToPositionInOutput(int pos, int pad, float scale, int stride) {\n return round(((float(pos + pad) + 1.0) * scale - 1.0) / float(stride));\n }\n\n float convertToPositionInOutputFloat(\n int pos, int pad, float scale, int stride) {\n return ((float(pos + pad) + 1.0) * scale - 1.0) / float(stride);\n }\n\n float dist(float x1, float y1, float x2, float y2) {\n return pow(x1 - x2, 2.0) + pow(y1 - y2, 2.0);\n }\n\n float sampleLongOffsets(float h, float w, int d, int k) {\n float fh = fract(h);\n float fw = fract(w);\n int clH = int(ceil(h));\n int clW = int(ceil(w));\n int flH = int(floor(h));\n int flW = int(floor(w));\n float o11 = getLongOffsets(flH, flW, d, k);\n float o12 = getLongOffsets(flH, clW, d, k);\n float o21 = getLongOffsets(clH, flW, d, k);\n float o22 = getLongOffsets(clH, clW, d, k);\n float o1 = mix(o11, o12, fw);\n float o2 = mix(o21, o22, fw);\n return mix(o1, o2, fh);\n }\n\n int findNearestPose(int h, int w) {\n float prob = getSegmentation(h, w);\n if (prob < 1.0) {\n return -1;\n }\n\n // Done(Tyler): convert from output space h/w to strided space.\n float stridedH = convertToPositionInOutputFloat(\n h, "+R+", "+M+", "+i+");\n float stridedW = convertToPositionInOutputFloat(\n w, "+C+", "+O+", "+i+");\n\n float minDist = 1000000.0;\n int iMin = -1;\n for (int i = 0; i < "+l+"; i++) {\n float curDistSum = 0.0;\n int numKpt = 0;\n for (int k = 0; k < "+NUM_KEYPOINTS+"; k++) {\n float dy = sampleLongOffsets(stridedH, stridedW, 0, k);\n float dx = sampleLongOffsets(stridedH, stridedW, 1, k);\n\n float y = float(h) + dy;\n float x = float(w) + dx;\n\n for (int s = 0; s < "+d+"; s++) {\n int yRounded = round(min(y, float("+(r-1)+")));\n int xRounded = round(min(x, float("+(o-1)+")));\n\n float yStrided = convertToPositionInOutputFloat(\n yRounded, "+R+", "+M+", "+i+");\n float xStrided = convertToPositionInOutputFloat(\n xRounded, "+C+", "+O+", "+i+");\n\n float dy = sampleLongOffsets(yStrided, xStrided, 0, k);\n float dx = sampleLongOffsets(yStrided, xStrided, 1, k);\n\n y = y + dy;\n x = x + dx;\n }\n\n float poseScore = getPoses(i, k, 0);\n float poseY = getPoses(i, k, 1);\n float poseX = getPoses(i, k, 2);\n if (poseScore > "+u+") {\n numKpt = numKpt + 1;\n curDistSum = curDistSum + dist(x, y, poseX, poseY);\n }\n }\n if (numKpt > 0 && curDistSum / float(numKpt) < minDist) {\n minDist = curDistSum / float(numKpt);\n iMin = i;\n }\n }\n return iMin;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int nearestPose = findNearestPose(coords[0], coords[1]);\n setOutput(float(nearestPose));\n }\n "};return backend().compileAndRun(x,[e,_,b])}function toPersonKSegmentation(e,t){return tidy(function(){return e.equal(scalar(t)).toInt()})}function toPersonKPartSegmentation(e,t,n){return tidy(function(){return e.equal(scalar(n)).toInt().mul(t.add(1)).sub(1)})}function isWebGlBackend(){return"webgl"===getBackend()}function decodePersonInstanceMasks(e,t,n,r,o,i,a,s,d,u,l,f){var c=a[0],p=a[1];return void 0===d&&(d=.2),void 0===u&&(u=8),void 0===l&&(l=.3),void 0===f&&(f=10),__awaiter(this,void 0,void 0,function(){var a,h,m,g,v;return __generator(this,function(S){switch(S.label){case 0:return a=n.filter(function(e){return e.score>=d}),isWebGlBackend()?(m=tidy(function(){var n=decodeMultipleMasksWebGl(e,t,a,r,o,i,[c,p],s,u,l,f);return a.map(function(e,t){return toPersonKSegmentation(n,t)})}),[4,Promise.all(m.map(function(e){return e.data()}))]):[3,2];case 1:return h=S.sent(),m.forEach(function(e){return e.dispose()}),[3,5];case 2:return[4,e.data()];case 3:return g=S.sent(),[4,t.data()];case 4:v=S.sent(),h=decodeMultipleMasksCPU(g,v,a,r,o,i,[c,p],s,u),S.label=5;case 5:return[2,h.map(function(e,t){return{data:e,pose:a[t],width:o,height:r}})]}})})}function decodePersonInstancePartMasks(e,t,n,r,o,i,a,s,d,u,l,f,c){var p=s[0],h=s[1];return void 0===u&&(u=.2),void 0===l&&(l=8),void 0===f&&(f=.3),void 0===c&&(c=10),__awaiter(this,void 0,void 0,function(){var s,m,g,v,S,_;return __generator(this,function(I){switch(I.label){case 0:return s=r.filter(function(e){return e.score>=u}),isWebGlBackend()?(g=tidy(function(){var r=decodeMultipleMasksWebGl(e,t,s,o,i,a,[p,h],d,l,f,c);return s.map(function(e,t){return toPersonKPartSegmentation(r,n,t)})}),[4,Promise.all(g.map(function(e){return e.data()}))]):[3,2];case 1:return m=I.sent(),g.forEach(function(e){return e.dispose()}),[3,6];case 2:return[4,e.data()];case 3:return v=I.sent(),[4,t.data()];case 4:return S=I.sent(),[4,n.data()];case 5:_=I.sent(),m=decodeMultiplePartMasksCPU(v,S,_,s,o,i,a,[p,h],d,l),I.label=6;case 6:return[2,m.map(function(e,t){return{pose:s[t],data:e,height:o,width:i}})]}})})}function half(e){return Math.floor(e/2)}var MaxHeap=function(){function e(e,t){this.priorityQueue=new Array(e),this.numberOfElements=-1,this.getElementValue=t}return e.prototype.enqueue=function(e){this.priorityQueue[++this.numberOfElements]=e,this.swim(this.numberOfElements)},e.prototype.dequeue=function(){var e=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,e},e.prototype.empty=function(){return-1===this.numberOfElements},e.prototype.size=function(){return this.numberOfElements+1},e.prototype.all=function(){return this.priorityQueue.slice(0,this.numberOfElements+1)},e.prototype.max=function(){return this.priorityQueue[0]},e.prototype.swim=function(e){for(;e>0&&this.less(half(e),e);)this.exchange(e,half(e)),e=half(e)},e.prototype.sink=function(e){for(;2*e<=this.numberOfElements;){var t=2*e;if(t<this.numberOfElements&&this.less(t,t+1)&&t++,!this.less(e,t))break;this.exchange(e,t),e=t}},e.prototype.getValueAt=function(e){return this.getElementValue(this.priorityQueue[e])},e.prototype.less=function(e,t){return this.getValueAt(e)<this.getValueAt(t)},e.prototype.exchange=function(e,t){var n=this.priorityQueue[e];this.priorityQueue[e]=this.priorityQueue[t],this.priorityQueue[t]=n},e}();function scoreIsMaximumInLocalWindow(e,t,n,r,o,i){for(var a=i.shape,s=a[0],d=a[1],u=!0,l=Math.max(n-o,0),f=Math.min(n+o+1,s),c=l;c<f;++c){for(var p=Math.max(r-o,0),h=Math.min(r+o+1,d),m=p;m<h;++m)if(i.get(c,m,e)>t){u=!1;break}if(!u)break}return u}function buildPartWithScoreQueue(e,t,n){for(var r=n.shape,o=r[0],i=r[1],a=r[2],s=new MaxHeap(o*i*a,function(e){return e.score}),d=0;d<o;++d)for(var u=0;u<i;++u)for(var l=0;l<a;++l){var f=n.get(d,u,l);f<e||scoreIsMaximumInLocalWindow(l,f,d,u,t,n)&&s.enqueue({score:f,part:{heatmapY:d,heatmapX:u,id:l}})}return s}var parentChildrenTuples=POSE_CHAIN.map(function(e){var t=e[0],n=e[1];return[PART_IDS[t],PART_IDS[n]]}),parentToChildEdges=parentChildrenTuples.map(function(e){return e[1]}),childToParentEdges=parentChildrenTuples.map(function(e){return e[0]});function getDisplacement(e,t,n){var r=n.shape[2]/2;return{y:n.get(t.y,t.x,e),x:n.get(t.y,t.x,r+e)}}function getStridedIndexNearPoint(e,t,n,r){return{y:clamp(Math.round(e.y/t),0,n-1),x:clamp(Math.round(e.x/t),0,r-1)}}function traverseToTargetKeypoint(e,t,n,r,o,i,a,s){void 0===s&&(s=2);for(var d=r.shape,u=d[0],l=d[1],f=getDisplacement(e,getStridedIndexNearPoint(t.position,i,u,l),a),c=addVectors(t.position,f),p=0;p<s;p++){var h=getStridedIndexNearPoint(c,i,u,l),m=getOffsetPoint(h.y,h.x,n,o);c=addVectors({x:h.x*i,y:h.y*i},{x:m.x,y:m.y})}var g=getStridedIndexNearPoint(c,i,u,l),v=r.get(g.y,g.x,n);return{position:c,part:PART_NAMES[n],score:v}}function decodePose(e,t,n,r,o,i){var a=t.shape[2],s=parentToChildEdges.length,d=new Array(a),u=e.part,l=e.score,f=getImageCoords(u,r,n);d[u.id]={score:l,part:PART_NAMES[u.id],position:f};for(var c=s-1;c>=0;--c){var p=parentToChildEdges[c],h=childToParentEdges[c];d[p]&&!d[h]&&(d[h]=traverseToTargetKeypoint(c,d[p],h,t,n,r,i))}for(c=0;c<s;++c){p=childToParentEdges[c],h=parentToChildEdges[c];d[p]&&!d[h]&&(d[h]=traverseToTargetKeypoint(c,d[p],h,t,n,r,o))}return d}function withinNmsRadiusOfCorrespondingPoint(e,t,n,r){var o=n.x,i=n.y;return e.some(function(e){var n=e.keypoints[r].position;return squaredDistance(i,o,n.y,n.x)<=t})}function getInstanceScore(e,t,n){return n.reduce(function(n,r,o){var i=r.position,a=r.score;return withinNmsRadiusOfCorrespondingPoint(e,t,i,o)||(n+=a),n},0)/n.length}var kLocalMaximumRadius=1;function decodeMultiplePoses(e,t,n,r,o,i,a,s){void 0===a&&(a=.5),void 0===s&&(s=20);for(var d=[],u=buildPartWithScoreQueue(a,kLocalMaximumRadius,e),l=s*s;d.length<i&&!u.empty();){var f=u.dequeue();if(!withinNmsRadiusOfCorrespondingPoint(d,l,getImageCoords(f.part,o,t),f.part.id)){var c=decodePose(f,e,t,o,n,r),p=getInstanceScore(d,l,c);d.push({keypoints:c,score:p})}}return d}var _a,imageNetMean=[-123.15,-115.9,-103.06],ResNet=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.preprocessInput=function(e){return e.add(imageNetMean)},t.prototype.nameOutputResults=function(e){var t=e[0],n=e[1],r=e[2],o=e[3],i=e[4],a=e[5];return{offsets:i,segmentation:e[6],partHeatmaps:a,longOffsets:o,heatmap:r,displacementFwd:n,displacementBwd:t,partOffsets:e[7]}},t}(BaseModel),RESNET50_BASE_URL="https://storage.googleapis.com/tfjs-models/savedmodel/bodypix/resnet50/",MOBILENET_BASE_URL="https://storage.googleapis.com/tfjs-models/savedmodel/bodypix/mobilenet/";function resNet50SavedModel(e,t){var n="model-stride"+e+".json";return 4===t?RESNET50_BASE_URL+"float/"+n:RESNET50_BASE_URL+"quant"+t+"/"+n}function mobileNetSavedModel(e,t,n){var r={1:"100",.75:"075",.5:"050"},o="model-stride"+e+".json";return 4===n?MOBILENET_BASE_URL+"float/"+r[t]+"/"+o:MOBILENET_BASE_URL+"quant"+n+"/"+r[t]+"/"+o}function getSizeFromImageLikeElement(e){if(0!==e.offsetHeight&&0!==e.offsetWidth)return[e.offsetHeight,e.offsetWidth];if(null!=e.height&&null!=e.width)return[e.height,e.width];throw new Error("HTMLImageElement must have height and width attributes set.")}function getSizeFromVideoElement(e){return null!=e.height&&null!=e.width?[e.height,e.width]:[e.videoHeight,e.videoWidth]}function getInputSize(e){if("undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)return getSizeFromImageLikeElement(e);if("undefined"!=typeof ImageData&&e instanceof ImageData)return[e.height,e.width];if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)return getSizeFromVideoElement(e);if(e instanceof Tensor)return[e.shape[0],e.shape[1]];throw new Error("error: Unknown input type: "+e+".")}function isValidInputResolution(e,t){return(e-1)%t==0}function toValidInputResolution(e,t){return isValidInputResolution(e,t)?e:Math.floor(e/t)*t+1}var INTERNAL_RESOLUTION_STRING_OPTIONS={low:"low",medium:"medium",high:"high",full:"full"},INTERNAL_RESOLUTION_PERCENTAGES=((_a={})[INTERNAL_RESOLUTION_STRING_OPTIONS.low]=.25,_a[INTERNAL_RESOLUTION_STRING_OPTIONS.medium]=.5,_a[INTERNAL_RESOLUTION_STRING_OPTIONS.high]=.75,_a[INTERNAL_RESOLUTION_STRING_OPTIONS.full]=1,_a),MIN_INTERNAL_RESOLUTION=.1,MAX_INTERNAL_RESOLUTION=2;function toInternalResolutionPercentage(e){if("string"==typeof e){var t=INTERNAL_RESOLUTION_PERCENTAGES[e];return util.assert("number"==typeof t,function(){return"string value of inputResolution must be one of "+Object.values(INTERNAL_RESOLUTION_STRING_OPTIONS).join(",")+" but was "+e+"."}),t}return util.assert("number"==typeof e&&e<=MAX_INTERNAL_RESOLUTION&&e>=MIN_INTERNAL_RESOLUTION,function(){return"inputResolution must be a string or number between 0 and 4, but was "+e}),e}function toInputResolutionHeightAndWidth(e,t,n){var r=n[0],o=n[1],i=toInternalResolutionPercentage(e);return[toValidInputResolution(r*i,t),toValidInputResolution(o*i,t)]}function toInputTensor(e){return e instanceof Tensor?e:browser.fromPixels(e)}function resizeAndPadTo(e,t,n){var r=t[0],o=t[1];void 0===n&&(n=!1);var i,a,s,d,u,l,f=e.shape,c=f[0],p=f[1]/c;if(p>o/r){i=o;var h=r-(a=Math.ceil(i/p));s=0,d=0,u=Math.floor(h/2),l=r-(a+u)}else{a=r;var m=o-(i=Math.ceil(r*p));s=Math.floor(m/2),d=o-(i+s),u=0,l=0}return{resizedAndPadded:tidy(function(){var t;return t=n?e.reverse(1).resizeBilinear([a,i]):e.resizeBilinear([a,i]),pad3d(t,[[u,l],[s,d],[0,0]])}),paddedBy:[[u,l],[s,d]]}}function scaleAndCropToInputTensorShape(e,t,n,r,o){var i=t[0],a=t[1],s=n[0],d=n[1],u=r[0],l=u[0],f=u[1],c=r[1],p=c[0],h=c[1];return void 0===o&&(o=!1),tidy(function(){var t=e.resizeBilinear([s,d],!0);return o&&(t=t.sigmoid()),removePaddingAndResizeBack(t,[i,a],[[l,f],[p,h]])})}function removePaddingAndResizeBack(e,t,n){var r=t[0],o=t[1],i=n[0],a=i[0],s=i[1],d=n[1],u=d[0],l=d[1];return tidy(function(){return image.cropAndResize(e.expandDims(),[[a/(r+a+s-1),u/(o+u+l-1),(a+r-1)/(r+a+s-1),(u+o-1)/(o+u+l-1)]],[0],[r,o]).squeeze([0])})}function padAndResizeTo(e,t){var n=t[0],r=t[1],o=getInputSize(e),i=o[0],a=o[1],s=r/n,d=[0,0,0,0],u=d[0],l=d[1],f=d[2],c=d[3];return a/i<s?(u=0,l=0,f=Math.round(.5*(s*i-a)),c=Math.round(.5*(s*i-a))):(u=Math.round(.5*(1/s*a-i)),l=Math.round(.5*(1/s*a-i)),f=0,c=0),{resized:tidy(function(){var t=toInputTensor(e);return(t=pad3d(t,[[u,l],[f,c],[0,0]])).resizeBilinear([n,r])}),padding:{top:u,left:f,right:c,bottom:l}}}function toTensorBuffers3D(e){return __awaiter(this,void 0,void 0,function(){return __generator(this,function(t){return[2,Promise.all(e.map(function(e){return e.buffer()}))]})})}function scalePose(e,t,n,r,o){return void 0===r&&(r=0),void 0===o&&(o=0),{score:e.score,keypoints:e.keypoints.map(function(e){var i=e.score,a=e.part,s=e.position;return{score:i,part:a,position:{x:s.x*n+o,y:s.y*t+r}}})}}function scalePoses(e,t,n,r,o){return void 0===r&&(r=0),void 0===o&&(o=0),1===n&&1===t&&0===r&&0===o?e:e.map(function(e){return scalePose(e,t,n,r,o)})}function flipPoseHorizontal(e,t){return{score:e.score,keypoints:e.keypoints.map(function(e){var n=e.score,r=e.part,o=e.position;return{score:n,part:r,position:{x:t-1-o.x,y:o.y}}})}}function flipPosesHorizontal(e,t){return t<=0?e:e.map(function(e){return flipPoseHorizontal(e,t)})}function scaleAndFlipPoses(e,t,n,r,o){var i=t[0],a=t[1],s=n[0],d=n[1],u=scalePoses(e,(i+r.top+r.bottom)/s,(a+r.left+r.right)/d,-r.top,-r.left);return o?flipPosesHorizontal(u,a):u}var APPLY_SIGMOID_ACTIVATION=!0,FLIP_POSES_AFTER_SCALING=!1,MOBILENET_V1_CONFIG={architecture:"MobileNetV1",outputStride:16,quantBytes:4,multiplier:.75},VALID_ARCHITECTURE=["MobileNetV1","ResNet50"],VALID_STRIDE={MobileNetV1:[8,16,32],ResNet50:[32,16]},VALID_MULTIPLIER={MobileNetV1:[.5,.75,1],ResNet50:[1]},VALID_QUANT_BYTES=[1,2,4];function validateModelConfig(e){if(null==(e=e||MOBILENET_V1_CONFIG).architecture&&(e.architecture="MobileNetV1"),VALID_ARCHITECTURE.indexOf(e.architecture)<0)throw new Error("Invalid architecture "+e.architecture+". Should be one of "+VALID_ARCHITECTURE);if(null==e.outputStride&&(e.outputStride=16),VALID_STRIDE[e.architecture].indexOf(e.outputStride)<0)throw new Error("Invalid outputStride "+e.outputStride+". Should be one of "+VALID_STRIDE[e.architecture]+" for architecture "+e.architecture+".");if(null==e.multiplier&&(e.multiplier=1),VALID_MULTIPLIER[e.architecture].indexOf(e.multiplier)<0)throw new Error("Invalid multiplier "+e.multiplier+". Should be one of "+VALID_MULTIPLIER[e.architecture]+" for architecture "+e.architecture+".");if(null==e.quantBytes&&(e.quantBytes=4),VALID_QUANT_BYTES.indexOf(e.quantBytes)<0)throw new Error("Invalid quantBytes "+e.quantBytes+". Should be one of "+VALID_QUANT_BYTES+" for architecture "+e.architecture+".");return e}var PERSON_INFERENCE_CONFIG={flipHorizontal:!1,internalResolution:"medium",segmentationThreshold:.7,maxDetections:10,scoreThreshold:.4,nmsRadius:20},MULTI_PERSON_INSTANCE_INFERENCE_CONFIG={flipHorizontal:!1,internalResolution:"medium",segmentationThreshold:.7,maxDetections:10,scoreThreshold:.4,nmsRadius:20,minKeypointScore:.3,refineSteps:10};function validatePersonInferenceConfig(e){var t=e.segmentationThreshold,n=e.maxDetections,r=e.scoreThreshold,o=e.nmsRadius;if(t<0||t>1)throw new Error("segmentationThreshold "+t+". Should be in range [0.0, 1.0]");if(n<=0)throw new Error("Invalid maxDetections "+n+". Should be > 0");if(r<0||r>1)throw new Error("Invalid scoreThreshold "+r+". Should be in range [0.0, 1.0]");if(o<=0)throw new Error("Invalid nmsRadius "+o+".")}function validateMultiPersonInstanceInferenceConfig(e){var t=e.segmentationThreshold,n=e.maxDetections,r=e.scoreThreshold,o=e.nmsRadius,i=e.minKeypointScore,a=e.refineSteps;if(t<0||t>1)throw new Error("segmentationThreshold "+t+". Should be in range [0.0, 1.0]");if(n<=0)throw new Error("Invalid maxDetections "+n+". Should be > 0");if(r<0||r>1)throw new Error("Invalid scoreThreshold "+r+". Should be in range [0.0, 1.0]");if(o<=0)throw new Error("Invalid nmsRadius "+o+".");if(i<0||i>1)throw new Error("Invalid minKeypointScore "+i+".Should be in range [0.0, 1.0]");if(a<=0||a>20)throw new Error("Invalid refineSteps "+a+".Should be in range [1, 20]")}var BodyPix=function(){function e(e){this.baseModel=e}return e.prototype.predictForPersonSegmentation=function(e){var t=this.baseModel.predict(e);return{segmentLogits:t.segmentation,heatmapScores:t.heatmapScores,offsets:t.offsets,displacementFwd:t.displacementFwd,displacementBwd:t.displacementBwd}},e.prototype.predictForPersonSegmentationAndPart=function(e){var t=this.baseModel.predict(e);return{segmentLogits:t.segmentation,partHeatmapLogits:t.partHeatmaps,heatmapScores:t.heatmapScores,offsets:t.offsets,displacementFwd:t.displacementFwd,displacementBwd:t.displacementBwd}},e.prototype.predictForMultiPersonInstanceSegmentationAndPart=function(e){var t=this.baseModel.predict(e);return{segmentLogits:t.segmentation,longOffsets:t.longOffsets,heatmapScores:t.heatmapScores,offsets:t.offsets,displacementFwd:t.displacementFwd,displacementBwd:t.displacementBwd,partHeatmaps:t.partHeatmaps}},e.prototype.segmentPersonActivation=function(e,t,n){var r=this;void 0===n&&(n=.5);var o=getInputSize(e),i=o[0],a=o[1],s=toInputResolutionHeightAndWidth(t,this.baseModel.outputStride,[i,a]),d=padAndResizeTo(e,s),u=d.resized,l=d.padding,f=tidy(function(){var e=r.predictForPersonSegmentation(u),t=e.segmentLogits,o=e.heatmapScores,s=e.offsets,d=e.displacementFwd,f=e.displacementBwd,c=u.shape,p=c[0],h=c[1];return{segmentation:toMaskTensor(scaleAndCropToInputTensorShape(t,[i,a],[p,h],[[l.top,l.bottom],[l.left,l.right]],APPLY_SIGMOID_ACTIVATION).squeeze(),n),heatmapScores:o,offsets:s,displacementFwd:d,displacementBwd:f}}),c=f.segmentation,p=f.heatmapScores,h=f.offsets,m=f.displacementFwd,g=f.displacementBwd;return u.dispose(),{segmentation:c,heatmapScores:p,offsets:h,displacementFwd:m,displacementBwd:g,padding:l,internalResolutionHeightAndWidth:s}},e.prototype.segmentPerson=function(e,t){return void 0===t&&(t=PERSON_INFERENCE_CONFIG),__awaiter(this,void 0,void 0,function(){var n,r,o,i,a,s,d,u,l,f,c,p,h,m,g,v,S,_;return __generator(this,function(I){switch(I.label){case 0:return validatePersonInferenceConfig(t=__assign({},PERSON_INFERENCE_CONFIG,t)),n=this.segmentPersonActivation(e,t.internalResolution,t.segmentationThreshold),r=n.segmentation,o=n.heatmapScores,i=n.offsets,a=n.displacementFwd,s=n.displacementBwd,d=n.padding,u=n.internalResolutionHeightAndWidth,l=r.shape,f=l[0],c=l[1],[4,r.data()];case 1:return p=I.sent(),r.dispose(),[4,toTensorBuffers3D([o,i,a,s])];case 2:return h=I.sent(),m=h[0],g=h[1],v=h[2],S=h[3],_=scaleAndFlipPoses(_=decodeMultiplePoses(m,g,v,S,this.baseModel.outputStride,t.maxDetections,t.scoreThreshold,t.nmsRadius),[f,c],u,d,FLIP_POSES_AFTER_SCALING),o.dispose(),i.dispose(),a.dispose(),s.dispose(),[2,{height:f,width:c,data:p,allPoses:_}]}})})},e.prototype.segmentMultiPerson=function(e,t){return void 0===t&&(t=MULTI_PERSON_INSTANCE_INFERENCE_CONFIG),__awaiter(this,void 0,void 0,function(){var n,r,o,i,a,s,d,u,l,f,c,p,h,m,g,v,S,_,I,w,E,T=this;return __generator(this,function(N){switch(N.label){case 0:return validateMultiPersonInstanceInferenceConfig(t=__assign({},MULTI_PERSON_INSTANCE_INFERENCE_CONFIG,t)),n=getInputSize(e),r=n[0],o=n[1],i=toInputResolutionHeightAndWidth(t.internalResolution,this.baseModel.outputStride,[r,o]),a=padAndResizeTo(e,i),s=a.resized,d=a.padding,u=tidy(function(){var e,n=T.predictForMultiPersonInstanceSegmentationAndPart(s),a=n.segmentLogits,u=n.longOffsets,l=n.heatmapScores,f=n.offsets,c=n.displacementFwd,p=n.displacementBwd;return e=u,{segmentation:toMaskTensor(scaleAndCropToInputTensorShape(a,[r,o],i,[[d.top,d.bottom],[d.left,d.right]],APPLY_SIGMOID_ACTIVATION).squeeze(),t.segmentationThreshold),longOffsets:e,heatmapScoresRaw:l,offsetsRaw:f,displacementFwdRaw:c,displacementBwdRaw:p}}),l=u.segmentation,f=u.longOffsets,c=u.heatmapScoresRaw,p=u.offsetsRaw,h=u.displacementFwdRaw,m=u.displacementBwdRaw,[4,toTensorBuffers3D([c,p,h,m])];case 1:return g=N.sent(),v=g[0],S=g[1],_=g[2],I=g[3],w=scaleAndFlipPoses(w=decodeMultiplePoses(v,S,_,I,this.baseModel.outputStride,t.maxDetections,t.scoreThreshold,t.nmsRadius),[r,o],i,d,FLIP_POSES_AFTER_SCALING),[4,decodePersonInstanceMasks(l,f,w,r,o,this.baseModel.outputStride,i,d,t.scoreThreshold,t.refineSteps,t.minKeypointScore,t.maxDetections)];case 2:return E=N.sent(),s.dispose(),l.dispose(),f.dispose(),c.dispose(),p.dispose(),h.dispose(),m.dispose(),[2,E]}})})},e.prototype.segmentPersonPartsActivation=function(e,t,n){var r=this;void 0===n&&(n=.5);var o=getInputSize(e),i=o[0],a=o[1],s=toInputResolutionHeightAndWidth(t,this.baseModel.outputStride,[i,a]),d=padAndResizeTo(e,s),u=d.resized,l=d.padding,f=tidy(function(){var e=r.predictForPersonSegmentationAndPart(u),t=e.segmentLogits,o=e.partHeatmapLogits,s=e.heatmapScores,d=e.offsets,f=e.displacementFwd,c=e.displacementBwd,p=u.shape,h=p[0],m=p[1],g=scaleAndCropToInputTensorShape(t,[i,a],[h,m],[[l.top,l.bottom],[l.left,l.right]],APPLY_SIGMOID_ACTIVATION),v=scaleAndCropToInputTensorShape(o,[i,a],[h,m],[[l.top,l.bottom],[l.left,l.right]],APPLY_SIGMOID_ACTIVATION);return{partSegmentation:decodePartSegmentation(toMaskTensor(g.squeeze(),n),v),heatmapScores:s,offsets:d,displacementFwd:f,displacementBwd:c}}),c=f.partSegmentation,p=f.heatmapScores,h=f.offsets,m=f.displacementFwd,g=f.displacementBwd;return u.dispose(),{partSegmentation:c,heatmapScores:p,offsets:h,displacementFwd:m,displacementBwd:g,padding:l,internalResolutionHeightAndWidth:s}},e.prototype.segmentPersonParts=function(e,t){return void 0===t&&(t=PERSON_INFERENCE_CONFIG),__awaiter(this,void 0,void 0,function(){var n,r,o,i,a,s,d,u,l,f,c,p,h,m,g,v,S,_;return __generator(this,function(I){switch(I.label){case 0:return validatePersonInferenceConfig(t=__assign({},PERSON_INFERENCE_CONFIG,t)),n=this.segmentPersonPartsActivation(e,t.internalResolution,t.segmentationThreshold),r=n.partSegmentation,o=n.heatmapScores,i=n.offsets,a=n.displacementFwd,s=n.displacementBwd,d=n.padding,u=n.internalResolutionHeightAndWidth,l=r.shape,f=l[0],c=l[1],[4,r.data()];case 1:return p=I.sent(),r.dispose(),[4,toTensorBuffers3D([o,i,a,s])];case 2:return h=I.sent(),m=h[0],g=h[1],v=h[2],S=h[3],_=scaleAndFlipPoses(_=decodeMultiplePoses(m,g,v,S,this.baseModel.outputStride,t.maxDetections,t.scoreThreshold,t.nmsRadius),[f,c],u,d,FLIP_POSES_AFTER_SCALING),o.dispose(),i.dispose(),a.dispose(),s.dispose(),[2,{height:f,width:c,data:p,allPoses:_}]}})})},e.prototype.segmentMultiPersonParts=function(e,t){return void 0===t&&(t=MULTI_PERSON_INSTANCE_INFERENCE_CONFIG),__awaiter(this,void 0,void 0,function(){var n,r,o,i,a,s,d,u,l,f,c,p,h,m,g,v,S,_,I,w,E,T,N=this;return __generator(this,function(A){switch(A.label){case 0:return validateMultiPersonInstanceInferenceConfig(t=__assign({},MULTI_PERSON_INSTANCE_INFERENCE_CONFIG,t)),n=getInputSize(e),r=n[0],o=n[1],i=toInputResolutionHeightAndWidth(t.internalResolution,this.baseModel.outputStride,[r,o]),a=padAndResizeTo(e,i),s=a.resized,d=a.padding,u=tidy(function(){var e=N.predictForMultiPersonInstanceSegmentationAndPart(s),n=e.segmentLogits,a=e.longOffsets,u=e.heatmapScores,l=e.offsets,f=e.displacementFwd,c=e.displacementBwd,p=e.partHeatmaps,h=scaleAndCropToInputTensorShape(n,[r,o],i,[[d.top,d.bottom],[d.left,d.right]],APPLY_SIGMOID_ACTIVATION),m=scaleAndCropToInputTensorShape(p,[r,o],i,[[d.top,d.bottom],[d.left,d.right]],APPLY_SIGMOID_ACTIVATION),g=a;return{segmentation:toMaskTensor(h.squeeze(),t.segmentationThreshold),longOffsets:g,heatmapScoresRaw:u,offsetsRaw:l,displacementFwdRaw:f,displacementBwdRaw:c,partSegmentation:decodeOnlyPartSegmentation(m)}}),l=u.segmentation,f=u.longOffsets,c=u.heatmapScoresRaw,p=u.offsetsRaw,h=u.displacementFwdRaw,m=u.displacementBwdRaw,g=u.partSegmentation,[4,toTensorBuffers3D([c,p,h,m])];case 1:return v=A.sent(),S=v[0],_=v[1],I=v[2],w=v[3],E=scaleAndFlipPoses(E=decodeMultiplePoses(S,_,I,w,this.baseModel.outputStride,t.maxDetections,t.scoreThreshold,t.nmsRadius),[r,o],i,d,FLIP_POSES_AFTER_SCALING),[4,decodePersonInstancePartMasks(l,f,g,E,r,o,this.baseModel.outputStride,i,d,t.scoreThreshold,t.refineSteps,t.minKeypointScore,t.maxDetections)];case 2:return T=A.sent(),s.dispose(),l.dispose(),f.dispose(),c.dispose(),p.dispose(),h.dispose(),m.dispose(),g.dispose(),[2,T]}})})},e.prototype.dispose=function(){this.baseModel.dispose()},e}();function loadMobileNet(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,o,i,a;return __generator(this,function(s){switch(s.label){case 0:if(t=e.outputStride,n=e.quantBytes,r=e.multiplier,null==tf)throw new Error("Cannot find TensorFlow.js. If you are using a <script> tag, please also include @tensorflow/tfjs on the page before using this\n model.");return o=mobileNetSavedModel(t,r,n),[4,loadGraphModel(e.modelUrl||o)];case 1:return i=s.sent(),a=new MobileNet(i,t),[2,new BodyPix(a)]}})})}function loadResNet(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,o,i;return __generator(this,function(a){switch(a.label){case 0:if(t=e.outputStride,n=e.quantBytes,null==tf)throw new Error("Cannot find TensorFlow.js. If you are using a <script> tag, please also include @tensorflow/tfjs on the page before using this\n model.");return r=resNet50SavedModel(t,n),[4,loadGraphModel(e.modelUrl||r)];case 1:return o=a.sent(),i=new ResNet(o,t),[2,new BodyPix(i)]}})})}function load(e){return void 0===e&&(e=MOBILENET_V1_CONFIG),__awaiter(this,void 0,void 0,function(){return __generator(this,function(t){return"ResNet50"===(e=validateModelConfig(e)).architecture?[2,loadResNet(e)]:"MobileNetV1"===e.architecture?[2,loadMobileNet(e)]:[2,null]})})}function cpuBlur(e,t,n){for(var r=e.getContext("2d"),o=0,i=1/(2*Math.PI*5*5),a=n<3?1:2,s=-n;s<=n;s+=a)for(var d=-n;d<=n;d+=a){o+=i*Math.exp(-(d*d+s*s)/50)}for(s=-n;s<=n;s+=a)for(d=-n;d<=n;d+=a)r.globalAlpha=i*Math.exp(-(d*d+s*s)/50)/o*n,r.drawImage(t,d,s);r.globalAlpha=1}var offScreenCanvases={};function isSafari(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function assertSameDimensions(e,t,n,r){var o=e.width,i=e.height,a=t.width,s=t.height;if(o!==a||i!==s)throw new Error("error: dimensions must match. "+n+" has dimensions "+o+"x"+i+", "+r+" has dimensions "+a+"x"+s)}function flipCanvasHorizontal(e){var t=e.getContext("2d");t.scale(-1,1),t.translate(-e.width,0)}function drawWithCompositing(e,t,n){e.globalCompositeOperation=n,e.drawImage(t,0,0)}function createOffScreenCanvas(){return document.createElement("canvas")}function ensureOffscreenCanvasCreated(e){return offScreenCanvases[e]||(offScreenCanvases[e]=createOffScreenCanvas()),offScreenCanvases[e]}function drawAndBlurImageOnCanvas(e,t,n){var r=e.height,o=e.width,i=n.getContext("2d");n.width=o,n.height=r,i.clearRect(0,0,o,r),i.save(),isSafari()?cpuBlur(n,e,t):(i.filter="blur("+t+"px)",i.drawImage(e,0,0,o,r)),i.restore()}function drawAndBlurImageOnOffScreenCanvas(e,t,n){var r=ensureOffscreenCanvasCreated(n);return 0===t?renderImageToCanvas(e,r):drawAndBlurImageOnCanvas(e,t,r),r}function renderImageToCanvas(e,t){var n=e.width,r=e.height;t.width=n,t.height=r,t.getContext("2d").drawImage(e,0,0,n,r)}function renderImageDataToCanvas(e,t){t.width=e.width,t.height=e.height,t.getContext("2d").putImageData(e,0,0)}function renderImageDataToOffScreenCanvas(e,t){var n=ensureOffscreenCanvasCreated(t);return renderImageDataToCanvas(e,n),n}function toMask(e,t,n,r,o){if(void 0===t&&(t={r:0,g:0,b:0,a:0}),void 0===n&&(n={r:0,g:0,b:0,a:255}),void 0===r&&(r=!1),void 0===o&&(o=[1]),Array.isArray(e)&&0===e.length)return null;var i,a=(i=Array.isArray(e)?e:[e])[0],s=a.width,d=a.height,u=new Uint8ClampedArray(s*d*4);function l(e,t,n,r,o,i){void 0===i&&(i={r:0,g:255,b:255,a:255});for(var a=-o;a<=o;a++)for(var s=-o;s<=o;s++)if(0!==a&&0!==s){var d=(t+a)*r+(n+s);e[4*d+0]=i.r,e[4*d+1]=i.g,e[4*d+2]=i.b,e[4*d+3]=i.a}}function f(e,t,n,r,o,i){void 0===o&&(o=[1]),void 0===i&&(i=1);for(var a=0,s=-i;s<=i;s++)for(var d=function(i){if(0!==s&&0!==i){var d=(t+s)*r+(n+i);o.some(function(t){return t===e[d]})||(a+=1)}},u=-i;u<=i;u++)d(u);return a>0}for(var c=0;c<d;c+=1)for(var p=function(e){var a=c*s+e;u[4*a+0]=n.r,u[4*a+1]=n.g,u[4*a+2]=n.b,u[4*a+3]=n.a;for(var p=function(n){if(o.some(function(e){return e===i[n].data[a]})){u[4*a]=t.r,u[4*a+1]=t.g,u[4*a+2]=t.b,u[4*a+3]=t.a;var p=f(i[n].data,c,e,s,o);r&&c-1>=0&&c+1<d&&e-1>=0&&e+1<s&&p&&l(u,c,e,s,1)}},h=0;h<i.length;h++)p(h)},h=0;h<s;h+=1)p(h);return new ImageData(u,s,d)}var RAINBOW_PART_COLORS=[[110,64,170],[143,61,178],[178,60,178],[210,62,167],[238,67,149],[255,78,125],[255,94,99],[255,115,75],[255,140,56],[239,167,47],[217,194,49],[194,219,64],[175,240,91],[135,245,87],[96,247,96],[64,243,115],[40,234,141],[28,219,169],[26,199,194],[33,176,213],[47,150,224],[65,125,224],[84,101,214],[99,81,195]];function toColoredPartMask(e,t){if(void 0===t&&(t=RAINBOW_PART_COLORS),Array.isArray(e)&&0===e.length)return null;for(var n,r=(n=Array.isArray(e)?e:[e])[0],o=r.width,i=r.height,a=new Uint8ClampedArray(o*i*4),s=0;s<i*o;++s){var d=4*s;a[d+0]=255,a[d+1]=255,a[d+2]=255,a[d+3]=255;for(var u=0;u<n.length;u++){var l=n[u].data[s];if(-1!==l){var f=t[l];if(!f)throw new Error("No color could be found for part id "+l);a[d+0]=f[0],a[d+1]=f[1],a[d+2]=f[2],a[d+3]=255}}}return new ImageData(a,o,i)}var CANVAS_NAMES={blurred:"blurred",blurredMask:"blurred-mask",mask:"mask",lowresPartMask:"lowres-part-mask"};function drawMask(e,t,n,r,o,i){void 0===r&&(r=.7),void 0===o&&(o=0),void 0===i&&(i=!1);var a=getInputSize(t),s=a[0],d=a[1];e.width=d,e.height=s;var u=e.getContext("2d");if(u.save(),i&&flipCanvasHorizontal(e),u.drawImage(t,0,0),u.globalAlpha=r,n){assertSameDimensions({width:d,height:s},n,"image","mask");var l=drawAndBlurImageOnOffScreenCanvas(renderImageDataToOffScreenCanvas(n,CANVAS_NAMES.mask),o,CANVAS_NAMES.blurredMask);u.drawImage(l,0,0,d,s)}u.restore()}function drawPixelatedMask(e,t,n,r,o,i,a){void 0===r&&(r=.7),void 0===o&&(o=0),void 0===i&&(i=!1),void 0===a&&(a=10);var s=getInputSize(t),d=s[0];assertSameDimensions({width:s[1],height:d},n,"image","mask");var u=drawAndBlurImageOnOffScreenCanvas(renderImageDataToOffScreenCanvas(n,CANVAS_NAMES.mask),o,CANVAS_NAMES.blurredMask);e.width=u.width,e.height=u.height;var l=e.getContext("2d");l.save(),i&&flipCanvasHorizontal(e);var f=ensureOffscreenCanvasCreated(CANVAS_NAMES.lowresPartMask),c=f.getContext("2d");f.width=u.width*(1/a),f.height=u.height*(1/a),c.drawImage(u,0,0,u.width,u.height,0,0,f.width,f.height),l.imageSmoothingEnabled=!1,l.drawImage(f,0,0,f.width,f.height,0,0,e.width,e.height);for(var p=0;p<f.width;p++)l.beginPath(),l.strokeStyle="#ffffff",l.moveTo(a*p,0),l.lineTo(a*p,e.height),l.stroke();for(p=0;p<f.height;p++)l.beginPath(),l.strokeStyle="#ffffff",l.moveTo(0,a*p),l.lineTo(e.width,a*p),l.stroke();l.globalAlpha=1-r,l.drawImage(t,0,0,u.width,u.height),l.restore()}function createPersonMask(e,t){var n=renderImageDataToOffScreenCanvas(toMask(e,{r:0,g:0,b:0,a:255},{r:0,g:0,b:0,a:0}),CANVAS_NAMES.mask);return 0===t?n:drawAndBlurImageOnOffScreenCanvas(n,t,CANVAS_NAMES.blurredMask)}function drawBokehEffect(e,t,n,r,o,i){void 0===r&&(r=3),void 0===o&&(o=3),void 0===i&&(i=!1);var a=drawAndBlurImageOnOffScreenCanvas(t,r,CANVAS_NAMES.blurred);e.width=a.width,e.height=a.height;var s=e.getContext("2d");if(Array.isArray(n)&&0===n.length)s.drawImage(a,0,0);else{var d=createPersonMask(n,o);s.save(),i&&flipCanvasHorizontal(e);var u=getInputSize(t),l=u[0],f=u[1];s.drawImage(t,0,0,f,l),drawWithCompositing(s,d,"destination-in"),drawWithCompositing(s,a,"destination-over"),s.restore()}}function createBodyPartMask(e,t,n){var r=renderImageDataToOffScreenCanvas(toMask(e,{r:0,g:0,b:0,a:0},{r:0,g:0,b:0,a:255},!0,t),CANVAS_NAMES.mask);return 0===n?r:drawAndBlurImageOnOffScreenCanvas(r,n,CANVAS_NAMES.blurredMask)}function blurBodyPart(e,t,n,r,o,i,a){void 0===r&&(r=[0,1]),void 0===o&&(o=3),void 0===i&&(i=3),void 0===a&&(a=!1);var s=drawAndBlurImageOnOffScreenCanvas(t,o,CANVAS_NAMES.blurred);e.width=s.width,e.height=s.height;var d=e.getContext("2d");if(Array.isArray(n)&&0===n.length)d.drawImage(s,0,0);else{var u=createBodyPartMask(n,r,i);d.save(),a&&flipCanvasHorizontal(e);var l=getInputSize(t),f=l[0],c=l[1];d.drawImage(t,0,0,c,f),drawWithCompositing(d,u,"destination-in"),drawWithCompositing(d,s,"destination-over"),d.restore()}}var PART_CHANNELS=["left_face","right_face","left_upper_arm_front","left_upper_arm_back","right_upper_arm_front","right_upper_arm_back","left_lower_arm_front","left_lower_arm_back","right_lower_arm_front","right_lower_arm_back","left_hand","right_hand","torso_front","torso_back","left_upper_leg_front","left_upper_leg_back","right_upper_leg_front","right_upper_leg_back","left_lower_leg_front","left_lower_leg_back","right_lower_leg_front","right_lower_leg_back","left_feet","right_feet"];export{BodyPix,load,blurBodyPart,drawBokehEffect,drawMask,drawPixelatedMask,toColoredPartMask,toMask,PART_CHANNELS,flipPoseHorizontal,resizeAndPadTo,scaleAndCropToInputTensorShape}; //# sourceMappingURL=body-pix.esm.js.map