mirror of https://github.com/vladmandic/human
fix for human.draw labels and typedefs
parent
d4188518db
commit
669e6e7c00
|
@ -9,8 +9,9 @@
|
|||
|
||||
## Changelog
|
||||
|
||||
### **HEAD -> main** 2021/10/19 mandic00@live.com
|
||||
### **HEAD -> main** 2021/10/21 mandic00@live.com
|
||||
|
||||
- add human.custom.esm using custom tfjs build
|
||||
|
||||
### **2.3.5** 2021/10/19 mandic00@live.com
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@ const drawOptions = {
|
|||
drawBoxes: true,
|
||||
drawGaze: true,
|
||||
drawLabels: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawPoints: false,
|
||||
fillPolygons: false,
|
||||
|
|
|
@ -80930,6 +80930,7 @@ var options2 = {
|
|||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawGaze: true,
|
||||
fillPolygons: false,
|
||||
|
@ -81034,24 +81035,26 @@ async function gesture(inCanvas2, result, drawOptions) {
|
|||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
if (!result || !inCanvas2)
|
||||
return;
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where2 = [];
|
||||
let what = [];
|
||||
[where2, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where2[1] > 0 ? `#${where2[1]}` : "";
|
||||
const label = `${where2[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where2 = [];
|
||||
let what = [];
|
||||
[where2, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where2[1] > 0 ? `#${where2[1]}` : "";
|
||||
const label = `${where2[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -81067,40 +81070,42 @@ async function face(inCanvas2, result, drawOptions) {
|
|||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes)
|
||||
rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
@ -81500,31 +81505,31 @@ var detectFace = async (parent, input2) => {
|
|||
const rotation = calculateFaceAngle(faces[i], [input2.shape[2], input2.shape[1]]);
|
||||
parent.analyze("Start Emotion:");
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
|
@ -81544,10 +81549,10 @@ var detectFace = async (parent, input2) => {
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes == null ? void 0 : descRes.age,
|
||||
gender: descRes == null ? void 0 : descRes.gender,
|
||||
genderScore: descRes == null ? void 0 : descRes.genderScore,
|
||||
embedding: descRes == null ? void 0 : descRes.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -10878,6 +10878,7 @@ var options2 = {
|
|||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawGaze: true,
|
||||
fillPolygons: false,
|
||||
|
@ -10982,24 +10983,26 @@ async function gesture(inCanvas2, result, drawOptions) {
|
|||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
if (!result || !inCanvas2)
|
||||
return;
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11015,40 +11018,42 @@ async function face(inCanvas2, result, drawOptions) {
|
|||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes)
|
||||
rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
@ -11448,31 +11453,31 @@ var detectFace = async (parent, input) => {
|
|||
const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);
|
||||
parent.analyze("Start Emotion:");
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
|
@ -11492,10 +11497,10 @@ var detectFace = async (parent, input) => {
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes == null ? void 0 : descRes.age,
|
||||
gender: descRes == null ? void 0 : descRes.gender,
|
||||
genderScore: descRes == null ? void 0 : descRes.genderScore,
|
||||
embedding: descRes == null ? void 0 : descRes.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -78360,6 +78360,7 @@ var options2 = {
|
|||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawGaze: true,
|
||||
fillPolygons: false,
|
||||
|
@ -78464,24 +78465,26 @@ async function gesture(inCanvas2, result, drawOptions) {
|
|||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
if (!result || !inCanvas2)
|
||||
return;
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where2 = [];
|
||||
let what = [];
|
||||
[where2, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where2[1] > 0 ? `#${where2[1]}` : "";
|
||||
const label = `${where2[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where2 = [];
|
||||
let what = [];
|
||||
[where2, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where2[1] > 0 ? `#${where2[1]}` : "";
|
||||
const label = `${where2[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -78497,40 +78500,42 @@ async function face(inCanvas2, result, drawOptions) {
|
|||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes)
|
||||
rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
@ -78930,31 +78935,31 @@ var detectFace = async (parent, input2) => {
|
|||
const rotation = calculateFaceAngle(faces[i], [input2.shape[2], input2.shape[1]]);
|
||||
parent.analyze("Start Emotion:");
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
|
@ -78974,10 +78979,10 @@ var detectFace = async (parent, input2) => {
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes == null ? void 0 : descRes.age,
|
||||
gender: descRes == null ? void 0 : descRes.gender,
|
||||
genderScore: descRes == null ? void 0 : descRes.genderScore,
|
||||
embedding: descRes == null ? void 0 : descRes.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -10937,6 +10937,7 @@ var options2 = {
|
|||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawGaze: true,
|
||||
fillPolygons: false,
|
||||
|
@ -11041,24 +11042,26 @@ async function gesture(inCanvas2, result, drawOptions) {
|
|||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
if (!result || !inCanvas2)
|
||||
return;
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11074,40 +11077,42 @@ async function face(inCanvas2, result, drawOptions) {
|
|||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes)
|
||||
rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
@ -11510,31 +11515,31 @@ var detectFace = async (parent, input) => {
|
|||
const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);
|
||||
parent.analyze("Start Emotion:");
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
|
@ -11554,10 +11559,10 @@ var detectFace = async (parent, input) => {
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes == null ? void 0 : descRes.age,
|
||||
gender: descRes == null ? void 0 : descRes.gender,
|
||||
genderScore: descRes == null ? void 0 : descRes.genderScore,
|
||||
embedding: descRes == null ? void 0 : descRes.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
|
@ -10938,6 +10938,7 @@ var options2 = {
|
|||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawGaze: true,
|
||||
fillPolygons: false,
|
||||
|
@ -11042,24 +11043,26 @@ async function gesture(inCanvas2, result, drawOptions) {
|
|||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
if (!result || !inCanvas2)
|
||||
return;
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11075,40 +11078,42 @@ async function face(inCanvas2, result, drawOptions) {
|
|||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes)
|
||||
rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
@ -11511,31 +11516,31 @@ var detectFace = async (parent, input) => {
|
|||
const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);
|
||||
parent.analyze("Start Emotion:");
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
|
@ -11555,10 +11560,10 @@ var detectFace = async (parent, input) => {
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes == null ? void 0 : descRes.age,
|
||||
gender: descRes == null ? void 0 : descRes.gender,
|
||||
genderScore: descRes == null ? void 0 : descRes.genderScore,
|
||||
embedding: descRes == null ? void 0 : descRes.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
|
@ -10937,6 +10937,7 @@ var options2 = {
|
|||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawGestures: true,
|
||||
drawPolygons: true,
|
||||
drawGaze: true,
|
||||
fillPolygons: false,
|
||||
|
@ -11041,24 +11042,26 @@ async function gesture(inCanvas2, result, drawOptions) {
|
|||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
if (!result || !inCanvas2)
|
||||
return;
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas2);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where = [];
|
||||
let what = [];
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if (what.length > 1 && what[1].length > 0) {
|
||||
const who = where[1] > 0 ? `#${where[1]}` : "";
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + i * localOptions.lineHeight);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + i * localOptions.lineHeight);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11074,40 +11077,42 @@ async function face(inCanvas2, result, drawOptions) {
|
|||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes)
|
||||
rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
const labels2 = [];
|
||||
labels2.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore)
|
||||
labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age)
|
||||
labels2.push(`age: ${f.age || ""}`);
|
||||
if (f.iris)
|
||||
labels2.push(`distance: ${f.iris}`);
|
||||
if (f.real)
|
||||
labels2.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion3.length > 3)
|
||||
emotion3.length = 3;
|
||||
labels2.push(emotion3.join(" "));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll)
|
||||
labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`);
|
||||
if (f.rotation.gaze.bearing)
|
||||
labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`);
|
||||
}
|
||||
if (labels2.length === 0)
|
||||
labels2.push("face");
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels2.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== "") {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels2[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels2[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
@ -11510,31 +11515,31 @@ var detectFace = async (parent, input) => {
|
|||
const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);
|
||||
parent.analyze("Start Emotion:");
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
|
@ -11554,10 +11559,10 @@ var detectFace = async (parent, input) => {
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes == null ? void 0 : descRes.age,
|
||||
gender: descRes == null ? void 0 : descRes.gender,
|
||||
genderScore: descRes == null ? void 0 : descRes.genderScore,
|
||||
embedding: descRes == null ? void 0 : descRes.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
|
@ -48,11 +48,11 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
// run emotion, inherits face from blazeface
|
||||
parent.analyze('Start Emotion:');
|
||||
if (parent.config.async) {
|
||||
emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = 'run:emotion';
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};
|
||||
emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze('End Emotion:');
|
||||
|
@ -60,11 +60,11 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
// run antispoof, inherits face from blazeface
|
||||
parent.analyze('Start AntiSpoof:');
|
||||
if (parent.config.async) {
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? antispoof.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? antispoof.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = 'run:antispoof';
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze('End AntiSpoof:');
|
||||
|
@ -86,11 +86,11 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
// run emotion, inherits face from blazeface
|
||||
parent.analyze('Start Description:');
|
||||
if (parent.config.async) {
|
||||
descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
} else {
|
||||
parent.state = 'run:description';
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];
|
||||
descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze('End Description:');
|
||||
|
@ -124,10 +124,10 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
faceRes.push({
|
||||
...faces[i],
|
||||
id: i,
|
||||
age: descRes.age,
|
||||
gender: descRes.gender,
|
||||
genderScore: descRes.genderScore,
|
||||
embedding: descRes.descriptor,
|
||||
age: descRes?.age,
|
||||
gender: descRes?.gender,
|
||||
genderScore: descRes?.genderScore,
|
||||
embedding: descRes?.descriptor,
|
||||
emotion: emotionRes,
|
||||
real: antispoofRes,
|
||||
iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,
|
||||
|
|
|
@ -135,7 +135,7 @@ export class Human {
|
|||
* - canvas: draw processed canvas which is a processed copy of the input
|
||||
* - all: meta-function that performs: canvas, face, body, hand
|
||||
*/
|
||||
draw: { canvas, face, body, hand, gesture, object, person, all, options: DrawOptions };
|
||||
draw: { canvas: typeof draw.canvas, face: typeof draw.face, body: typeof draw.body, hand: typeof draw.hand, gesture: typeof draw.gesture, object: typeof draw.object, person: typeof draw.person, all: typeof draw.all, options: DrawOptions };
|
||||
|
||||
/** Currently loaded models
|
||||
* @internal
|
||||
|
|
|
@ -37,6 +37,7 @@ export interface DrawOptions {
|
|||
roundRect: number,
|
||||
drawPoints: boolean,
|
||||
drawLabels: boolean,
|
||||
drawGestures: boolean,
|
||||
drawBoxes: boolean,
|
||||
drawPolygons: boolean,
|
||||
drawGaze: boolean,
|
||||
|
@ -58,6 +59,7 @@ export const options: DrawOptions = {
|
|||
drawPoints: <boolean>false,
|
||||
drawLabels: <boolean>true,
|
||||
drawBoxes: <boolean>true,
|
||||
drawGestures: <boolean>true,
|
||||
drawPolygons: <boolean>true,
|
||||
drawGaze: <boolean>true,
|
||||
fillPolygons: <boolean>false,
|
||||
|
@ -166,24 +168,26 @@ function arrow(ctx: CanvasRenderingContext2D, from: Point, to: Point, radius = 5
|
|||
export async function gesture(inCanvas: HTMLCanvasElement | OffscreenCanvas, result: Array<GestureResult>, drawOptions?: Partial<DrawOptions>) {
|
||||
const localOptions = mergeDeep(options, drawOptions);
|
||||
if (!result || !inCanvas) return;
|
||||
const ctx = getCanvasContext(inCanvas);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where: unknown[] = []; // what&where is a record
|
||||
let what: unknown[] = []; // what&where is a record
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if ((what.length > 1) && ((what[1] as string).length > 0)) {
|
||||
const who = where[1] as number > 0 ? `#${where[1]}` : '';
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== '') {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));
|
||||
if (localOptions.drawGestures) {
|
||||
const ctx = getCanvasContext(inCanvas);
|
||||
ctx.font = localOptions.font;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
let i = 1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
let where: unknown[] = []; // what&where is a record
|
||||
let what: unknown[] = []; // what&where is a record
|
||||
[where, what] = Object.entries(result[j]);
|
||||
if ((what.length > 1) && ((what[1] as string).length > 0)) {
|
||||
const who = where[1] as number > 0 ? `#${where[1]}` : '';
|
||||
const label = `${where[0]} ${who}: ${what[1]}`;
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== '') {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));
|
||||
i += 1;
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -197,33 +201,35 @@ export async function face(inCanvas: HTMLCanvasElement | OffscreenCanvas, result
|
|||
ctx.strokeStyle = localOptions.color;
|
||||
ctx.fillStyle = localOptions.color;
|
||||
if (localOptions.drawBoxes) rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);
|
||||
// silly hack since fillText does not suport new line
|
||||
const labels:string[] = [];
|
||||
labels.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age) labels.push(`age: ${f.age || ''}`);
|
||||
if (f.iris) labels.push(`distance: ${f.iris}`);
|
||||
if (f.real) labels.push(`Real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion.length > 3) emotion.length = 3;
|
||||
labels.push(emotion.join(' '));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}° yaw:${rad2deg(f.rotation.angle.yaw)}° pitch:${rad2deg(f.rotation.angle.pitch)}°`);
|
||||
if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}°`);
|
||||
}
|
||||
if (labels.length === 0) labels.push('face');
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== '') {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels[i], x + 5, y + 16);
|
||||
if (localOptions.drawLabels) {
|
||||
// silly hack since fillText does not suport new line
|
||||
const labels:string[] = [];
|
||||
labels.push(`face: ${Math.trunc(100 * f.score)}%`);
|
||||
if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);
|
||||
if (f.age) labels.push(`age: ${f.age || ''}`);
|
||||
if (f.iris) labels.push(`distance: ${f.iris}`);
|
||||
if (f.real) labels.push(`real: ${Math.trunc(100 * f.real)}%`);
|
||||
if (f.emotion && f.emotion.length > 0) {
|
||||
const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);
|
||||
if (emotion.length > 3) emotion.length = 3;
|
||||
labels.push(emotion.join(' '));
|
||||
}
|
||||
if (f.rotation && f.rotation.angle && f.rotation.gaze) {
|
||||
if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}° yaw:${rad2deg(f.rotation.angle.yaw)}° pitch:${rad2deg(f.rotation.angle.pitch)}°`);
|
||||
if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}°`);
|
||||
}
|
||||
if (labels.length === 0) labels.push('face');
|
||||
ctx.fillStyle = localOptions.color;
|
||||
for (let i = labels.length - 1; i >= 0; i--) {
|
||||
const x = Math.max(f.box[0], 0);
|
||||
const y = i * localOptions.lineHeight + f.box[1];
|
||||
if (localOptions.shadowColor && localOptions.shadowColor !== '') {
|
||||
ctx.fillStyle = localOptions.shadowColor;
|
||||
ctx.fillText(labels[i], x + 5, y + 16);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.fillStyle = localOptions.labelColor;
|
||||
ctx.fillText(labels[i], x + 4, y + 15);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
if (f.mesh && f.mesh.length > 0) {
|
||||
|
|
2755
test/build.log
2755
test/build.log
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,9 +1,11 @@
|
|||
/**
|
||||
* Human main module
|
||||
*/
|
||||
import { Env } from './util/env';
|
||||
import * as tf from '../dist/tfjs.esm.js';
|
||||
import * as env from './util/env';
|
||||
import * as draw from './util/draw';
|
||||
import * as facemesh from './face/facemesh';
|
||||
import * as image from './image/image';
|
||||
import * as match from './face/match';
|
||||
import * as models from './models';
|
||||
import type { Result } from './result';
|
||||
|
@ -88,7 +90,7 @@ export declare class Human {
|
|||
*/
|
||||
tf: TensorFlow;
|
||||
/** Object containing environment information used for diagnostics */
|
||||
env: env.Env;
|
||||
env: Env;
|
||||
/** Draw helper classes that can draw detected objects on canvas using specified draw
|
||||
* - options: {@link DrawOptions} global settings for all draw operations, can be overriden for each draw method
|
||||
* - face: draw detected faces
|
||||
|
@ -98,14 +100,14 @@ export declare class Human {
|
|||
* - all: meta-function that performs: canvas, face, body, hand
|
||||
*/
|
||||
draw: {
|
||||
canvas: any;
|
||||
face: any;
|
||||
body: any;
|
||||
hand: any;
|
||||
gesture: any;
|
||||
object: any;
|
||||
person: any;
|
||||
all: any;
|
||||
canvas: typeof draw.canvas;
|
||||
face: typeof draw.face;
|
||||
body: typeof draw.body;
|
||||
hand: typeof draw.hand;
|
||||
gesture: typeof draw.gesture;
|
||||
object: typeof draw.object;
|
||||
person: typeof draw.person;
|
||||
all: typeof draw.all;
|
||||
options: DrawOptions;
|
||||
};
|
||||
/** Currently loaded models
|
||||
|
@ -162,7 +164,7 @@ export declare class Human {
|
|||
*/
|
||||
image(input: Input, getTensor?: boolean): {
|
||||
tensor: Tensor<import("@tensorflow/tfjs-core").Rank> | null;
|
||||
canvas: HTMLCanvasElement | OffscreenCanvas | null;
|
||||
canvas: image.AnyCanvas | null;
|
||||
};
|
||||
/** Segmentation method takes any input and returns processed canvas with body segmentation
|
||||
* - Optional parameter background is used to fill the background with specific input
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"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"}
|
|
@ -5,11 +5,12 @@ import type { Tensor } from '../tfjs/types';
|
|||
import type { Config } from '../config';
|
||||
import { env } from '../util/env';
|
||||
export declare type Input = Tensor | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas | typeof Image | typeof env.Canvas;
|
||||
export declare function canvas(width: any, height: any): HTMLCanvasElement | OffscreenCanvas;
|
||||
export declare function copy(input: HTMLCanvasElement | OffscreenCanvas, output?: HTMLCanvasElement | OffscreenCanvas): HTMLCanvasElement | OffscreenCanvas;
|
||||
export declare type AnyCanvas = HTMLCanvasElement | OffscreenCanvas;
|
||||
export declare function canvas(width: any, height: any): AnyCanvas;
|
||||
export declare function copy(input: AnyCanvas, output?: AnyCanvas): AnyCanvas;
|
||||
export declare function process(input: Input, config: Config, getTensor?: boolean): {
|
||||
tensor: Tensor | null;
|
||||
canvas: OffscreenCanvas | HTMLCanvasElement | null;
|
||||
canvas: AnyCanvas | null;
|
||||
};
|
||||
export declare function skip(config: any, input: Tensor): Promise<boolean>;
|
||||
//# sourceMappingURL=image.d.ts.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/image/image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,oBAAY,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,GAAG,OAAO,KAAK,GAAG,OAAO,GAAG,CAAC,MAAM,CAAC;AAUvL,wBAAgB,MAAM,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA,GAAG,iBAAiB,GAAG,eAAe,CAkBzE;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,eAAe,uCAK5G;AAKD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAAA;CAAE,CA8J9J;AAkCD,wBAAsB,IAAI,CAAC,MAAM,KAAA,EAAE,KAAK,EAAE,MAAM,oBAY/C"}
|
||||
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/image/image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,oBAAY,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,GAAG,OAAO,KAAK,GAAG,OAAO,GAAG,CAAC,MAAM,CAAC;AACvL,oBAAY,SAAS,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAU5D,wBAAgB,MAAM,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA,GAAG,SAAS,CAkB/C;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,aAKxD;AAKD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CA8JpI;AAkCD,wBAAsB,IAAI,CAAC,MAAM,KAAA,EAAE,KAAK,EAAE,MAAM,oBAY/C"}
|
|
@ -8,7 +8,6 @@
|
|||
* @property {function} add add specified filter to filter chain
|
||||
* @property {function} apply execute filter chain and draw result
|
||||
* @property {function} draw just draw input to result
|
||||
* @param {HTMLCanvasElement | OffscreenCanvas} canvas use specific canvas for all webgl bindings
|
||||
*/
|
||||
export declare function GLImageFilter(params?: {}): void;
|
||||
export declare function GLImageFilter(): void;
|
||||
//# sourceMappingURL=imagefx.d.ts.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"imagefx.d.ts","sourceRoot":"","sources":["../../../src/image/imagefx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4CH;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,KAAK,QAkWxC"}
|
||||
{"version":3,"file":"imagefx.d.ts","sourceRoot":"","sources":["../../../src/image/imagefx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6CH;;;;;;GAMG;AAEH,wBAAgB,aAAa,SAkW5B"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/tfjs/backend.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAOpD,wBAAsB,KAAK,CAAC,QAAQ,KAAA,EAAE,KAAK,UAAQ,oBAqGlD;AAGD,wBAAgB,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,KAAA,QAazD"}
|
||||
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/tfjs/backend.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAOpD,wBAAsB,KAAK,CAAC,QAAQ,KAAA,EAAE,KAAK,UAAQ,oBAoGlD;AAGD,wBAAgB,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,KAAA,QAazD"}
|
|
@ -33,6 +33,7 @@ export interface DrawOptions {
|
|||
roundRect: number;
|
||||
drawPoints: boolean;
|
||||
drawLabels: boolean;
|
||||
drawGestures: boolean;
|
||||
drawBoxes: boolean;
|
||||
drawPolygons: boolean;
|
||||
drawGaze: boolean;
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"draw.d.ts","sourceRoot":"","sources":["../../../src/util/draw.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAS,MAAM,WAAW,CAAC;AAE9H;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,OAAO,EAAE,WAkBrB,CAAC;AAmGF,wBAAsB,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuB5I;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAqHtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwCtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBA+DtI;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuB1I;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwB1I;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,iBAI1J;AAED,wBAAsB,GAAG,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,kDAc1H"}
|
||||
{"version":3,"file":"draw.d.ts","sourceRoot":"","sources":["../../../src/util/draw.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAS,MAAM,WAAW,CAAC;AAE9H;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,OAAO,EAAE,WAmBrB,CAAC;AAmGF,wBAAsB,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAyB5I;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuHtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwCtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBA+DtI;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuB1I;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwB1I;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,iBAI1J;AAED,wBAAsB,GAAG,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,kDAc1H"}
|
|
@ -1,20 +1,21 @@
|
|||
export declare type Env = {
|
||||
/** Env class that holds detected capabilities */
|
||||
export declare class Env {
|
||||
/** Running in Browser */
|
||||
browser: undefined | boolean;
|
||||
browser: boolean;
|
||||
/** Running in NodeJS */
|
||||
node: undefined | boolean;
|
||||
node: boolean;
|
||||
/** Running in WebWorker thread */
|
||||
worker: undefined | boolean;
|
||||
worker: boolean;
|
||||
/** Detected platform */
|
||||
platform: undefined | string;
|
||||
platform: string;
|
||||
/** Detected agent */
|
||||
agent: undefined | string;
|
||||
agent: string;
|
||||
/** List of supported backends */
|
||||
backends: string[];
|
||||
/** Has any work been performed so far */
|
||||
initial: boolean;
|
||||
/** Are image filters supported? */
|
||||
filter: undefined | boolean;
|
||||
filter: boolean | undefined;
|
||||
/** TFJS instance details */
|
||||
tfjs: {
|
||||
version: undefined | string;
|
||||
|
@ -41,6 +42,11 @@ export declare type Env = {
|
|||
backend: undefined | boolean;
|
||||
adapter: undefined | string;
|
||||
};
|
||||
/** CPU info */
|
||||
cpu: {
|
||||
model: undefined | string;
|
||||
flags: string[];
|
||||
};
|
||||
/** List of supported kernels for current backend */
|
||||
kernels: string[];
|
||||
/** MonkeyPatch for Canvas */
|
||||
|
@ -49,10 +55,9 @@ export declare type Env = {
|
|||
Image: undefined;
|
||||
/** MonkeyPatch for ImageData */
|
||||
ImageData: undefined;
|
||||
};
|
||||
export declare let env: Env;
|
||||
export declare function cpuInfo(): Promise<void>;
|
||||
export declare function backendInfo(): Promise<void>;
|
||||
export declare function get(): Promise<void>;
|
||||
export declare function set(obj: any): Promise<void>;
|
||||
constructor();
|
||||
updateBackend(): Promise<void>;
|
||||
updateCPU(): Promise<void>;
|
||||
}
|
||||
export declare const env: Env;
|
||||
//# sourceMappingURL=env.d.ts.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/util/env.ts"],"names":[],"mappings":"AAIA,oBAAY,GAAG,GAAG;IAChB,yBAAyB;IACzB,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,wBAAwB;IACxB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,kCAAkC;IAClC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,wBAAwB;IACxB,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,qBAAqB;IACrB,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,4BAA4B;IAC5B,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAAC;IACF,oCAAoC;IACpC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,iCAAiC;IACjC,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAC1B,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;KAClC,CAAC;IACF,kCAAkC;IAClC,KAAK,EAAE;QACL,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;QAC5B,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;KAC9B,CAAC;IACF,mCAAmC;IACnC,MAAM,EAAE;QACN,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAAC;IACF,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6BAA6B;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,SAAS,CAAC;CACtB,CAAA;AAGD,eAAO,IAAI,GAAG,EAAE,GAkCf,CAAC;AAEF,wBAAsB,OAAO,kBAmB5B;AAED,wBAAsB,WAAW,kBA8BhC;AAED,wBAAsB,GAAG,kBAqCxB;AAED,wBAAsB,GAAG,CAAC,GAAG,KAAA,iBAE5B"}
|
||||
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/util/env.ts"],"names":[],"mappings":"AAGA,iDAAiD;AACjD,qBAAa,GAAG;IACd,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAM;IACtB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAM;IACnB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,4BAA4B;IAC5B,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAAC;IACF,oCAAoC;IACpC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,iCAAiC;IACjC,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAC1B,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;KAClC,CAKG;IACJ,kCAAkC;IAClC,KAAK,EAAE;QACL,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;QAC5B,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;KAC9B,CAKG;IACJ,mCAAmC;IACnC,MAAM,EAAE;QACN,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAIG;IACJ,eAAe;IACf,GAAG,EAAE;QACH,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAGG;IACJ,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,6BAA6B;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,SAAS,CAAC;;IAkCf,aAAa;IA6Bb,SAAS;CAoBhB;AAED,eAAO,MAAM,GAAG,KAAY,CAAC"}
|
Loading…
Reference in New Issue