root 3 years ago
parent
commit
5c08907024

+ 88 - 31
package-lock.json

@@ -4,12 +4,45 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@tensorflow/tfjs-core": {
+      "version": "1.7.0",
+      "resolved": "https://registry.nlark.com/@tensorflow/tfjs-core/download/@tensorflow/tfjs-core-1.7.0.tgz",
+      "integrity": "sha1-kgfI8kgcUqakATWmqvIam7Azm98=",
+      "requires": {
+        "@types/offscreencanvas": "~2019.3.0",
+        "@types/seedrandom": "2.4.27",
+        "@types/webgl-ext": "0.0.30",
+        "@types/webgl2": "0.0.4",
+        "node-fetch": "~2.1.2",
+        "seedrandom": "2.4.3"
+      }
+    },
+    "@types/offscreencanvas": {
+      "version": "2019.3.0",
+      "resolved": "https://registry.nlark.com/@types/offscreencanvas/download/@types/offscreencanvas-2019.3.0.tgz",
+      "integrity": "sha1-MzZCjsfpGAz0Vm3+pdoE61hqZVM="
+    },
     "@types/q": {
       "version": "1.5.5",
       "resolved": "https://registry.nlark.com/@types/q/download/@types/q-1.5.5.tgz?cache=0&sync_timestamp=1625678508325&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fq%2Fdownload%2F%40types%2Fq-1.5.5.tgz",
       "integrity": "sha1-daKo59irSyMEFFBdkjNdHctTpt8=",
       "dev": true
     },
+    "@types/seedrandom": {
+      "version": "2.4.27",
+      "resolved": "https://registry.nlark.com/@types/seedrandom/download/@types/seedrandom-2.4.27.tgz",
+      "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE="
+    },
+    "@types/webgl-ext": {
+      "version": "0.0.30",
+      "resolved": "https://registry.nlark.com/@types/webgl-ext/download/@types/webgl-ext-0.0.30.tgz",
+      "integrity": "sha1-DOSYwWpBoj0VKJ4LhE2UWyXw+50="
+    },
+    "@types/webgl2": {
+      "version": "0.0.4",
+      "resolved": "https://registry.nlark.com/@types/webgl2/download/@types/webgl2-0.0.4.tgz",
+      "integrity": "sha1-w7D51rRlxmE46E5kyzvfg3PCwnk="
+    },
     "abab": {
       "version": "2.0.5",
       "resolved": "https://registry.npm.taobao.org/abab/download/abab-2.0.5.tgz",
@@ -50,7 +83,7 @@
     },
     "acorn-globals": {
       "version": "4.3.4",
-      "resolved": "https://registry.nlark.com/acorn-globals/download/acorn-globals-4.3.4.tgz",
+      "resolved": "https://registry.npm.taobao.org/acorn-globals/download/acorn-globals-4.3.4.tgz",
       "integrity": "sha1-n6GSat3BHJcwjE5m163Q1Awycuc=",
       "requires": {
         "acorn": "^6.0.1",
@@ -59,14 +92,14 @@
       "dependencies": {
         "acorn": {
           "version": "6.4.2",
-          "resolved": "https://registry.nlark.com/acorn/download/acorn-6.4.2.tgz?cache=0&sync_timestamp=1624526855420&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-6.4.2.tgz",
+          "resolved": "https://registry.nlark.com/acorn/download/acorn-6.4.2.tgz",
           "integrity": "sha1-NYZv1xBSjpLeEM8GAWSY5H454eY="
         }
       }
     },
     "acorn-walk": {
       "version": "6.2.0",
-      "resolved": "https://registry.nlark.com/acorn-walk/download/acorn-walk-6.2.0.tgz?cache=0&sync_timestamp=1624951990736&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-6.2.0.tgz",
+      "resolved": "https://registry.nlark.com/acorn-walk/download/acorn-walk-6.2.0.tgz",
       "integrity": "sha1-Ejy487hMIXHx9/slJhWxx4prGow="
     },
     "ajv": {
@@ -341,7 +374,7 @@
     },
     "aws-sign2": {
       "version": "0.7.0",
-      "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz?cache=0&sync_timestamp=1589682812085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws-sign2%2Fdownload%2Faws-sign2-0.7.0.tgz",
       "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
     },
     "aws4": {
@@ -1275,7 +1308,7 @@
     },
     "bcrypt-pbkdf": {
       "version": "1.0.2",
-      "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz?cache=0&sync_timestamp=1589682746075&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbcrypt-pbkdf%2Fdownload%2Fbcrypt-pbkdf-1.0.2.tgz",
       "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
       "requires": {
         "tweetnacl": "^0.14.3"
@@ -1418,7 +1451,7 @@
     },
     "browser-process-hrtime": {
       "version": "1.0.0",
-      "resolved": "https://registry.nlark.com/browser-process-hrtime/download/browser-process-hrtime-1.0.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/browser-process-hrtime/download/browser-process-hrtime-1.0.0.tgz",
       "integrity": "sha1-PJtLfXgsgSHlbxAQbYTA0P/JRiY="
     },
     "browserify-aes": {
@@ -3301,7 +3334,7 @@
     },
     "cssom": {
       "version": "0.4.4",
-      "resolved": "https://registry.nlark.com/cssom/download/cssom-0.4.4.tgz?cache=0&sync_timestamp=1624218957158&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssom%2Fdownload%2Fcssom-0.4.4.tgz",
+      "resolved": "https://registry.nlark.com/cssom/download/cssom-0.4.4.tgz",
       "integrity": "sha1-WmbPk9LQtmHYC/akT7ZfXC5OChA="
     },
     "cssstyle": {
@@ -3314,7 +3347,7 @@
       "dependencies": {
         "cssom": {
           "version": "0.3.8",
-          "resolved": "https://registry.nlark.com/cssom/download/cssom-0.3.8.tgz?cache=0&sync_timestamp=1624218957158&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssom%2Fdownload%2Fcssom-0.3.8.tgz",
+          "resolved": "https://registry.nlark.com/cssom/download/cssom-0.3.8.tgz",
           "integrity": "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o="
         }
       }
@@ -3712,7 +3745,7 @@
     },
     "ecc-jsbn": {
       "version": "0.1.2",
-      "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz?cache=0&sync_timestamp=1589682745945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fecc-jsbn%2Fdownload%2Fecc-jsbn-0.1.2.tgz",
       "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
       "requires": {
         "jsbn": "~0.1.0",
@@ -3977,7 +4010,7 @@
     },
     "escodegen": {
       "version": "1.14.3",
-      "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.14.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.14.3.tgz?cache=0&sync_timestamp=1596669832613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescodegen%2Fdownload%2Fescodegen-1.14.3.tgz",
       "integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=",
       "requires": {
         "esprima": "^4.0.1",
@@ -3989,12 +4022,12 @@
       "dependencies": {
         "esprima": {
           "version": "4.0.1",
-          "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
+          "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz?cache=0&sync_timestamp=1589682833047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesprima%2Fdownload%2Fesprima-4.0.1.tgz",
           "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
         },
         "source-map": {
           "version": "0.6.1",
-          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz",
           "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
           "optional": true
         }
@@ -4225,7 +4258,7 @@
     },
     "extend": {
       "version": "3.0.2",
-      "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz?cache=0&sync_timestamp=1589682707348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fextend%2Fdownload%2Fextend-3.0.2.tgz",
       "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
     },
     "extend-shallow": {
@@ -4337,6 +4370,15 @@
       "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
       "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
     },
+    "face-api.js": {
+      "version": "0.22.2",
+      "resolved": "https://registry.npm.taobao.org/face-api.js/download/face-api.js-0.22.2.tgz",
+      "integrity": "sha1-Wsy/flOxVpaF0Ran4Y28SAB3DTk=",
+      "requires": {
+        "@tensorflow/tfjs-core": "1.7.0",
+        "tslib": "^1.11.1"
+      }
+    },
     "fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz",
@@ -4637,7 +4679,7 @@
     },
     "getpass": {
       "version": "0.1.7",
-      "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
+      "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz?cache=0&sync_timestamp=1589682745510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgetpass%2Fdownload%2Fgetpass-0.1.7.tgz",
       "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
       "requires": {
         "assert-plus": "^1.0.0"
@@ -4729,7 +4771,7 @@
     },
     "har-validator": {
       "version": "5.1.5",
-      "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz",
+      "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz?cache=0&sync_timestamp=1596082584903&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhar-validator%2Fdownload%2Fhar-validator-5.1.5.tgz",
       "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=",
       "requires": {
         "ajv": "^6.12.3",
@@ -5104,7 +5146,7 @@
     },
     "http-signature": {
       "version": "1.2.0",
-      "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1600868452638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz",
       "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
       "requires": {
         "assert-plus": "^1.0.0",
@@ -5627,7 +5669,7 @@
     },
     "jsbn": {
       "version": "0.1.1",
-      "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz?cache=0&sync_timestamp=1589682745609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsbn%2Fdownload%2Fjsbn-0.1.1.tgz",
       "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
     },
     "jsdom": {
@@ -5665,7 +5707,7 @@
       "dependencies": {
         "acorn": {
           "version": "7.4.1",
-          "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1624526855420&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-7.4.1.tgz",
+          "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz",
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo="
         },
         "ws": {
@@ -5705,7 +5747,7 @@
     },
     "json-stringify-safe": {
       "version": "5.0.1",
-      "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz?cache=0&sync_timestamp=1589682771374&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-stringify-safe%2Fdownload%2Fjson-stringify-safe-5.0.1.tgz",
       "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
     },
     "json3": {
@@ -5849,7 +5891,7 @@
     },
     "lodash.sortby": {
       "version": "4.7.0",
-      "resolved": "https://registry.npm.taobao.org/lodash.sortby/download/lodash.sortby-4.7.0.tgz?cache=0&sync_timestamp=1589683608371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.sortby%2Fdownload%2Flodash.sortby-4.7.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.sortby/download/lodash.sortby-4.7.0.tgz",
       "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
     },
     "lodash.uniq": {
@@ -6431,6 +6473,11 @@
         "lower-case": "^1.1.1"
       }
     },
+    "node-fetch": {
+      "version": "2.1.2",
+      "resolved": "https://registry.nlark.com/node-fetch/download/node-fetch-2.1.2.tgz?cache=0&sync_timestamp=1626684812087&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.1.2.tgz",
+      "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
+    },
     "node-forge": {
       "version": "0.10.0",
       "resolved": "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz",
@@ -6573,7 +6620,7 @@
     },
     "oauth-sign": {
       "version": "0.9.0",
-      "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz?cache=0&sync_timestamp=1589682811909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foauth-sign%2Fdownload%2Foauth-sign-0.9.0.tgz",
       "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
     },
     "object-assign": {
@@ -6937,7 +6984,7 @@
     },
     "parse5": {
       "version": "5.1.0",
-      "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.0.tgz?cache=0&sync_timestamp=1595849263958&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5%2Fdownload%2Fparse5-5.1.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.0.tgz",
       "integrity": "sha1-xZNByXI/QUxFKXVWTHwApo1YrNI="
     },
     "parseurl": {
@@ -9731,7 +9778,7 @@
     },
     "request": {
       "version": "2.88.2",
-      "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest%2Fdownload%2Frequest-2.88.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz?cache=0&sync_timestamp=1589682741998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest%2Fdownload%2Frequest-2.88.2.tgz",
       "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=",
       "requires": {
         "aws-sign2": "~0.7.0",
@@ -9758,12 +9805,12 @@
       "dependencies": {
         "qs": {
           "version": "6.5.2",
-          "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385281714&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz",
+          "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385315895&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz",
           "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY="
         },
         "tough-cookie": {
           "version": "2.5.0",
-          "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&sync_timestamp=1589682815640&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz",
           "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=",
           "requires": {
             "psl": "^1.1.28",
@@ -9774,7 +9821,7 @@
     },
     "request-promise-core": {
       "version": "1.1.4",
-      "resolved": "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.4.tgz",
+      "resolved": "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.4.tgz?cache=0&sync_timestamp=1595378681719&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest-promise-core%2Fdownload%2Frequest-promise-core-1.1.4.tgz",
       "integrity": "sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8=",
       "requires": {
         "lodash": "^4.17.19"
@@ -9792,7 +9839,7 @@
       "dependencies": {
         "tough-cookie": {
           "version": "2.5.0",
-          "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&sync_timestamp=1589682815640&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz",
           "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=",
           "requires": {
             "psl": "^1.1.28",
@@ -9994,6 +10041,11 @@
         }
       }
     },
+    "seedrandom": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npm.taobao.org/seedrandom/download/seedrandom-2.4.3.tgz",
+      "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw="
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.nlark.com/select-hose/download/select-hose-2.0.0.tgz",
@@ -10973,7 +11025,7 @@
     },
     "tough-cookie": {
       "version": "3.0.1",
-      "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-3.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-3.0.1.tgz?cache=0&sync_timestamp=1589682815640&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-3.0.1.tgz",
       "integrity": "sha1-nfT1fnOcJpMKAYGEiH9K233Kc7I=",
       "requires": {
         "ip-regex": "^2.1.0",
@@ -11012,6 +11064,11 @@
       "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=",
       "dev": true
     },
+    "tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz",
+      "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA="
+    },
     "tty-browserify": {
       "version": "0.0.0",
       "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
@@ -11028,7 +11085,7 @@
     },
     "tweetnacl": {
       "version": "0.14.5",
-      "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz",
+      "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1589682745749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz",
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
     },
     "type": {
@@ -12294,7 +12351,7 @@
     },
     "word-wrap": {
       "version": "1.2.3",
-      "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz?cache=0&sync_timestamp=1589683603678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fword-wrap%2Fdownload%2Fword-wrap-1.2.3.tgz",
       "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w="
     },
     "wordwrap": {
@@ -12358,7 +12415,7 @@
     },
     "xmlchars": {
       "version": "2.2.0",
-      "resolved": "https://registry.nlark.com/xmlchars/download/xmlchars-2.2.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/xmlchars/download/xmlchars-2.2.0.tgz",
       "integrity": "sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs="
     },
     "xtend": {

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
     "axios": "^0.21.1",
     "blockly": "^6.20210701.0",
     "element-ui": "^2.15.3",
+    "face-api.js": "^0.22.2",
     "tracking": "^1.1.3",
     "vue": "^2.5.2",
     "vue-router": "^3.0.1",

+ 449 - 381
src/components/function.vue

@@ -1,398 +1,466 @@
 <template>
-	<div style="width: 100%; height: calc(100% - 67.5px);background: #fff;">
-		<div class="img">
-			<div class="left">
-				<div class="pFace">
-					<img src="../assets/img/face.png" alt="" />
-				</div>
-				<div class="nav">{{ isdetected }}</div>
-			</div>
-			<div class="controlZ">
-				<div id="screan" ref="dv">
-					<img :src="img[0]" alt v-show="!isCamera" />
-					<!--图片展示-->
-					<video
-						ref="video"
-						id="video_cam"
-						width="265"
-						height="212"
-						class="face"
-						autoplay
-						v-show="isCamera"
-					></video>
-					<canvas
-						ref="canvasDOM"
-						width="265"
-						height="212"
-						class="kuang"
-						v-show="isCamera"
-					></canvas>
-				</div>
-				<div id="tou" ref="dv1">
-					<img :src="img[2]" alt />
-				</div>
-				<div id="ai" ref="dv2">
-					<img :src="img[1]" alt />
-				</div>
-				<div id="police" ref="dv2">
-					<img :src="img[3]" alt />
-				</div>
-			</div>
-
-			<div class="cameraZ">
-				<!--开启摄像头-->
-				<div class="cameraBtn">
-					<!-- <el-button
+  <div style="width: 100%; height: calc(100% - 67.5px);background: #fff;">
+    <div class="img">
+      <div class="left">
+        <div class="pFace">
+          <img src="../assets/img/face.png" alt />
+        </div>
+        <div class="nav">{{ isdetected }}</div>
+      </div>
+      <div class="controlZ">
+        <div id="screan" ref="dv">
+          <img :src="img[0]" alt v-show="!isCamera" />
+          <!--图片展示-->
+          <video
+            ref="video"
+            id="video_cam"
+            width="265"
+            height="212"
+            class="face"
+            autoplay
+            v-show="isCamera"
+          ></video>
+          <canvas ref="canvasDOM" width="265" height="212" class="kuang" v-show="isCamera"></canvas>
+        </div>
+        <div id="tou" ref="dv1">
+          <img :src="img[2]" alt />
+        </div>
+        <div id="ai" ref="dv2">
+          <img :src="img[1]" alt />
+        </div>
+        <div id="police" ref="dv2">
+          <img :src="img[3]" alt />
+        </div>
+      </div>
+
+      <div class="cameraZ">
+        <!--开启摄像头-->
+        <div class="cameraBtn">
+          <!-- <el-button
             size="mini"
             type="primary"
             @click="callCamera"
             v-if="!isCamera"
-            >开启摄像头</el-button -->
-					<!-- > -->
-					<div class="open" @click="callCamera" v-if="!isCamera">
-						<img src="../assets/img/open.png" alt="" />
-					</div>
-					<!-- <el-button size="mini" type="primary" @click="closeCamera" v-else
+          >开启摄像头</el-button-->
+          <!-- > -->
+          <div class="open" @click="callCamera" v-if="!isCamera">
+            <img src="../assets/img/open.png" alt />
+          </div>
+          <!-- <el-button size="mini" type="primary" @click="closeCamera" v-else
             >关闭摄像头</el-button
-          > -->
-					<div class="close" @click="closeCamera" v-else>
-						<img src="../assets/img/close.png" alt="" />
-					</div>
-					<!-- <el-button
+          >-->
+          <div class="close" @click="closeCamera" v-else>
+            <img src="../assets/img/close.png" alt />
+          </div>
+          <!-- <el-button
             size="mini"
             type="primary"
             @click="photograph"
             v-if="isCamera"
             >确认保存</el-button
-          > -->
-					<div class="save" @click="photograph" v-if="isCamera">
-						<img src="../assets/img/save.png" alt="" />
-					</div>
-				</div>
-				<!--确认-->
-				<div v-if="isCamera" class="isPhoto">
-					<!--canvas截取流-->
-					<canvas
-						ref="canvas"
-						width="300"
-						height="240"
-						v-if="isCamera"
-					></canvas>
-				</div>
-			</div>
-		</div>
-	</div>
+          >-->
+          <div class="save" @click="photograph" v-if="isCamera">
+            <img src="../assets/img/save.png" alt />
+          </div>
+        </div>
+        <!--确认-->
+        <div v-if="isCamera" class="isPhoto">
+          <!--canvas截取流-->
+          <canvas ref="canvas" width="300" height="240" v-if="isCamera"></canvas>
+        </div>
+      </div>
+    </div>
+  </div>
 </template>
 <script>
-	import tracking from "@/assets/js/tracking-min.js";
-	import "@/assets/js/face-min.js";
-
-	export default {
-		data() {
-			return {
-				that: this,
-				img: [
-					require("../assets/img/light/screan.png"),
-					require("../assets/img/ai.png"),
-					require("../assets/img/tou1.png"),
-					require("../assets/img/policeNew.png"),
-				],
-				isCamera: false,
-				count: 0,
-				isdetected: "请您保持脸部在画面中央",
-				videoEl: {},
-				canvasEL: {},
-			};
-		},
-		methods: {
-			// 调用摄像头
-			callCamera() {
-				let _this = this;
-				// H5调用电脑摄像头API
-				navigator.mediaDevices
-					.getUserMedia({
-						video: true,
-					})
-					.then((success) => {
-						_this.isCamera = true;
-						// 摄像头开启成功
-						_this.$refs["video"].srcObject = success;
-						// 实时拍照效果
-						_this.$refs["video"].play();
-
-						if (_this.$store.state.function.indexOf("face=1;") != -1) {
-							// this.$message.error("摄像头开启失败,请检查摄像头是否可用!");
-
-							const video = this.videoEl;
-							const canvas = this.canvasEL;
-							const canvasContext = canvas.getContext("2d");
-							let tracker = new window.tracking.ObjectTracker("face");
-
-							// video.pause();
-							// video.src = "";
-							tracker.setInitialScale(4);
-							tracker.setStepSize(2);
-							tracker.setEdgesDensity(0.1);
-							window.tracking.track("#video_cam", tracker, { camera: true });
-							tracker.on("track", function (event) {
-								const { autoCaptureTrackTraking } = _this;
-								canvasContext.clearRect(0, 0, canvas.width, canvas.height);
-								event.data.forEach(function ({ x, y, width, height }) {
-									canvasContext.strokeStyle = "#FFFF";
-									canvasContext.strokeRect(x + 10, y - 30, width - 20, height);
-									canvasContext.font = "11px Helvetica";
-									canvasContext.fillStyle = "#fff";
-								});
-
-								if (!(event.data.length == 0) && _this.count <= 10) {
-									if (_this.count < 0) _this.count = 0;
-									_this.count += 1;
-									if (_this.count > 10) {
-										_this.isdetected = "已检测到人脸";
-									}
-								} else {
-									_this.count -= 1;
-									if (_this.count < 0)
-										_this.isdetected = "请您保持脸部在画面中央";
-									//this.isdetected = '已检测到人脸,正在登录'
-								}
-							});
-						}
-					})
-					.catch((error) => {
-						// console.error("摄像头开启失败,请检查摄像头是否可用!");
-						_this.$message.error("摄像头开启失败,请检查摄像头是否可用!");
-					});
-			},
-			// 拍照
-			photograph() {
-				let ctx = this.$refs["canvas"].getContext("2d");
-				// 把当前视频帧内容渲染到canvas上
-				ctx.drawImage(this.$refs["video"], 0, 0, 300, 240);
-				// 转base64格式、图片格式转换、图片质量压缩
-				let imgBase64 = this.$refs["canvas"].toDataURL("image/jpeg", 0.7); // 由字节转换为KB 判断大小
-
-				let str = imgBase64.replace("data:image/jpeg;base64,", "");
-				let strLength = str.length;
-				let fileLength = parseInt(strLength - (strLength / 8) * 2); // 图片尺寸  用于判断
-				let size = (fileLength / 1024).toFixed(2);
-				console.log(size); // 上传拍照信息  调用接口上传图片 .........
-
-				// 保存到本地
-				// this.isCamera = false;
-				let ADOM = document.createElement("a");
-				ADOM.href = imgBase64;
-				ADOM.download = new Date().getTime() + ".jpeg";
-				ADOM.click();
-				this.$message({
-					message: "保存成功",
-					type: "success",
-				});
-			},
-			// 关闭摄像头
-			closeCamera() {
-				if (!this.$refs["video"].srcObject) {
-					this.isCamera = false;
-					return;
-				}
-				let stream = this.$refs["video"].srcObject;
-				let tracks = stream.getTracks();
-				tracks.forEach((track) => {
-					track.stop();
-				});
-				this.$refs["video"].srcObject = null;
-				this.isCamera = false;
-			},
-		},
-		mounted() {
-			// console.log(this.$store.state.function);
-			// var _s3 = document.createElement("script");
-			// _s3.src = "/static/materialize/jquery-2.1.3.min.js";
-			// _s3.type = "text/javascript";
-			// document.head.appendChild(_s3);
-			// var _s2 = document.createElement("script");
-			// _s2.src = "/static/camera.283d5d54.js";
-			// _s2.type = "text/javascript";
-			// document.head.appendChild(_s2);
-			// var _s1 = document.createElement("script");
-			// _s1.src = "/static/bundle.js";
-			// _s1.type = "text/javascript";
-			// document.head.appendChild(_s1);
-			// console.log(this.$store.state.function);
-			if (this.$store.state.function.indexOf("screen=1;") != -1) {
-				// this.$message.error("摄像头开启失败,请检查摄像头是否可用!");
-				this.callCamera();
-			}
-			this.videoEl = this.$refs.video;
-			this.canvasEL = this.$refs.canvasDOM;
-		},
-	};
+import tracking from "@/assets/js/tracking-min.js";
+import "@/assets/js/face-min.js";
+import * as faceapi from "face-api.js";
+
+export default {
+  data() {
+    return {
+      that: this,
+      img: [
+        require("../assets/img/light/screan.png"),
+        require("../assets/img/ai.png"),
+        require("../assets/img/tou1.png"),
+        require("../assets/img/policeNew.png")
+      ],
+      isCamera: false,
+      count: 0,
+      isdetected: "请您保持脸部在画面中央",
+      videoEl: {},
+      canvasEL: {},
+      // 预设样本图,支持本地,网络,beas64
+      sampleArr: [
+        // {
+        //   name: "编号1",
+        //   img: []
+        // }
+      ],
+      // 匹配图,支持本地,网络,beas64
+      detArr: [
+
+      ],
+      // 匹配结果
+      resultArr: [],
+      // 人脸匹配矩阵数组对象转码结果
+      faceMatcher: null
+    };
+  },
+  methods: {
+    // 调用摄像头
+    callCamera() {
+      let _this = this;
+      // H5调用电脑摄像头API
+      navigator.mediaDevices
+        .getUserMedia({
+          video: true
+        })
+        .then(success => {
+          _this.isCamera = true;
+          // 摄像头开启成功
+          _this.$refs["video"].srcObject = success;
+          // 实时拍照效果
+          _this.$refs["video"].play();
+
+          if (_this.$store.state.function.indexOf("face=1;") != -1) {
+            // this.$message.error("摄像头开启失败,请检查摄像头是否可用!");
+
+            const video = this.videoEl;
+            const canvas = this.canvasEL;
+            const canvasContext = canvas.getContext("2d");
+            let tracker = new window.tracking.ObjectTracker("face");
+
+            // video.pause();
+            // video.src = "";
+            tracker.setInitialScale(4);
+            tracker.setStepSize(2);
+            tracker.setEdgesDensity(0.1);
+            window.tracking.track("#video_cam", tracker, { camera: true });
+            tracker.on("track", function(event) {
+              const { autoCaptureTrackTraking } = _this;
+              canvasContext.clearRect(0, 0, canvas.width, canvas.height);
+              event.data.forEach(function({ x, y, width, height }) {
+                canvasContext.strokeStyle = "#FFFF";
+                canvasContext.strokeRect(x + 10, y - 30, width - 20, height);
+                canvasContext.font = "11px Helvetica";
+                canvasContext.fillStyle = "#fff";
+              });
+
+              if (!(event.data.length == 0) && _this.count <= 10) {
+                if (_this.count < 0) _this.count = 0;
+                _this.count += 1;
+                if (_this.count > 10) {
+                  _this.isdetected = "已检测到人脸";
+                }
+              } else {
+                _this.count -= 1;
+                if (_this.count < 0)
+                  _this.isdetected = "请您保持脸部在画面中央";
+                //this.isdetected = '已检测到人脸,正在登录'
+              }
+            });
+          }
+        })
+        .catch(error => {
+          // console.error("摄像头开启失败,请检查摄像头是否可用!");
+          _this.$message.error("摄像头开启失败,请检查摄像头是否可用!");
+        });
+    },
+    // 拍照
+    photograph() {
+      let ctx = this.$refs["canvas"].getContext("2d");
+      // 把当前视频帧内容渲染到canvas上
+      ctx.drawImage(this.$refs["video"], 0, 0, 300, 240);
+      // 转base64格式、图片格式转换、图片质量压缩
+      let imgBase64 = this.$refs["canvas"].toDataURL("image/jpeg", 0.7); // 由字节转换为KB 判断大小
+
+      let str = imgBase64.replace("data:image/jpeg;base64,", "");
+      let strLength = str.length;
+      let fileLength = parseInt(strLength - (strLength / 8) * 2); // 图片尺寸  用于判断
+      let size = (fileLength / 1024).toFixed(2);
+      console.log(size); // 上传拍照信息  调用接口上传图片 .........
+
+      // 保存到本地
+      // this.isCamera = false;
+      let ADOM = document.createElement("a");
+      ADOM.href = imgBase64;
+      ADOM.download = new Date().getTime() + ".jpeg";
+      ADOM.click();
+      this.$message({
+        message: "保存成功",
+        type: "success"
+      });
+    },
+    // 关闭摄像头
+    closeCamera() {
+      if (!this.$refs["video"].srcObject) {
+        this.isCamera = false;
+        return;
+      }
+      let stream = this.$refs["video"].srcObject;
+      let tracks = stream.getTracks();
+      tracks.forEach(track => {
+        track.stop();
+      });
+      this.$refs["video"].srcObject = null;
+      this.isCamera = false;
+    },
+
+    // 初始化模型加载,匹配矩阵
+    async fnInit() {
+      // 加载模型
+      await faceapi.loadFaceRecognitionModel("/models");
+      // 生成人脸匹配矩阵数组对象,样本图片同步转码
+      const labeledFaceDescriptors = await Promise.all(
+        this.sampleArr.map(async item => {
+          // 临时图片转码数据,将图片对象转数据矩阵对象
+          let descriptors = [];
+          for (let image of item.img) {
+            const imageEl = await faceapi.fetchImage(image);
+            descriptors.push(await faceapi.computeFaceDescriptor(imageEl));
+          }
+          // 返回图片用户和图片转码数组
+          return new faceapi.LabeledFaceDescriptors(item.name, descriptors);
+        })
+      );
+      // 人脸匹配矩阵数组对象转码结果
+      this.faceMatcher = new faceapi.FaceMatcher(labeledFaceDescriptors);
+    },
+    // 执行遍历识别匹配图片,数值误差越小越精确
+    fnRun() {
+      this.detArr.forEach(async img => {
+        let ts = Date.now();
+        // 将图片对象转数据矩阵对象,进行匹配
+        const inputEl = await faceapi.fetchImage(img);
+        const inputDescriptor = await faceapi.computeFaceDescriptor(inputEl);
+        const bestMatch = await this.faceMatcher.findBestMatch(inputDescriptor);
+        // 结果
+        this.resultArr.push({
+          target: img,
+          result: bestMatch.toString(),
+          time: Date.now() - ts + "ms",
+          fps: Math.round(1000 / (Date.now() - ts))
+        });
+      });
+    },
+    // 更换匹配图
+    async fnChange(e) {
+      if (!e.target.files.length) return;
+      this.detArr = [];
+      this.resultArr = [];
+      // 将文件显示为图像并识别
+      e.target.files.forEach(async file => {
+        let ts = Date.now();
+        let img = await faceapi.bufferToImage(file);
+        const inputDescriptor = await faceapi.computeFaceDescriptor(img);
+        const bestMatch = await this.faceMatcher.findBestMatch(inputDescriptor);
+        // 结果
+        this.detArr.push(img.src);
+        this.resultArr.push({
+          target: file.name,
+          result: bestMatch.toString(),
+          time: Date.now() - ts + "ms",
+          fps: Math.round(1000 / (Date.now() - ts))
+        });
+      });
+    }
+  },
+  mounted() {
+    // console.log(this.$store.state.function);
+    // var _s3 = document.createElement("script");
+    // _s3.src = "/static/materialize/jquery-2.1.3.min.js";
+    // _s3.type = "text/javascript";
+    // document.head.appendChild(_s3);
+    // var _s2 = document.createElement("script");
+    // _s2.src = "/static/camera.283d5d54.js";
+    // _s2.type = "text/javascript";
+    // document.head.appendChild(_s2);
+    // var _s1 = document.createElement("script");
+    // _s1.src = "/static/bundle.js";
+    // _s1.type = "text/javascript";
+    // document.head.appendChild(_s1);
+    // console.log(this.$store.state.function);
+    this.$nextTick(() => {
+      this.fnInit().then(() => this.fnRun());
+    });
+
+    if (this.$store.state.function.indexOf("screen=1;") != -1) {
+      // this.$message.error("摄像头开启失败,请检查摄像头是否可用!");
+      this.callCamera();
+    }
+    this.videoEl = this.$refs.video;
+    this.canvasEL = this.$refs.canvasDOM;
+  }
+};
 </script>
 
 <style scoped>
-	html,
-	body {
-		margin: 0;
-		padding: 0;
-		width: 100%;
-	}
-
-	.tip {
-		margin: 25px 0 30px 20px;
-		width: 419px;
-	}
-
-	.tip > img,
-	#screan > img,
-	#tou > img,
-	#ai > img,
-	#police > img,
-	.right > img {
-		width: 100%;
-		height: 100%;
-		user-select: none;
-	}
-
-	.img {
-		display: flex;
-		flex-direction: row;
-		justify-content: flex-start;
-		justify-content: center;
-		width: 100%;
-		height: 100%;
-		position: relative;
-	}
-
-	#screan {
-		width: 230px;
-		position: absolute;
-		z-index: 5;
-		top: 156px;
-		left: 108.3px;
-	}
-
-	#ai {
-		width: 230px;
-		position: absolute;
-		z-index: 3;
-		top: 155px;
-		left: 110px;
-	}
-
-	#tou {
-		width: 70px;
-		position: absolute;
-		z-index: 4;
-		top: 118px;
-		left: 190px;
-	}
-
-	#police {
-		width: 382px;
-		position: absolute;
-		z-index: 2;
-		top: 30px;
-		left: 35px;
-	}
-
-	.button {
-		color: #fff;
-		background: #8ca1de;
-		width: 550px;
-		height: 55px;
-		font-size: 20px;
-		text-align: center;
-		line-height: 55px;
-		position: absolute;
-		bottom: 10%;
-		left: 50%;
-		transform: translateX(-50%);
-		user-select: none;
-	}
-
-	.right {
-		width: 40px;
-		position: absolute;
-		left: 55%;
-		top: 70%;
-		display: none;
-	}
-
-	.dark {
-		background: #5b79d0;
-		cursor: pointer;
-	}
-
-	.controlZ {
-		width: 490px;
-		height: 900px;
-		/* margin-left: calc(50% - (490px / 2)); */
-		position: relative;
-	}
-
-	.cameraZ {
-		display: flex;
-		height: 340px;
-		flex-direction: column;
-		flex-wrap: nowrap;
-		width: 300px;
-	}
-
-	.cameraBtn {
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-	}
-
-	.cameraBtn button {
-		margin: 0 0 10px 0;
-	}
-
-	.face {
-		position: absolute;
-		z-index: 1;
-		padding: 26.5px 0;
-	}
-
-	.kuang {
-		padding: 26.5px 0;
-		position: absolute;
-		z-index: 2;
-	}
-
-	.left {
-		margin: 300px 130px 0 0;
-	}
-
-	.pFace {
-		width: 200px;
-		margin: 0 auto;
-	}
-
-	.close > img,
-	.save > img,
-	.pFace > img,
-	.open > img {
-		width: 100%;
-		height: 100%;
-	}
-
-	.cameraBtn {
-		margin-top: 80px;
-	}
-
-	.close {
-		margin-bottom: 25px;
-	}
-
-	.isPhoto {
-		padding: 20px 0 0 0;
-		box-sizing: border-box;
-	}
-
-	.nav {
-		text-align: center;
-		font-size: 32px;
-		color: #ccc;
-	}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  width: 100%;
+}
+
+.tip {
+  margin: 25px 0 30px 20px;
+  width: 419px;
+}
+
+.tip > img,
+#screan > img,
+#tou > img,
+#ai > img,
+#police > img,
+.right > img {
+  width: 100%;
+  height: 100%;
+  user-select: none;
+}
+
+.img {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+
+#screan {
+  width: 230px;
+  position: absolute;
+  z-index: 5;
+  top: 156px;
+  left: 108.3px;
+}
+
+#ai {
+  width: 230px;
+  position: absolute;
+  z-index: 3;
+  top: 155px;
+  left: 110px;
+}
+
+#tou {
+  width: 70px;
+  position: absolute;
+  z-index: 4;
+  top: 118px;
+  left: 190px;
+}
+
+#police {
+  width: 382px;
+  position: absolute;
+  z-index: 2;
+  top: 30px;
+  left: 35px;
+}
+
+.button {
+  color: #fff;
+  background: #8ca1de;
+  width: 550px;
+  height: 55px;
+  font-size: 20px;
+  text-align: center;
+  line-height: 55px;
+  position: absolute;
+  bottom: 10%;
+  left: 50%;
+  transform: translateX(-50%);
+  user-select: none;
+}
+
+.right {
+  width: 40px;
+  position: absolute;
+  left: 55%;
+  top: 70%;
+  display: none;
+}
+
+.dark {
+  background: #5b79d0;
+  cursor: pointer;
+}
+
+.controlZ {
+  width: 490px;
+  height: 900px;
+  /* margin-left: calc(50% - (490px / 2)); */
+  position: relative;
+}
+
+.cameraZ {
+  display: flex;
+  height: 340px;
+  flex-direction: column;
+  flex-wrap: nowrap;
+  width: 300px;
+}
+
+.cameraBtn {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.cameraBtn button {
+  margin: 0 0 10px 0;
+}
+
+.face {
+  position: absolute;
+  z-index: 1;
+  padding: 26.5px 0;
+}
+
+.kuang {
+  padding: 26.5px 0;
+  position: absolute;
+  z-index: 2;
+}
+
+.left {
+  margin: 300px 130px 0 0;
+}
+
+.pFace {
+  width: 200px;
+  margin: 0 auto;
+}
+
+.close > img,
+.save > img,
+.pFace > img,
+.open > img {
+  width: 100%;
+  height: 100%;
+}
+
+.cameraBtn {
+  margin-top: 80px;
+}
+
+.close {
+  margin-bottom: 25px;
+}
+
+.isPhoto {
+  padding: 20px 0 0 0;
+  box-sizing: border-box;
+}
+
+.nav {
+  text-align: center;
+  font-size: 32px;
+  color: #ccc;
+}
 </style>

+ 2 - 2
src/components/test.vue

@@ -189,9 +189,9 @@ export default {
       const image = new Image();
       image.src = param;
 
-      const tracker = new tracking.ObjectTracker("face");
+      const tracker = new window.tracking.ObjectTracker("face");
       tracker.setStepSize(1.7);
-      tracking.track(image, tracker);
+      window.tracking.track(image, tracker);
 
       tracker.on("track", function(event) {
         event.data.forEach(function(rect) {

BIN
static/models/age_gender_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/age_gender_model-weights_manifest.json


BIN
static/models/face_expression_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/face_expression_model-weights_manifest.json


BIN
static/models/face_landmark_68_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/face_landmark_68_model-weights_manifest.json


BIN
static/models/face_landmark_68_tiny_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/face_landmark_68_tiny_model-weights_manifest.json


BIN
static/models/face_recognition_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/face_recognition_model-shard2


File diff suppressed because it is too large
+ 0 - 0
static/models/face_recognition_model-weights_manifest.json


BIN
static/models/mtcnn_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/mtcnn_model-weights_manifest.json


BIN
static/models/ssd_mobilenetv1_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/ssd_mobilenetv1_model-shard2


File diff suppressed because it is too large
+ 0 - 0
static/models/ssd_mobilenetv1_model-weights_manifest.json


BIN
static/models/tiny_face_detector_model-shard1


File diff suppressed because it is too large
+ 0 - 0
static/models/tiny_face_detector_model-weights_manifest.json


Some files were not shown because too many files changed in this diff