ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python/OpenCV/dlib】dlibとOpenCVを使って顔認識をする

rikoubou.hatenablog.com

 前回の記事でdlibをインストールしました。今回はそのdlibとOpenCVを使って顔認識をしていきます。

 では始めます。


1:学習済みデータのダウンロード
 顔の認識には学習済みのデータを使用します。

 上記のページを開き、一番下にある「shape_predictor_68_face_landmarks.dat.bz2」というファイルをダウンロードします。
f:id:rikoubou:20190314170724p:plain
 ファイルをダウンロードして解凍すると「shape_predictor_68_face_landmarks.dat」という学習済みデータであるdatファイルが作成されるので、これを利用していきます。(解凍すると100MBほどになるので注意してください)


2:顔認識のサンプルコード
 以下の内容をコピペして「dlibTest.py」というファイル名で保存します。

・dlibTest.py

#
# dlibとOpenCVを使った顔認識
#
import cv2
import dlib

def main():
	detector = dlib.get_frontal_face_detector()
	predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 学習済みファイル読み込み

	cap = cv2.VideoCapture(0) # 任意のカメラ番号に変更する

	while True:
		ret, frame = cap.read()

		k = cv2.waitKey(1)&0xff # キー入力を待つ
		if k == ord('q'):
			# 「q」キーが押されたら終了する
			break
		
		# 画面サイズを1/2にする
		height = frame.shape[0]
		width = frame.shape[1]
		frame = cv2.resize(frame , (int(width/2), int(height/2)))

		img = frame * 0
		dets = detector(frame[:, :, ::-1])
		if len(dets) > 0:
			parts = predictor(frame, dets[0]).parts() # 顔の点を取得

			# 確認
			for i in parts:
				# cv2.circle(frame, (i.x, i.y), 1, (255, 0, 0), -1)
				cv2.circle(img, (i.x, i.y), 1, (255, 0, 0), -1) # 点をプロット

		# cv2.imshow("camera", frame) # 画像を表示
		cv2.imshow("camera", img) # 画像を表示

	# キャプチャをリリースして、ウィンドウをすべて閉じる
	cap.release()
	cv2.destroyAllWindows()

if __name__ == '__main__':
	main()

 保存したらdlibTest.pyと同じ階層に1で準備した「shape_predictor_68_face_landmarks.dat」ファイルを配置します。
f:id:rikoubou:20190314171029p:plain

 Webカメラを繋げた状態でdlibTest.pyを実行すると以下のように顔の特徴点をとらえた画像が表示されます。
f:id:rikoubou:20190314171343p:plain


 以上がdlibとOpenCVを使って顔認識をする方法です。

 OpenCVだけでも顔認識などはできましたが、dlibを使った方がより精度が高く表情などが取れると思います。
 

・参考資料