顔にランドマーク(3Dマスク)を付ける。
※画像の人物は、こちらからお借りしました。
Pythonで顔認識システムを作りたいと考えているけど、
どこから始めればいいか迷っている方も多いのではないでしょうか。
本記事では、CMakeとPythonを組み合わせて顔認証システムをゼロから作成する手順を解説します。
Pythonの強力なライブラリとCMakeのビルド自動化の力を駆使して、
実用的で高性能な顔認証システムを構築します。
- 顔認識システムをPythonで作成したい方
- CMakeの基本を学び、プロジェクトに活用したい方
- OpenCVやface_recognitionライブラリを使った応用技術を学びたい方
- 画像処理や機械学習に興味がある初級~中級者
- 高度な顔認識アルゴリズムを効率的に導入したい方
ConoHaWing開設方法|アリッシア
技術ブログを書くべき理由|アリッシア
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()
ブログを運営するメリット
プログラマーがブログを運営するメリットは沢山あります。
エンジニアはブログを運営するべき理由|アリッシア
- アウトプットによるスキル向上
- メモ帳代わり
- ポートフォリオ(案件獲得)
ブログを始めるためには、「テーマ」・「ドメイン」・「サーバー」の3つが必要です。
3つはブログ運営の基盤となる要素ですが、これら全て自分で用意しなければいけません。
面倒で難しくブログ開設を断念してしまう人が多いです。
ConoHa Wingの「WordPressかんたんセットアップ」は
最短10分で契約可能!
ConoHa WINGから契約をすれば、独自ドメイン、サーバーの用意、WordPressとの連携も簡単にできます。
さらに、2つの独自ドメインが永久無料の特典もあり、
月660円からの破格価格にもかかわらず、表示速度は国内最速です。
解説
- モジュール名
「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の組み合わせは、今後ますます重要なスキルとなるでしょう。