こんにちは! けい(Twitter)です。
今回は、昨今のオンライン就活で使える画期的なシステムを作りました。
これを使えば、面接官の方から高評価不可避です。
目次
システム概要
背景
現在私は大学院修士1年で、本格的に”就活”というものが始まりました。
あれよあれよと、人生のモラトリアムである学生生活が残りわずかになり、いざ決戦の時です。
夏インターンの選考を進み、何社かオンラインで面接を受ける機会がありました。
そこで思ったのです。
オンライン面接の切断の正解ってなんだ、、
と。
どの会社の面接官も 面接が終了すると、「そちらの方で切断してください」と言ってくるのです。
困りました。
そこで、切断の仕方について何個か候補が挙げられます。
- 「失礼します」と言って切断
- 「失礼します」と言って、お辞儀して、面接官の顔を見ながら切断
- 「失礼します」と言って、お辞儀して、そのまま下を向きながら切断
「失礼します」と言うのは絶対として、面接官の顔を見ながら切断するのか、お辞儀しながら切断するのがいいのか悩みました。
大部分の就活生は、お辞儀をして面接官の顔を見ながら切断すると思います。
そこで、あえてお辞儀しながら切断をすることで、より印象に残りやすいのではないかと考えました。
そのときに、自動でビデオチャットを切断してくれるものがあれば、かっこよく切断できると思い、今回のシステムを作りました。
概要
ビデオチャット「zoom」は、Alt+q→Enter
で会議を終了することができます。
また、お辞儀をするとき顔面が隠れます。
この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のインストール
このリンクをクリックしてください。別タブで開くので、このサイトと同時並行で進められます。
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面接で使用する時は以下の順で行います。
- pythonプログラムの実行開始
- OBS-studioで仮想カメラ開始
- 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でまとめました。
Pythonでwebカメラを使用しているので、同時にzoomでwebカメラを使用することができません。
そこで、「OBS-studio」というアプリの仮想カメラという機能を用います。
OBS-studioは元々、youtuberなどの配信者向けの無料アプリで、画面に映っているものを配信したりすることに用います。
仮想カメラ機能は、画面に出力されているものを仮想のカメラとしてPCに認識させることができる機能です。
そのため、Python&OpenCVでwebカメラの処理結果を画面に出力して、それを仮想のカメラとして利用できます。