あなたに次の選択肢を用意するサイト
Thoth Coworker
~ プログラミングの次++ ~
For
新社会人 / 新学生 / 新院生 / 新研究者
カテゴリ
Webでリアルタイム顔認識を動かしてみる
Facebookシェア Twitterツイート LINEで送る
P
ポイント
Webでリアルタイム顔認識を動かしてみる
Webで簡単に最新のDeepLearningによるWebカメラ+リアルタイム顔認識を試すための記事
  • Point 1
    FaceApi.jsを試用
    FaceApi.jsはTensorFlowを利用した学習済みネットワークによる顔認識ライブラリです.JavaScriptでクライアントサイドのブラウザ内で完結し、GPU等は特別必要なく10fpsほどの処理を行います
  • Point 2
    Webカメラを使用
    Webカメラの動画を使用して、許可をもらった上で顔認識をします.
  • Point 3
    複数人の顔認識を描く顔のパーツ付きで実現
    複数人の顔を検出し顔のパーツを頂上表示. 各点の座標を取得可能です.
P
ステップ概要
Webでリアルタイム顔認識を動かしてみる
何よりもまず顔認識のサンプルコードを準備します.
Pythonを使って簡易的なWebサーバを立てます
実行して実際にWebカメラによるリアルタイム顔認識を確認します
カメラの整備や初期化などコード全体の解説
顔認識を実行している箇所に関して解説
結果表示を行なっている箇所の解説
Step
1
顔認識プログラムを準備
次にプログラムを用意し、動かすことを優先します.全体の解説は追って行います.
以下のようなフォルダの構造になるように次のファイルを置いてください.
Folder : 顔認識プログラムのフォルダ
face-api-sample.html
face_landmark_68_model-shard1
face_landmark_68_model-weights_manifest.json
face_landmark_68_tiny_model-shard1
face_landmark_68_tiny_model-weights_manifest.json
tiny_face_detector_model-shard1
tiny_face_detector_model-weights_manifest.json
lib/
face-api.min.js
続いて各ファイルの中身です.
まず,face-api-sample.htmlは以下のコードとなります.
HTML : FaceApi.jsによるリアルタイムWebカメラ顔認識
face-api-sample.js
    
<html>
    <head>
        <script src="./lib/face-api.min.js"></script>
        <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    </head>
    <body>
        <div  style="position: relative">
            <video id="video" onloadedmetadata="onPlay(this)"  muted autoplay width="640" height="480"></video>
            <canvas id="facecanvas" style="  position: absolute;  top: 0; left: 0;" width="640" height="480"></canvas>
        </div>
        <script>
	const canvas = document.getElementById( 'facecanvas' );
	const videoEl = document.getElementById( 'video' );
	const inputSize = 224;
	const scoreThreshold = 0.5;
	const options = new faceapi.TinyFaceDetectorOptions({ inputSize, scoreThreshold });
	    
	async function onPlay()
	{
            if(videoEl.paused || videoEl.ended || !faceapi.nets.tinyFaceDetector.params)
                return setTimeout(() => onPlay())
	    
            const result = await faceapi.detectSingleFace(videoEl, options).withFaceLandmarks()
            if (result) {
                const dims = faceapi.matchDimensions(canvas, videoEl, true)
                const resizedResult = faceapi.resizeResults(result, dims)
                faceapi.draw.drawDetections(canvas, resizedResult)
                faceapi.draw.drawFaceLandmarks(canvas, resizedResult)
            }
            setTimeout(() => onPlay())
  	};
	    
        async function run(){
            await faceapi.nets.tinyFaceDetector.load('/')
            await faceapi.loadFaceLandmarkModel('/')
	    const stream = await navigator.mediaDevices.getUserMedia({ video: {} })
	    videoEl.srcObject = stream;
        }

      	$(document).ready(function() {
            run();
        });
	    
        </script>
    </body>
</html>
    
  
また、jsonとshard1のファイルに関しては下記のレポジトリのパスより取得ください.
jsonファイルやshard1のファイル
libフォルダにあるface-api.min.jsに関しては下記より取得ください.
face-api.min.js
Step
2
Webサーバを立てる
ここではWebサーバを最も簡単な方法で立てます.
Bash : PythonでWebサーバを立てる
      
python3 -m http.server 8000 
      
    
これで簡単なWebサーバを立てることができました.
Webサーバを立てる方法について、詳しくは「とりあえずWebサーバを立ててみる」をご参照ください.
自分のパソコンにとりあえず Webサーバを立ててみる
簡単にシンプルなWebサーバを立てるためのページです.
リンク
Step
3
顔認識を実行する
それではいよいよ実行します.
下記のアドレスをブラウザのURLバーに貼り付けて開いてください.ポート番号をStep2で変えている方は適宜8000から変更してください.
: ブラウザで開く
http://localhost:8000/face-api-sample.html
上記の実行によって以下のような画面が出ます.(※要Webカメラ)
実行結果画面
Step
4
コード解説:全体概要
コード全体の解説を行います
全体構成は以下のようになっています.
サンプルコード全体構成
まず、run関数の中で顔認識で使用するモデルを読み込みます.
その後、onPlayが繰り返し呼び出されることで、顔認識の結果がWebカメラから入力される画像を元に更新されていきます.

onPlayの中では、Webカメラで撮影された画像がFaceApi.jsの顔認識処理に渡され、顔の位置や確信度が計算されます.その後、その結果を元にcanvasへ画面の顔の描画を行っています.こちらもFaceApi.jsでそれ用の関数が用意されています.

onPlayの中で失敗した場合(ビデオが読み込まれなかったり、モデルが読み込まれていなかった場合)や顔認識の結果を表示した後に次のonPlayの処理が実行されるように設定しています.
Step
5
コード解説:顔認識
実際に顔認識を行なっているのは以下の行です.
JavaScript : 顔認識処理
    
const result = await faceapi.detectSingleFace(videoEl, options).withFaceLandmarks()
    
  
detectSingleFaceは一つの顔を認識する関数です.ビデオエレメントと検出のオプションを渡しています.また後処理の顔のパーツの描画のために、withFaceLandmarksも実行することで、顔のパーツの座標も取得します.
Step
6
コード解説:結果表示
最後にdetectSingleFaceから帰ってきたresultに中身があればそれを表示します.
JavaScript : 顔認識結果の表示処理
    
if (result) {
    const dims = faceapi.matchDimensions(canvas, videoEl, true)
    const resizedResult = faceapi.resizeResults(result, dims)
    faceapi.draw.drawDetections(canvas, resizedResult)
    faceapi.draw.drawFaceLandmarks(canvas, resizedResult)
}
    
  
resultがある場合即ち顔が認識された場合のみ描画を行います.前半は、canvasのサイズとビデオのサイズを確認してそれに合わせて結果の位置座標を変換して描画に使用する準備をしています.

drawDetectionsでは顔の位置と確信度をCanvasに描画します.
またdrawFaceLandmarksで顔のパーツをCanvasに描画していきます.
Done