【就活最強!?】お辞儀で自動的にZOOM面接が終了するようにしてみた【OpenCV/Python】

ZOOM面接を自動で終了するシステム【Python/OpenCV】

こんにちは! けい(Twitter)です。

今回は、昨今のオンライン就活で使える画期的なシステムを作りました。
これを使えば、面接官の方から高評価不可避です。

システム概要

背景

現在私は大学院修士1年で、本格的に”就活”というものが始まりました。
あれよあれよと、人生のモラトリアムである学生生活が残りわずかになり、いざ決戦の時です。

夏インターンの選考を進み、何社かオンラインで面接を受ける機会がありました。

そこで思ったのです。

オンライン面接の切断の正解ってなんだ、、

と。

どの会社の面接官も 面接が終了すると、「そちらの方で切断してください」と言ってくるのです。
困りました。

そこで、切断の仕方について何個か候補が挙げられます。

  • 「失礼します」と言って切断
  • 「失礼します」と言って、お辞儀して、面接官の顔を見ながら切断
  • 「失礼します」と言って、お辞儀して、そのまま下を向きながら切断

「失礼します」と言うのは絶対として、面接官の顔を見ながら切断するのか、お辞儀しながら切断するのがいいのか悩みました。

大部分の就活生は、お辞儀をして面接官の顔を見ながら切断すると思います。

そこで、あえてお辞儀しながら切断をすることで、より印象に残りやすいのではないかと考えました。

そのときに、自動でビデオチャットを切断してくれるものがあれば、かっこよく切断できると思い、今回のシステムを作りました。

概要

ビデオチャット「zoom」は、Alt+qEnter
で会議を終了
することができます。

また、お辞儀をするとき顔面が隠れます

この2つの特性を利用して、顔認識が外れたら会議を終了するというプログラムを組みました。

顔認識プログラム

まずこのシステムの根幹である、顔認識プログラムを動作させましょう。

環境構築

今回のプログラムはPython3で動作させます。

その際、ライブラリとして以下の2つを用います。

  • opencv
  • pyautogui

opencvのインストール

opencvは画像処理のためのライブラリです。

お使いの環境に次のコマンドでインストールします。

pip install opencv-python

pythonインタプリタで、次の文を実行してみてエラーが出なかったらインストール完了です。

>>> import cv2

pyautoguiのインストール

pyautoguiは、人間がpcに行う動作ができるライブラリです。
例えば、マウスを操作したりキーボード入力などをpythonで行えるようになります。

pip install pyautogui

分類器のダウンロード

顔認識をする際に、顔認識の学習済みデータ(分類器)を使用します。

こちらのリンクから、フォルダをダウンロードします。
「haarcascade_frontalface_default.xml」という分類器を使用します。

後で出てくる顔認識のpythonファイル「face_detect.py」と同じ階層にダウンロードしたフォルダのdata以下をコピーしてください。

----
   |---face_detect.py
   |---data---haarcascades------------haarcascade_eye.xml
            |-haarcascades_cuda   |---haarcascade_eye_tree_eyeglasses
            |-hogcascades                       ・
            |-lbpcascades                       ・
         ・               |---haarcascade_frontalface_default        
         ・
         ・

顔認識してみる

ソースコード

import cv2

face_cascade = cv2.CascadeClassifier("data/haarcascades/haarcascade_frontalface_default.xml")

def detect_face(img):
    face_img = img.copy()
    face_rects = face_cascade.detectMultiScale(face_img,scaleFactor=1.2,minNeighbors=5)
    for (x,y,w,h) in face_rects:
        cv2.rectangle(face_img,(x,y),(x+w,y+h),(255,255,255),10)
    return face_img

cap = cv2.VideoCapture(0)
ret, frame = cap.read()
while True:
    ret, frame = cap.read()
    if ret == False:
        break
    frame = detect_face(frame)
    cv2.imshow("Video Face Detect", frame)
    k = cv2.waitKey(1)
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

解説

5行目~のdetect_faceという関数で、顔認識をして顔の範囲を四角形で表示しています。

実行するとこんな感じ。(出典:ガッキー公式サイト)

k==27となっているのは、Escキーのことです。
Escキーでプログラムを終了できます。

zoomでお辞儀退出プログラム

さて、ここまでプログラムが動作するのが確認できたら、次は実際にzoomを終了させるプログラムを動作させましょう。

OBS-studioのインストール

OBS-studioの使用理由

Pythonでwebカメラを使用しているので、同時にzoomでwebカメラを使用することができません。

そこで、「OBS-studio」というアプリの仮想カメラという機能を用います

OBS-studioは元々、youtuberなどの配信者向けの無料アプリで、画面に映っているものを配信したりすることに用います。

仮想カメラ機能は、画面に出力されているものを仮想のカメラとしてPCに認識させることができる機能です。
そのため、Python&OpenCVでwebカメラの処理結果を画面に出力して、それを仮想のカメラとして利用できます。

このリンクをクリックしてください。別タブで開くので、このサイトと同時並行で進められます。

windowsをお使いの方は、そのまま下の画像の部分をクリック。
macの方は、アップルマークをクリックしてから、「ダウンロードインストーラー」をクリック。

ダウンロードが完了したら、ダウンロードしたものを実行します。

後は、下の画像のように「Next」を押していき、最後に「Finish」でOBS-Studioのインストールが完了します。

プログラム

ソースコード

import cv2
import pyautogui as pgui
import time

face_cascade = cv2.CascadeClassifier("data/haarcascades/haarcascade_frontalface_default.xml")
i_old = 0
count = 0

def detect_face(img):
    face_img = img.copy()
    face_rects = face_cascade.detectMultiScale(face_img,scaleFactor=1.2,minNeighbors=5)
    for (x,y,w,h) in face_rects:
        cv2.rectangle(face_img,(x,y),(x+w,y+h),(255,255,255),10)
    if len(face_rects) ==0:
        isFace = 1
    else:
        isFace = 0
    return face_img, isFace

def key_output():
    pgui.keyDown('alt')
    pgui.keyDown('q')
    pgui.keyUp('alt')
    pgui.keyUp('q')
    time.sleep(1)
    pgui.keyDown('enter')
    pgui.keyUp('enter')
    

cap = cv2.VideoCapture(0)
ret, frame = cap.read()
while True:
    ret, frame = cap.read()
    if ret == False:
        break
    frame, isFace = detect_face(frame)
    cv2.imshow("Video Face Detect", frame)
    i_new = isFace
    if i_new & i_old:
        count += 1
    else:
        count = 0
    if count == 20:
        key_output()
    i_old = i_new
    k = cv2.waitKey(1)
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

解説

先ほどのプログラムからの改良点は、以下の3点です。

  • detect_face関数で、顔認識ができたか否かを返す変数の追加
  • キーボード出力の関数key_outputの追加
  • 連続して20回の顔認識が失敗したときにZOOMが終了するようにカウンター変数の追加

20回にした理由は、5回とかだとお辞儀をした瞬間にZOOMが終了してしまうので、面接官がお辞儀を見ずに終了してしまう恐れがあるためです。

そこで、お辞儀をしてから丁度1秒くらいになるように20回と設定しました。

実際の使い方

実際にZOOM面接で使用する時は以下の順で行います。

  1. pythonプログラムの実行開始
  2. OBS-studioで仮想カメラ開始
  3. ZOOMで面接開始

pythonプログラムの実行開始

まずはpythonプログラムを実行します。

pythonプログラムを実行すると、「Video Face Detect」という名前でwebカメラの画像がリアルタイムで出力されます。

下の画像は便宜上顔を黒塗りしましたが、今回のプログラムでは白枠で縁取られます。

OBS-studioで仮想カメラ開始

次に、OBS-studioで仮想カメラを開始します。

ソースの「+」→「ウィンドウキャプチャ」→「OK」の順にクリック。

ウィンドウキャプチャのプロパティが出てくるので、ウィンドウの部分を「Video Face Detect」に変更して、「OK」をクリック。

これで、OpenCVでの出力結果を仮想カメラとして選択できました。

最後に、画面サイズを大きくして「仮想カメラ開始」をクリックすれば仮想のカメラデバイスとして出力できます。

ZOOMで面接開始

では、最後にZOOMを開いて、設定でカメラに仮想カメラを選択すれば、OKです。
「OBS Virtual Camera」が仮想カメラのことです。

実際にやってみた

どんな感じで使えるのかはyoutubeでまとめました。