{"id":661,"date":"2018-08-14T17:57:22","date_gmt":"2018-08-14T08:57:22","guid":{"rendered":"http:\/\/lizefieldwp.azurewebsites.net\/?p=661"},"modified":"2018-08-15T07:51:46","modified_gmt":"2018-08-14T22:51:46","slug":"face-detection","status":"publish","type":"post","link":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/2018\/08\/14\/face-detection\/","title":{"rendered":"face-api.js\u3067\u9854\u8a8d\u8b58"},"content":{"rendered":"<p>tensorflow.js\u3092\u4f7f\u3063\u3066\u9854\u8a8d\u8b58\u304c\u3057\u305f\u3044\u3068\u601d\u3063\u3066\u3044\u305f\u3089\u3001<a href=\"https:\/\/github.com\/justadudewhohacks\/face-api.js\" target=\"_blank\" rel=\"noopener\">face-api.js<\/a>\u306a\u308b\u3082\u306e\u3092\u767a\u898b\u3002\u7c21\u5358\u306b\u4f7f\u3048\u305f\u306e\u3067\u30e1\u30e2\u3068\u30c7\u30e2\u3002<\/p>\n<p>face-api.js: 0.10.0<br \/>\ntensorflow\/tfjs-core: 0.11.9<\/p>\n<p>\u8a66\u3057\u305f\u306e\u306fRails\u4e0a\u306eReact\u3060\u3051\u308c\u3069\u3082\u3001\u5358\u306a\u308bnode.js\u3067\u3082\u540c\u3058\u3002<\/p>\n<p><!--more--><\/p>\n<p><strong>\uff11\uff0e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078package\u306e\u8ffd\u52a0<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nyarn install face-api.js\r\n<\/pre>\n<p><strong>\uff12\uff0emodels\u306e\u53d6\u5f97<\/strong><br \/>\nface-api.js\u306e<a href=\"https:\/\/github.com\/justadudewhohacks\/face-api.js\/tree\/master\/weights\" target=\"_blank\" rel=\"noopener\">weights<\/a>\u306b\u7f6e\u3044\u3066\u304f\u308c\u3066\u3044\u308b\u3082\u306e\u3092\u5229\u7528<br \/>\npublic\/models\u306b\u3067\u3082\u914d\u7f6e<\/p>\n<p><strong>\uff13\uff0e\u4efb\u610f\u306ejsx\u3067face-api.js\u3092\u8aad\u307f\u8fbc\u307f<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nimport * as faceapi from 'face-api.js\/dist\/face-api.js';\r\n<\/pre>\n<p><strong>\uff14\uff0emodels\u306e\u8aad\u307f\u8fbc\u307f<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfaceapi.loadMtcnnModel('\/models')\r\n<\/pre>\n<p>\uff08\u88dc\u8db3\uff09\u4ee5\u4e0b\u306e\u65b9\u5f0f\u304c\u3042\u308b\uff08\u3056\u3063\u304f\u308a\u30e1\u30e2\u3001\u8a73\u3057\u304f\u306fface-api.js\u306egithub\u53c2\u7167\uff09<br \/>\nSSD Mobilenet v1\u30fb\u30fb\u30fb\u901f\u5ea6\u3001\u8a8d\u8b58\u7387\u306e\u30d0\u30e9\u30f3\u30b9<br \/>\nTiny Yolo v2\u30fb\u30fb\u30fb\u901f\u5ea6\u3092\u72a0\u7272\u306b\u8a8d\u8b58\u7387\u5bc4\u308a<br \/>\nMTCNN\u30fb\u30fb\u30fb\u8a8d\u8b58\u7387\u3092\u72a0\u7272\u306b\u901f\u5ea6\u5bc4\u308a<\/p>\n<p><strong>\uff15\uff0e\u9854\u8a8d\u8b58\uff08\u8a33\u3042\u3063\u3066async, await\u4f7f\u308f\u305a\uff09<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndetection(video) {\r\n  return new Promise((resolve, reject) =&gt; {\r\n    const params = { maxNumScales: 10, scaleFactor: 0.709, scoreThresholds: [0.6, 0.7, 0.7], minFaceSize: 20 }\r\n    faceapi.mtcnn(video, params)\r\n    .then(result =&gt; resolve(result))\r\n    .catch(error =&gt; reject(error))\r\n  })\r\n}\r\n<\/pre>\n<p><strong>\uff16\uff0e\u8a8d\u8b58\u7d50\u679c\u3092canvas\u306b\u63cf\u753b\u3059\u308b\u5834\u5408\u306b\u3001canvas\u306e\u30b5\u30a4\u30ba\u306b\u7d50\u679c\u3092\u30ea\u30b5\u30a4\u30ba\u3059\u308b\u95a2\u6570<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nresize(descriptions, width, height) {\r\n  return descriptions.map(m =&gt; m.faceDetection.forSize(width, height))\r\n}\r\n<\/pre>\n<p><strong>\uff17\uff0e\u8a8d\u8b58\u7d50\u679c\u3092canvas\u306b\u63cf\u753b\u3059\u308b\u95a2\u6570\uff08face-api.js\u306b\u5b9f\u88c5\u3057\u3066\u304f\u308c\u3066\u3044\u308b\uff09<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndraw(descriptions, canvas) {\r\n  descriptions.map(f =&gt; faceapi.drawDetection(canvas, f, { withScore: true }))\r\n}\r\n<\/pre>\n<p><strong>\uff18\uff0evideo\u8981\u7d20<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n&lt;video id='video' className={styles.video} autoPlay playsInline muted&gt;&lt;\/video&gt;\r\n<\/pre>\n<p><strong>\uff19\uff0e\u305d\u308c\u305e\u308c\u306e\u547c\u3073\u51fa\u3057<\/strong><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nconst video = document.getElementById('video')\r\nconst canvas = document.getElementById('canvas')\r\ndetection(video)\r\n.then((result) =&gt; {\r\n  \/\/ canvas\u30b5\u30a4\u30ba\u3092video\uff08stream\u3067\u306f\u306a\u304fhtml\u8981\u7d20\u306e\u65b9\uff09\u306b\u5408\u308f\u305b\u308b\r\n  canvas.width = video.clientWidth\r\n  canvas.height = video.clientHeight\r\n  \/\/ \u6620\u50cf\u3092canvas\u306b\u63cf\u753b\r\n  canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height)\r\n  \/\/ \u691c\u51fa\u7d50\u679c\u3092\u30ea\u30b5\u30a4\u30ba\r\n  const resized = resize(result, canvas.width, canvas.height)\r\n  \/\/ \u691c\u51fa\u7d50\u679c\u3092canvas\u306b\u63cf\u753b\r\n  draw(resized, canvas)\r\n})\r\n<\/pre>\n<p><strong>\uff11\uff10\uff0e\u30c7\u30e2<\/strong><\/p>\n<p><a href=\"https:\/\/matchup.lizefield.com\/demo\/face\" target=\"_blank\" rel=\"noopener\">https:\/\/matchup.lizefield.com\/demo\/face<\/a><\/p>\n<p>\u4e0a\u8a18\u30b5\u30a4\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u30ab\u30e1\u30e9\u30c7\u30d0\u30a4\u30b9\u306e\u8a31\u53ef\u78ba\u8a8d\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u300c\u8a31\u53ef\u300d\u3092\u884c\u3046\u3068\u30ab\u30e1\u30e9\u30c7\u30d0\u30a4\u30b9\u304b\u3089\u306e\u6620\u50cf\u304c\u5de6\u5074\u306b\u8868\u793a\u3055\u308c\u308b\u3002<br \/>\n\u300cChange Camera\u300d\u3067\u30ab\u30e1\u30e9\u30c7\u30d0\u30a4\u30b9\u306e\u5909\u66f4<br \/>\n\u300cStart Face Detection\u300d\u3067\u9854\u8a8d\u8b58\u958b\u59cb\u3001\u8a8d\u8b58\u7d50\u679c\u3092\u53f3\u5074\u306b\u8868\u793a<br \/>\n\u300cStop Face Detection\u300d\u3067\u9854\u8a8d\u8b58\u7d42\u4e86<\/p>\n<p>\u3053\u308c\u3089\u3092\u30ea\u30e2\u30fc\u30c8\u30ef\u30fc\u30af\u306e\u30c4\u30fc\u30eb\u306b\u7d44\u307f\u8fbc\u3093\u3060\u308a\u3059\u308b\u3053\u3068\u3067\u4f5c\u696d\u5b9f\u7e3e\u8a18\u9332\u3068\u3059\u308b\u306a\u3069\u3001\u8272\u3005\u306a\u4f7f\u3044\u65b9\u304c\u3042\u308a\u305d\u3046\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>tensorflow.js\u3092\u4f7f\u3063\u3066\u9854\u8a8d\u8b58\u304c\u3057\u305f\u3044\u3068\u601d\u3063\u3066\u3044\u305f\u3089\u3001face-api.js\u306a\u308b\u3082\u306e\u3092\u767a\u898b\u3002\u7c21\u5358\u306b\u4f7f\u3048\u305f\u306e\u3067\u30e1\u30e2\u3068\u30c7\u30e2\u3002 face-api.js: 0.10.0 tensorflow\/tfjs-core: 0. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[111,90,117,11],"tags":[135,134,133,132,91,92,62,112,136],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/posts\/661"}],"collection":[{"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/comments?post=661"}],"version-history":[{"count":6,"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/posts\/661\/revisions"}],"predecessor-version":[{"id":667,"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/posts\/661\/revisions\/667"}],"wp:attachment":[{"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/media?parent=661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/categories?post=661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lizefieldwp.azurewebsites.net\/index.php\/wp-json\/wp\/v2\/tags?post=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}