Python

【初心者向け】爆速 PythonとOpenCVで作る顔認識による自動勤怠管理システム


今回はPythonとOpenCVを使用して、顔認識を行いながら自動で勤怠管理をするシステムを作成する方法を紹介します。このプログラムは初心者の方でも簡単に実装できるものであり、特に出勤管理にお悩みの方にとって役立つ内容となっています。誰でもシステムが作れるようになります。

・勤怠管理がカードで手打ちしているのが面倒
・勤怠管理をまとめるのが面倒
・自分で顔認識システムを作ってみたい

こんな疑問を解決します。

ブログの対象者
 ・勤怠管理をいまだに紙でまとめていて面倒な人
 ・Excelでデータまとめて面倒な人
 ・顔認識に興味を持っていて自分でシステムを作りたい人
 ・Python やOpenCVに興味がある人

本記事では以下のフローでプログラムを動かしています。

  1. カメラ画像の取り込み
  2. カメラ画像から顔を検出して赤い枠で囲む
  3. 顔の登録と名前の入力ポップアップで名前の登録
  4. 顔画像の類似度を計算し、閾値以下の顔には緑の枠と名前を表示する

このフローで、顔認識を行っております。顔が入ったときに、出勤時間・退勤時間をCSVファイルに保存する方法は次のブログで紹介します。今回はここまで紹介したいと思います。

実際のプログラムの様子がこちらです。

🚀 0円で現役エンジニアから学べる【Techスクールオンライン】のお申込みをお勧めします。 このオンラインスクールでは、現役のエンジニアから直接学ぶことができ、プログラミングの基礎から高度なスキルまでを習得できます。しかも、今なら 0円 で受講できるチャンスです。 エンジニア転職を考えている方やプログラミングに興味がある方、新しいスキルを習得したい方に特におすすめです。

顔認識の基礎知識とOpenCVの導入方法

顔認識の基礎知識

顔認識の重要性と自動勤怠管理システムへの応用について説明します。また、Haar Cascade、DNNなどの顔認識アルゴリズムの概要や顔検出、特徴抽出、類似度計算などの基本概念について解説します。

  1. 顔検出
    顔検出は、画像内から顔の領域を見つける処理です。様々なアルゴリズムが使用されますが、Haar CascadeやDNN (Deep Neural Networks) が一般的です。これらのアルゴリズムは、画像内のパターンや特徴を学習して、顔の存在を検出する能力を持っています。
  2. 特徴抽出
    顔検出後、顔の特徴を抽出することが重要です。特徴抽出は、顔の形状、目、鼻、口などの局所的なパターンや特徴を表現するための処理です。特徴抽出は、機械学習アルゴリズムや統計的手法を使用して行われます。
  3. 類似度計算
    類似度計算は、登録された顔画像と新たに検出された顔画像の類似度を評価する処理です。類似度計算には、距離メトリクス(例:ユークリッド距離、コサイン類似度)が使用され、顔画像間の特徴的な差異を評価します。
  4. 閾値の設定
    類似度計算の結果を基に、顔を識別するための閾値を設定します。この閾値は、類似度のしきい値を表し、設定した閾値以下の類似度の場合には同一人物と見なします。

顔認識の基礎知識を理解することで、顔の検出や特徴抽出、類似度計算、閾値の設定などの概念を把握することができます。これらの基本概念を実際のプログラムやアルゴリズムに組み合わせることで、顔認識システムを構築することが可能となります。

OpenCVの導入方法

PythonでのOpenCVの導入手順を具体的に説明します。pipを使用したインストール方法やバージョン管理についても触れながら、OpenCVの特徴や利点を紹介します。さらに、必要なデータセットやライブラリの準備についても説明します。

OpenCVはPythonで顔認識などの画像処理タスクを行うための強力なライブラリです。以下に、初心者にもわかりやすいOpenCVの導入方法を説明します。

pipのアップグレード:
Pythonパッケージを簡単にインストールするために、pipを最新のバージョンにアップグレードします。コマンドプロンプトまたはターミナルを開き、次のコマンドを実行してください

pip install --upgrade pip

OpenCVのインストール:
pipを使用してOpenCVをインストールします。以下のコマンドを実行してください。

pip install opencv-python

これにより、OpenCVがPythonに正常にインストールされます。

インストールの確認:

インストールが正常に完了したかどうかを確認するために、Pythonの対話型シェルを起動し、以下のコードを実行してみましょう。

import cv2
print(cv2.__version__)

OpenCVのバージョン番号が表示されれば、インストールは成功しています。

OpenCVの導入が完了しました。これでPythonでOpenCVを使用して画像処理のプログラムを作成する準備が整いました。OpenCVの関数やクラスを使用するためには、プログラムの先頭で以下のようにimport文を追加する必要があります。

import cv2




以上の手順に従ってOpenCVを導入することで、Pythonでの画像処理にOpenCVを活用することができます。

カメラ画像を取り込み、顔認識・名前登録する実際にプログラムを動かしてみる

プログラムコードと内容説明

OpenCVを使用してカメラからの映像をキャプチャして、顔認識、名前を登録するプログラムがこちらになります。カスケード分類器(‘haarcascade_frontalface_default.xml’)についてはanacondaの場合はおそらく下記ライブラリの保存先に入っていますので、そこから、探してください。openCVをインストールした際に、保存されています。このファイルをプログラムのフォルダに移動します。C:\Users\user\\anaconda3\Lib\site-packages\cv2

import cv2
import numpy as np

# カスケード分類器のパス
cascade_path = 'haarcascade_frontalface_default.xml'

# 顔検出用のカスケード分類器を作成
face_cascade = cv2.CascadeClassifier(cascade_path)

# カメラキャプチャの初期化
cap = cv2.VideoCapture(0)

# 顔の登録用の関数
def register_face():
    # 登録する人物の名前を入力
    name = input("名前を入力してください: ")
    # 人物の顔画像を保存
    cv2.imwrite(f"{name}.jpg", frame)
    print("登録が完了しました。")

# 顔画像の類似度を計算する関数
def calculate_similarity(face1, face2):
    face1_gray = cv2.cvtColor(face1, cv2.COLOR_BGR2GRAY)
    face2_gray = cv2.cvtColor(face2, cv2.COLOR_BGR2GRAY)
    # 二つの顔画像の差分を計算
    diff = cv2.absdiff(face1_gray, face2_gray)
    # 差分画像の合計値を計算
    diff_sum = np.sum(diff)
    # 類似度スコアを計算
    similarity = diff_sum / face1_gray.size
    return similarity

# メインの処理ループ
while True:
    # カメラからフレームをキャプチャ
    ret, frame = cap.read()

    # フレームをグレースケールに変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 顔の検出
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 検出された顔に枠を描画
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)

    # キーボード入力の待機
    key = cv2.waitKey(1) & 0xFF

    # 's'キーが押された場合は顔の登録を行う
    if key == ord('s') and len(faces) > 0:
        register_face()

    # 登録された顔を検出して表示
    if len(faces) > 0:
        # 登録された顔画像と一致するかを判定
        for name in ["BOB", "person2", "person3"]: #person2, person3には登録したい名前を入れる。今回はBOB
            if cv2.imread(f"{name}.jpg") is not None:
                # 登録された顔画像を読み込み
                registered_face = cv2.imread(f"{name}.jpg")
                # 顔の位置とサイズ
                rx, ry, rw, rh = faces[0]

                # 登録された顔画像をリサイズ
                registered_face_resized = cv2.resize(registered_face, (rw, rh))

                # 類似度を計算
                similarity = calculate_similarity(frame[ry:ry+rh, rx:rx+rw], registered_face_resized)

                # 類似度が閾値以下の場合は緑の枠で囲む
                threshold = 0.2  # 類似度の閾値(調整可能)
                if similarity < threshold:
                    # 赤い枠を描画しない
                    continue

                # 緑の枠と名前を表示
                cv2.rectangle(frame, (rx, ry), (rx+rw, ry+rh), (0, 255, 0), 2)
                cv2.putText(frame, name, (rx, ry - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # カメラ画像を表示
    cv2.imshow('Face Recognition', frame)

    # 'q'キーが押された場合はプログラムを終了
    if key == ord('q'):
        break

# カメラキャプチャを解放し、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()

プログラムを動かした様子

では実際に動かしてみます。実行すると、カスケード分類器により、顔を認識し、顔の部分に赤色で枠線が表示されます。

さらに、キーボードでsを押すと、顔の画像を登録できます。

こんなポップアップがVisual codeの画面で表示されます。今回は名前をBOBで登録します。

プログラムの中に、person1, person2, person3と名前の登録画面があるので、今回は、personにBOB.jpgファイルを保存するようになるので、BOBと入力しておきます。Enterをおす。

これでBOBという名前で先ほどの画像が登録されました。この状態でカメラキャプチャ画像に戻ると、

BOBと表示され、顔が認識され、緑の枠で囲われています。このように顔認識と名前の登録を行うことができました。これを使えば、出勤時、退勤時間を自動で登録された顔が表示されたときに、時間をCSVファイルに登録することができます。これにより、簡単に勤怠時間のデータ化を行うことができます。例えば、出勤時には、aを押したときに、登録された顔gあ表示された場合、CSVファイルに出勤時間と名前を記録するなど簡単にできます。

まとめ

いかがでしたか。今回はopenCVを使用した方法で、簡単に顔認識・登録することができることを紹介しました。この方法を応用することで、簡単に勤務時間管理・出勤・退勤登録を行うことができます。今でもタイムカードや、手書きの出勤時間を書いたり、Excelで記載しているところもあるので、PC1台あれば、こんなことが簡単にでき、時間のデータ化を簡単に行うことができます。

🚀 0円で現役エンジニアから学べる【Techスクールオンライン】のお申込みをお勧めします。 このオンラインスクールでは、現役のエンジニアから直接学ぶことができ、プログラミングの基礎から高度なスキルまでを習得できます。しかも、今なら 0円 で受講できるチャンス。
私がツナグバに登録してから、求人情報が豊富に届き、自分に合った仕事を見つけることができました。特に、第二新卒向けの求人情報が多いので、自分のスキルや経験を活かしながら新たなキャリアに挑戦することができました。転職活動は不安も多いですが、ツナグバのサポートがあれば、成功への道が明るく感じました。