Bläddra i källkod

严格控制实时检测启动条件

Michael Wang 5 år sedan
förälder
incheckning
817a229c73
1 ändrade filer med 45 tillägg och 0 borttagningar
  1. 45 0
      src/features/OnlineExam/Examing/FaceTracking.vue

+ 45 - 0
src/features/OnlineExam/Examing/FaceTracking.vue

@@ -68,12 +68,45 @@ function tensorFlowWebPackStatus() {
 let routeId = null;
 let __inputSize = 128;
 let __isDoingFaceLiveness = false;
+let disableFaceTracking = false;
 
 async function detectTest() {
   const inputSizeList = [128, 160, 224, 320, 416, 512, 608];
   const succRate = [0, 0, 0, 0, 0, 0, 0];
   const detectTimes = 6;
 
+  try {
+    const detectStartTime = performance.now();
+    const videoEl = document.getElementById("video");
+    const options = new faceapi.TinyFaceDetectorOptions({
+      inputSize: 128,
+      scoreThreshold: 0.5,
+    });
+    const result = await Promise.race([
+      faceapi.detectAllFaces(videoEl, options),
+      new Promise(resolve => setTimeout(resolve, 10 * 1000)),
+    ]);
+    const detectEndTime = performance.now();
+    if (
+      !result ||
+      !result.length ||
+      detectStartTime - detectEndTime > 2 * 1000
+    ) {
+      disableFaceTracking = true;
+      window._hmt.push([
+        "_trackEvent",
+        "正在考试页面",
+        "启动检测耗时过长:停止实时",
+      ]);
+      return;
+    }
+  } catch (error) {
+    console.log(error);
+    disableFaceTracking = true;
+    window._hmt.push(["_trackEvent", "正在考试页面", "启动检测错误:停止实时"]);
+    return;
+  }
+
   for (let idx = 0; idx < inputSizeList.length; idx++) {
     for (let n = 0; n < detectTimes; n++) {
       await new Promise(resolve => setTimeout(resolve, 3 * 1000));
@@ -84,6 +117,7 @@ async function detectTest() {
       const inputSize = inputSizeList[idx];
       const videoEl = document.getElementById("video");
       try {
+        const detectStartTime = performance.now();
         const options = new faceapi.TinyFaceDetectorOptions({
           inputSize: inputSize,
           scoreThreshold: 0.5,
@@ -97,6 +131,16 @@ async function detectTest() {
           faceapi.detectAllFaces(videoEl, options),
           new Promise(resolve => setTimeout(resolve, 10 * 1000)),
         ]);
+        const detectEndTime = performance.now();
+        if (detectStartTime - detectEndTime > 0.2 * 1000) {
+          disableFaceTracking = true;
+          window._hmt.push([
+            "_trackEvent",
+            "正在考试页面",
+            "单次检测耗时过长:停止实时",
+          ]);
+          return;
+        }
 
         if (result && result.length >= 1) {
           console.log(`inputSize: ${inputSize} ${result.length}`);
@@ -204,6 +248,7 @@ export default {
       this.singleTimeUsage = this.singleTimeUsage || 0;
       this.multipleTimeUsage = this.multipleTimeUsage || 0;
       if (
+        disableFaceTracking ||
         this.singleTimeUsage > 10 * 1000 ||
         this.multipleTimeUsage > 0.5 * 1000
       ) {