KNOWLEDGE - COLUMN ナレッジ - コラム

【エバンジェリスト・ボイス】Pythonで実現!顔認識プログラムでWeb会議中の集中力が判明?

先端技術部
エバンジェリスト 佐藤 久

テーマ選定にいたる経緯

お久しぶりです先端技術部の佐藤久です。今回のテーマ選定は、議事録作成のためZoomのWeb会議で動画を見直していた際、自分や参加者の視線や顔の向きが気になったことがきっかけとなります。クセもあるかもしれませんが、上下や左右など視線がふらつくと落ち着かず会議に集中していない印象がありました。そして、動画から機械的に分析できないかと考えました。調べてみるとPythonの各種ライブラリを使用すると実現できそうです。Pythonは業務では使用したことはありませんが、この機会に挑戦して業務にも活かしていきたいと考えております。

図1】顔の向き/視線による印象の違い例
【図1】顔の向き/視線による印象の違い例

今回行ないたいこと

  1. 動画から検出用の画像を抽出
  2. 画像から顔部品を検出して、顔の向きを検出
  3. 傾向をグラフなどで表現
  4. 本機能が他のビジネスに使えるか検討

事前準備

(1) Python(Anaconda)のインストール
今回、以下の2つのメリットを考えてPython実行環境のAnacondaディストリビューションをインストールいたしました。
① Pythonだけではなく、ツールやライブラリなどセットでインストールしてくれる。
② バージョン違いの仮想環境を作成できる。(特定VerのPythonでしか動作しないライブラリもあるため)
※②は先のライブラリインストールで役に立ちました。
※外部サイト:ANACONDA

(2) OpenCVのインストール
OpenCV(Open Source Computer Vision Library)は、画像処理や画像解析、機械学習等の機能を持つライブラリとして有名です。今回は動画から画像を抽出、または画像を加工して保存等するためインストールいたしました。

(3) Dlibのインストール
DlibはOpenCVと同様に画像処理や機械学習などのライブラリです。OpenCVにも顔認識がありますが、顔の部品(目鼻口など)を認識する機能があるためDlibを顔認識に選定いたしました。今回は検証していませんが、認識精度も比較して高いと評判です。
本線ではありませんが、Dlibインストール時にエラーが発生したので共有いたします。

【図2】Dlibインストール時のエラー
【図2】Dlibインストール時のエラー

Pyhonのバージョンが合わず、エラーになってしまいました。バージョンを下げる必要があります。前述したとおり、Anacondaはバージョン違いの仮想環境を作ることができます。
「$ conda create -n py35 python=3.5」を実行して仮想環境を作ることでインストールすることができました。

Pythonによる動画分析開始

事前準備が完了しましたので、Pythonを使用して動画から分析を行っていきます。最終的には動画からグラフ作成までのプログラムを結合しますが、まずは一つずつ試しながら実装していきます。

(1) 動画から検出用の画像を抽出
動画はリアルタイムで再生しながら確認するは時間がかかります。1時間の動画を確認するのに倍速でも30分かかります。あらかじめ1秒間隔などで画像として抽出することで分析時間を短縮いたします。

【図3】動画から画像抽出プラグラムサンプル
【図3】動画から画像抽出プラグラムサンプル

先ほどインストールしたOpneCV(cv2)の「VideoCapture」で動画を取得、指定秒数ごとに画像を抽出して保存します。図4通り動画から画像が抽出できました。30秒動画では3秒ほどで抽出が完了します。

【図4】動画から1秒間隔で抽出した画像
【図4】動画から1秒間隔で抽出した画像

(2) 画像から顔器官を検出して、顔の向きを判定
画像ファイルから顔部品(Dlibでは顔器官と定義)を検出して、顔の向きを分析いたします。Dlibの「shape_predictor_68_face_landmarks.dat」を使用すると画像の中の顔を抽出することができます。さらに「predictor」から顔器官(眼鼻口輪郭など68か所)の座標を取得することができます。まずはフリー写真で試してみます。

【図5】Dlibによる顔器官抽出例1(成人男性)
【図5】Dlibによる顔器官抽出例1(成人男性)

【図6】Dlibによる顔器官抽出例2(少年)
【図6】Dlibによる顔器官抽出例2(少年)

図5と図6をご参照、抽出した顔器官を緑色の丸で表しました。例以外にも試しましたが精度はかなり高いです。男女年齢関係なく、ほぼ確実に顔器官を抽出できました。ここまでは割と簡単に取得することが出来ました。しかし、それから顔の向きを判定するのが大変でした。OpenCVの「solvePnP」を使用すると顔器官の座標から三次元で測定して顔の向きを判定できそうでしたが、カメラや撮影位置等に依存する部分があり、Zoomの小さな画像では判定精度が安定しませんでした。今回は、少し誤差は出ますが汎用的に判定できるよう、輪郭17か所の座標から中心点(図5、図6の赤丸)を求めて、口の座標が中心点とずれているかどうかで顔の向きを判定しました。

【図7】顔の向き分析結果
【図7】顔の向き分析結果

横の差異がdiffx、縦の差異がdiffyです。一定の差異が発生した場合、顔の向きが画像に出力されます(Down、Rightなど)。顔の中心点は個人差が出ると思いますが、機械学習を組み込めば精度を上げることができそうです。
※プログラムは長くなってしまったため、掲載を見合わせます。ご連絡いただけばご連携いたします。

(3) 傾向をグラフなどで表現
上記で取得した中心点との差異をもとにグラフを作成いたします。横の差異diffx、縦の差異diffyを時間(秒)とともにCSVに出力して、Pandasライブラリでグラフを出力いたしました。グラフで表すと時間の経過と顔の向きが明確になります。
※PandasライブラリはAnacondaに含まれています。

【図8】顔の向きのグラフ
【図8】顔の向きのグラフ

【図9】グラフ作成プログラムサンプル
【図9】グラフ作成プログラムサンプル

(4) 本機能が他のビジネスに使えるか検討
今回実装してみた機能が他に活用できるか検討してみました。既にサービスとして存在するかもしれませんが、素早く柔軟に開発できれば活かすことが出来るかもしれません。

  ①テレビ会議システムの評価
作りこみをしていけば、顔の向きだけではなく、表情や黒目の位置なども判定できるようになると想定しています。Zoomで採用面接をしている場合にも使えると考えます。

  ②監視カメラの動画分析
常時録画されている動画は人手で確認は困難です。今回とは逆に顔が正面を向いている人をチェックして記録すると防犯につながるのではと考えます。

  ③商品マーケティング
スーパーや百貨店などの小売店などで、販売注力したい商品近くに小型のIOTカメラなどを設置してどんな人が注目しているか、購入するのかを記録して分析できそうです。展示会などで何回も見学している人を記録して購入期待度の判定にも使えそうです。

まとめ

今回、Pythonのライブラリを使用して、動画や画像分析のやり方を習得することができました。機械学習や画像分析などは敷居が高い、業務に活かせるのかわからないなど、思われている方が多いと思いますが、やってみると意外と簡単に出来ます(もちろん難しい部分もあることもわかりました)。IOTやDXなど今までと違った視点でシステム開発を考えていく上で、未経験の分野に挑戦していくことは大切であると考えます。

当サイトの内容、テキスト、画像等の転載・転記・使用する場合は問い合わせよりご連絡下さい。

エバンジェリストによるコラムやセミナー情報、
IDグループからのお知らせなどをメルマガでお届けしています。

メルマガ登録ボタン

佐藤 久

株式会社インフォメーション・ディベロプメント 先端技術部 エバンジェリスト

この執筆者の記事一覧

関連するナレッジ・コラム

導入必須!災害発生時に有効なタイムライン(防災行動計画)とは?

話題のRPAツールPower Automate Desktopに触れてみよう

実は脆弱?日本のサイバー能力と置かれたポジションを認識する