【Python】cmakeを使った顔のランドマーク検出システム

サムネイル
当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

顔にランドマーク(3Dマスク)を付ける。

顔のランドマーク検出

※画像の人物は、こちらからお借りしました。

Pythonで顔認識システムを作りたいと考えているけど、
どこから始めればいいか迷っている方も多いのではないでしょうか。

本記事では、CMakeとPythonを組み合わせて顔認証システムをゼロから作成する手順を解説します。
Pythonの強力なライブラリとCMakeのビルド自動化の力を駆使して、
実用的で高性能な顔認証システムを構築します。

本記事は次の人におすすめ
  • 顔認識システムをPythonで作成したい方
  • CMakeの基本を学び、プロジェクトに活用したい方
  • OpenCVやface_recognitionライブラリを使った応用技術を学びたい方
  • 画像処理や機械学習に興味がある初級~中級者
  • 高度な顔認識アルゴリズムを効率的に導入したい方
スポンサーリンク

cmakeとは

CMakeは、クロスプラットフォームのビルドシステムで、
ソースコードのコンパイルやビルドの自動化を行うツールです。

複雑なプロジェクトのビルドプロセスを簡潔にまとめて、環境に依存せずにコードを管理できる点で、
特に多くのライブラリを利用するC++プロジェクトやPython拡張モジュール開発において広く利用されています。

用途

CMakeは、主にC++プロジェクトで利用されますが、
Python拡張やライブラリのビルドにも非常に便利です。

顔認証システムのように、OpenCVやface_recognitionなどの外部ライブラリを統合するプロジェクトにおいて、CMakeを使うと環境に依存せず簡単にセットアップが可能です。

インストール方法

Python専用のライブラリを使う場合は、pipでインストールできますが、
cmakeはpipではなく、公式のウェブサイトからダウンロードします。

顔ランドマーク(3Dマスク)の検出

顔認識のさらなるステップとして、顔のランドマーク検出が重要です。

顔のランドマークとは、目、眉毛、鼻、口などの主要なパーツの位置を指します。

これにより、顔の特徴を捉えた3Dマスク風の画像処理が可能になります。
Pythonのface_recognitionライブラリを使うと、これらのランドマークを簡単に検出できます。

ソースコード

import cv2
import face_recognition
import numpy as np
from tkinter import filedialog
import os

# 画像ファイルを選択
def select_image():
    global image_path
    image_path = filedialog.askopenfilename(title="画像を選択", filetypes=[("Image files", "*.jpg;*.png")])
    if image_path:
        apply_3d_mask(image_path)

# 画像に3Dマスク風の線を付けて新しい画像として保存
def apply_3d_mask(image_path):
    image = cv2.imread(image_path)
    if image is None:
        print("画像の読み込みに失敗しました。")
        return
    
    # 顔のランドマークを検出
    face_landmarks_list = face_recognition.face_landmarks(image)
    
    if len(face_landmarks_list) == 0:
        print("顔が検出されませんでした。")
        return
    
    # 各顔パーツに線を描画
    for face_landmarks in face_landmarks_list:
        # 顎の輪郭に沿って線を描く
        cv2.polylines(image, [np.array(face_landmarks['chin'])], isClosed=False, color=(0, 255, 0), thickness=2)
        
        # 眉毛
        cv2.polylines(image, [np.array(face_landmarks['left_eyebrow'])], isClosed=False, color=(0, 255, 0), thickness=2)
        cv2.polylines(image, [np.array(face_landmarks['right_eyebrow'])], isClosed=False, color=(0, 255, 0), thickness=2)
        
        # 鼻
        cv2.polylines(image, [np.array(face_landmarks['nose_bridge'])], isClosed=False, color=(0, 255, 0), thickness=2)
        cv2.polylines(image, [np.array(face_landmarks['nose_tip'])], isClosed=False, color=(0, 255, 0), thickness=2)
        
        # 目
        cv2.polylines(image, [np.array(face_landmarks['left_eye'])], isClosed=True, color=(0, 255, 0), thickness=2)
        cv2.polylines(image, [np.array(face_landmarks['right_eye'])], isClosed=True, color=(0, 255, 0), thickness=2)
        
        # 口
        cv2.polylines(image, [np.array(face_landmarks['top_lip'])], isClosed=True, color=(0, 255, 0), thickness=2)
        cv2.polylines(image, [np.array(face_landmarks['bottom_lip'])], isClosed=True, color=(0, 255, 0), thickness=2)
    
    # 新しいファイルとして保存
    save_path = os.path.join(os.path.dirname(image_path), f"3d_mask_{os.path.basename(image_path)}")
    cv2.imwrite(save_path, image)
    print(f"3Dマスク画像が保存されました: {save_path}")

select_image()

解説

  • モジュール名

「cv2」:OpenCVを使用して画像の読み込み、処理、保存を行うために使用。画像にランドマークを描画する際にも利用される。
「face_recognition」:顔のランドマーク(顎、眉毛、目、鼻、口など)を検出するために使用。
「numpy」:顔のランドマークの座標を配列に変換し、cv2.polylinesで使用するために利用。
「tkinter.filedialog」:ファイル選択ダイアログを使用して、画像ファイルを選択するために使用。
「os」:ファイルのパスを操作し、新しいファイルの保存先や名前を設定するために使用。

「cv2」と「face_recognition」、「numpy」はpipでインストールする必要があります。

pip install opencv-python  
pip install face_recognition  
pip install numpy  
  • フィールド(メンバ変数)

「image_path」:ユーザーが選択した画像のファイルパスを保存する変数。
select_image()関数で取得され、apply_3d_mask()関数で使用される。

  • select_image関数

ユーザーがファイル選択ダイアログを使用して画像ファイルを選択する

filedialog.askopenfilename()を用いて画像ファイルパスを取得し、
選択された画像が存在する場合にapply_3d_mask()関数を呼び出す。

  • apply_3d_mask関数

画像を読み込みface_recognition.face_landmarks()を使用して、
顔のランドマーク(顎、眉毛、鼻、目、口)を検出する。

各ランドマークに基づいて、
cv2.polylines()で緑色の線を描画する(例:顎の輪郭や眉毛に沿った線)。

最後に、新しい画像として処理された画像を元のディレクトリに保存し、
保存先をコンソールに表示する。

実演

本スクリプトは、まずユーザーがファイル選択ダイアログを通じて画像を選び、
OpenCVを使用して画像を読み込みます。

その後、face_recognitionライブラリを使って顔のランドマーク(目、鼻、口など)を検出し、
各ランドマークに沿って線を描画します。

最終的に新しい画像として保存します。
ランドマーク検出は、リアルタイム顔認識や表情分析など、さまざまな応用に使われます。

まとめ

本記事では、CMakeを使ったPythonの顔認証システム構築の基礎から実践までを紹介しました。

CMakeを使ってプロジェクトを効率的に管理し、OpenCVやface_recognitionを活用することで、
実用的な顔認証システムを短期間で開発する方法が理解できたでしょう。

PythonとCMakeの組み合わせは、今後ますます重要なスキルとなるでしょう。

タイトルとURLをコピーしました