BLOG

【AI開発チャレンジ】顔認識機能をつくってみよう #3 人物識別編【Python】

2024-10-28

■過去回はこちら!
#1:環境構築編
#2:顔認識実装編

どうもロックシステムのみなみです!

お待たせしました『【AI開発チャレンジ】顔認識機能つくってみよう!』の第3回です!

前回に引き続き
使用するコードはChatGPTを使って生成!
フォルダ内の画像の人物とカメラに映る人物が一致するか判別できるようにしていきます。

人物を識別できるように設定


import numpy as np


まずnampy(ナムパイ)を利用できるようにする。



# ニューラルネットワークオブジェクト生成
net = cv2.dnn.readNetFromCaffe(r'deploy.prototxt', r'res10_300x300_ssd_iter_140000_fp16.caffemodel')


学習済みの重みファイル「cv2.dnn.readNetFromCaffe」を用いて、ニューラルネットワークモデルの設定ファイル「deploy.prototxt」を読み込み、認識処理で使用するニューラルネットワークオブジェクトを生成する。



# 名前と画像ファイルの対応リスト
names = {
    'person1': r'C:\FaceDetect\img\person2.png',
    'monkey': r'C:\FaceDetect\img\monkey.png',
    'RockSystem': r'C:\FaceDetect\img\RockSystem.png',
}

# 画像ファイルを顔画像として読み込む
face_images = {name: cv2.imread(path) for name, path in names.items()}

第一回で用意しておいた画像をimgフォルダに格納しておきます。
格納した画像の人物が映った時に表示される名前を設定。
そして画像を「顔」として認識させます。



# 顔領域を切り取り
        face_roi = img[y:y+h, x:x+w]

imgフォルダに格納された画像から顔領域を検出して切り出し、face_roiに代入。



        # 顔認識の処理...
        blob = cv2.dnn.blobFromImage(face_roi, 1.0, (300, 300), (104.0, 177.0, 123.0))

画像のサイズや色の平均値を設定して、顔の画像をニューラルネットワーク用に変換。

引数1は対象となる画像データ
引数2は画像のスケーリング係数。画像を比較しやすいデータに変換する数値で通常は1.0を設定
引数3は画像サイズ。ここでは300*300でリサイズ
引数4は画像の平均値。顔認識の安定性を向上させるために設定するもの。一般的に (104.0, 177.0, 123.0) のような定数が使用されます。

これは顔認識のための前処理となります。



        net.setInput(blob)
        detections = net.forward()

そしてニューラルネットワークにデータを設定し、顔検出を実行します。



        # 顔認識結果の取得
        confidence = detections[0, 0, 0, 2]
        if confidence > 0.5:
            # 最大類似度
            max_similarity = 0.0
            max_name = 'Unknown'

顔認識が終わると、その結果から信頼度(confidence)を取得します。
この値は0から1までの範囲で、1に近いほど認識が正確だと言えます。
ここでは信頼度が0.5以上であれば、認識が成功したと判断して次のステップに進むように設定しました。



            # 最も類似度が高い名前を取得
            for name, face_image in face_images.items():
                similarity = cv2.compareHist(cv2.calcHist([face_roi], [0], None, [256], [0, 256]),
                                             cv2.calcHist([face_image], [0], None, [256], [0, 256]),
                                             cv2.HISTCMP_CORREL)
                # 類似度が更新された場合、一致する氏名を更新
                if similarity > max_similarity:
                    max_similarity = similarity
                    max_name = name

次に、誰の顔かを特定するために、登録されている顔画像との類似度を計算します。
いま映ってる人物と登録画像の類似度を比較して、最も似ている名前を返します。

引数1はカメラの画像のヒストグラム
引数2は保存している画像のヒストグラム
引数3は相関係数によって類似度を評価するための定数



            # 顔領域に名前を表示
            cv2.putText(img, max_name, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)

名前を顔の上部に表示させます。
表示する座標や、色、フォントサイズ、文字の太さも指定できます。
ここでは先に設定してある四角い枠の10px下に、枠と同じ青色で表示されるよう設定しました。

エラーの修正

今の状態だと2人以上映るとエラーで落ちてしまうため、PowerShellに表示されたエラーをChatGPTをつかって修正していきます。

        # face_roi が空でないか確認
        if face_roi is None or face_roi.size == 0:
            print("顔領域が空です")
            continue  # スキップして次の顔を処理

「face_roiが空でないかの確認が必要」と、修正に必要なコードと一緒に回答があったためそのままコピペして修正。
これで2人以上が同時に映ってもエラーは発生しないようにできました!


以上で顔認識機能づくりは終わりです!
エラーの修正と同じようにChatGPTを利用して顔認識精度の向上もできるのでよかったらチャレンジしてみてください!

完成したコードは以下からダウンロードできます↓
https://drive.google.com/file/d/1L7EG5lOoRbWp-wza6zoD4x1CLe_wd6xT/view?usp=sharing

株式会社ロックシステム

「ブラック企業をやっつけろ!!」を企業理念にエンジニアが働きやすい環境をつきつめる大阪のシステム開発会社。2014年会社設立以来、残業時間ほぼゼロを達成し、高い従業員還元率でエンジニアファーストな会社としてIT業界に蔓延るブラックなイメージをホワイトに変えられる起爆剤となるべく日々活動中!絶賛エンジニア募集中。

CATEGORY