mirror of
https://github.com/jech/galene.git
synced 2024-12-22 15:25:48 +01:00
bf46a9d6c1
This doesn't currently do anything useful, since we're running tflite on the CPU, but might avoid bugs if we get GPU support.
63 lines
1.7 KiB
JavaScript
63 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
let imageSegmenter;
|
|
|
|
async function loadImageSegmenter() {
|
|
let module = await import('/third-party/tasks-vision/vision_bundle.mjs');
|
|
|
|
let vision = await module.FilesetResolver.forVisionTasks(
|
|
"/third-party/tasks-vision/wasm"
|
|
);
|
|
|
|
imageSegmenter =
|
|
await module.ImageSegmenter.createFromOptions(vision, {
|
|
baseOptions: {
|
|
modelAssetPath: '/third-party/tasks-vision/models/selfie_segmenter.tflite',
|
|
},
|
|
outputCategoryMask: true,
|
|
outputConfidenceMasks: false,
|
|
runningMode: 'VIDEO',
|
|
});
|
|
}
|
|
|
|
loadImageSegmenter();
|
|
|
|
onmessage = e => {
|
|
let bitmap = e.data.bitmap;
|
|
if(!(bitmap instanceof ImageBitmap)) {
|
|
postMessage(new Error('Bad type for worker data'));
|
|
return;
|
|
}
|
|
|
|
if(!imageSegmenter) {
|
|
// not ready yet
|
|
bitmap.close();
|
|
postMessage(null);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
let width = bitmap.width;
|
|
let height = bitmap.height;
|
|
imageSegmenter.segmentForVideo(
|
|
bitmap, e.data.timestamp,
|
|
result => {
|
|
/** @type{Uint8Array} */
|
|
let mask = result.categoryMask.getAsUint8Array();
|
|
let id = new ImageData(width, height);
|
|
for(let i = 0; i < mask.length; i++)
|
|
id.data[4 * i + 3] = mask[i];
|
|
result.close();
|
|
createImageBitmap(id).then(ib => {
|
|
postMessage({
|
|
bitmap: bitmap,
|
|
mask: ib,
|
|
}, [bitmap, ib]);
|
|
});
|
|
},
|
|
);
|
|
} catch(e) {
|
|
bitmap.close();
|
|
postMessage(e);
|
|
}
|
|
};
|