---
title: "Pythonで手軽に顔認識をやってみる(face-recognition) | grasys blog"
url: "https://blog.grasys.io/post/uema/face-recognition/"
description: "はじめまして！エンジニアのUemaです。 近年では、スマホのロックの解除や入館時の認証など様々なことに顔認識の技術が使われています。 顔認識を利用するには機械学習、画像処理や数学などの様々な知識が必要で学習コストがかかり、顔認識を使ってアプリケーションを作ってみたいと考えている人もなかなか手が出ないと思います。 そん…"
---

# Pythonで手軽に顔認識をやってみる(face-recognition)

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[Kanji Uema](/authors/uema/)
-   公開日：2023年2月17日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#顔検出](/tags/顔検出/)[#顔認識](/tags/顔認識/)[#Python](/tags/python/)

![Pythonで手軽に顔認識をやってみる(face-recognition)](/_astro/hero.D_eQy7fV_Zw5szf.webp)

はじめまして！エンジニアのUemaです。

近年では、スマホのロックの解除や入館時の認証など様々なことに顔認識の技術が使われています。

顔認識を利用するには機械学習、画像処理や数学などの様々な知識が必要で学習コストがかかり、顔認識を使ってアプリケーションを作ってみたいと考えている人もなかなか手が出ないと思います。

そんな人に朗報です！

手軽に顔認識を行える[face-recognition](https://pypi.org/project/face-recognition/)というPythonライブラリが存在します！

今回は顔認識の入り口として、face-recognitionを実際に使ってみたいと思います。

## face-recognitionとは

Pythonコードやコマンドラインで手軽に顔を検出・認識することができるライブラリです。face-recognitionの顔認識モデルは99%の正解率を記録しているそうです。

## インストール(mac)

Pythonと[homebrew](https://brew.sh/index_ja)がインストールされていることが前提です。(Pythonのバージョンはなんでも良いですが、今回はPython 3.10.9で実施しています。)

face\_recognitionで使用しているdlibライブラリをインストールすることに必要なcmakeをインストールする。

`$ brew install cmake`

face\_recognitionライブラリをインストールする。

`$ pip install face_recognition`

## 顔を検出する

画像を読み込み、face\_recognitionのface\_locationsを使用すると検出した顔の座標が取得できます。

Plain textcontent\_copy

```
import face_recognition
from PIL import Image, ImageDraw

# 画像を読み込む
load_image = face_recognition.load_image_file("images/faces.jpg")

# 認識させたい画像から顔検出する
face_locations = face_recognition.face_locations(load_image)

pil_image = Image.fromarray(load_image)
draw = ImageDraw.Draw(pil_image)

# 検出した顔分ループする
for (top, right, bottom, left) in face_locations:
    # 顔の周りに四角を描画する
    draw.rectangle(((left, top), (right, bottom)),
                   outline=(255, 0, 0), width=2)

del draw

# 結果の画像を表示する
pil_image.show()
```

下記の画像を読み込みます。

![結果の画像を表示する画面](/_astro/01-faces-1024x683-e946460b.BrQwRixl_a91bz.webp)

実行結果は、下記の画像です。

きちんと顔を検出して、私の顔とスマホ内の顔を四角で囲んでいることがわかります。

![スマートフォン内の顔と本人の顔を検出した結果](/_astro/02-41cfdfc71c3c7a50c28b8b090219e393-1024x720-c9044e24.BOYfEFLi_nE7p5.webp)

## WBEカメラから顔認識を行う

WEBカメラの使用でOpenCVが必要になるため、ライブラリをインストールする。

`$ pip install opencv-python`

実装の流れとしては、下記の通りです。

1.  認識したい顔の画像を読み込み、顔の特徴値を取得する。
    
2.  WBEカメラから1フレーム読み込み、顔を検出しそれぞれの特徴値を取得する。
    
3.  検出した顔の特徴値と認識したい顔の特徴値を比較する。
    

Plain textcontent\_copy

```
import face_recognition
import cv2
import numpy as np

video_capture = cv2.VideoCapture(0)

# 画像を読み込み、顔の特徴値を取得する
hasegawa_image = face_recognition.load_image_file("images/hasegawa.jpg")
hasegawa_face_encoding = face_recognition.face_encodings(hasegawa_image)[0]
kanba_image = face_recognition.load_image_file("images/kanba.jpg")
kanba_face_encoding = face_recognition.face_encodings(kanba_image)[0]
uema_image = face_recognition.load_image_file("images/uema.jpg")
uema_face_encoding = face_recognition.face_encodings(uema_image)[0]

known_face_encodings = [
    hasegawa_face_encoding,
    kanba_face_encoding,
    uema_face_encoding,
]
known_face_names = [
    "Hasegawa",
    "Kanba",
    "Uema",
]

while True:
    # Webカメラの1フレームを取得、顔を検出し顔の特徴値を取得する
    _, frame = video_capture.read()
    rgb_frame = frame[:, :, ::-1]
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    # 1フレームで検出した顔分ループする
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # 認識したい顔の特徴値と検出した顔の特徴値を比較する
        matches = face_recognition.compare_faces(
            known_face_encodings, face_encoding)
        name = "Unknown"
        face_distances = face_recognition.face_distance(
            known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        # 顔の周りに四角を描画する
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # 名前ラベルを描画
        cv2.rectangle(frame, (left, bottom - 35),
                      (right, bottom), (0, 0, 255), cv2.FILLED)
        cv2.putText(frame, name, (left + 6, bottom - 6),
                    cv2.FONT_HERSHEY_TRIPLEX, 1.0, (255, 255, 255), 2)

    # 結果を表示する
    cv2.imshow('WebCam', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()
```

社長のHasegawaさん、経営企画のKanbaさんに協力していただき、下画像の顔を登録してWEBカメラから顔認識します。

![画像を読み込み、顔の特徴値を取得するの写真（1）](/_astro/03-hasegawa-ffff2ea3.GgXA_PAU_ZiiCGG.webp)

Hasegawaさん

![画像を読み込み、顔の特徴値を取得する画面](/_astro/04-kanba-1024x1024-b4028e4e.BNrVmw0K_ZweVhg.webp)

Kanbaさん

![顔認識に使用するKanbaさんの顔写真](/_astro/05-uema-06e9ea00.BZK3Lpei_2cSS6Q.webp)

Uema(私)

結果は、きちんと顔認識することができました。

別の画像でも顔を判別することができ、メガネを外した状態でも判別することができました。

![画像を読み込み、顔の特徴値を取得するの写真（2）](/_astro/06-kekka2-1-82ad4c28.DLDkK9CK_12v7wK.webp)

## 終わりに

機械学習などの知識があまりなくても簡単に顔認識を行うことができました。

実装した顔認識のプログラム以外にも、たくさんの[サンプル](https://github.com/ageitgey/face_recognition/blob/master/README_Japanese.md)があるので、興味がある方は実際に動かしてみてください。

顔検出や顔認識について内部の動作原理など知らなくても実装できますが、知っておいて損はないのでさらなる理解を深めたい場合は[こちら](https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78)を参照してください。

P.S.

Raspberry Pi を使い、顔認証からパスワード入力までやってみたブログも公開しています。

ご興味があれば、ぜひご覧ください！

[![終わりにの画面](/_astro/07-272dc546e7ff51ee8ab0d6f6be4f8838-1024x536-69bba81e.C_WasMdI_Z2riEgQ.webp)](https://blog.grasys.io/post/uema/python-face-recognition/)

## 参考

[Face Recognition(GitHub)](https://github.com/ageitgey/face_recognition)

[face-recognition(PyPI)](https://pypi.org/project/face-recognition/)

## この記事を書いた人

[![](/_astro/uema.CvdhHMEd_1hxSJA.webp)](/authors/uema/)

### [Kanji Uema](/authors/uema/)

Google CloudとPythonを活用し、データ基盤の設計・開発に取り組んでいます

[プロフィールと記事一覧](/authors/uema/)