Pythonの顔認識パッケージであるInsightFaceのインストールとInsightFaceを使用したプログラムを作成していきます。
InsightFaceのGitHubはこちら
↑登録はもちろん無料です。私は転職で年収72万UPしました。
環境
- MacOS
- Python 3.9.7
Pythonのバージョンを合わせたい方はこちらを参考に
事前インストールパッケージ
InsightFaceインストール前に依存関係にある以下のパッケージをインストールします。
command $ pip install numpy
command $ pip install cython
command $ pip install onnxruntime
※Cythonは必ずInsightFaceよりも先にインストールしておく必要があります。
用語解説
※ここは読み飛ばしてもOKです。
【Cython】
InsightFaceは、人工知能のモデルを使った顔認識、顔特徴抽出などの機能を提供するライブラリです。このライブラリは、C++とPythonの両方のAPIを提供していますが、Python APIにはCythonを使用することで高速化することができます。
Cythonは、PythonとC++を混合させた高速なプログラミング言語です。Cythonによって生成されたコードは、Pythonよりも高速に実行されます。InsightFaceは、顔認識タスクにおいて高速な処理が求められるため、Cythonを使用することでより高速な動作が実現されます。
結論として、insightfaceのpython APIでCythonを使用することにより、より高速な顔認識処理を実現することができます。
【ONNXRuntime】
ONNXRuntimeは、Open Neural Network Exchange (ONNX)形式で定義された人工知能モデルを高速かつ効率的に実行するためのランタイムです。ONNXは、複数のフレームワーク間での人工知能モデルの互換性を保証するためのフォーマットです。
InsightFaceを使って顔認識を行う際に、ONNXRuntimeを使う理由は、以下のようなものがあります。
高速かつ効率的な実行:ONNXRuntimeは、人工知能モデルを高速かつ効率的に実行することができます。これにより、InsightFaceを使って顔認識を行う際にも高速な処理が行えます。
互換性の保証:ONNXは複数のフレームワーク間での人工知能モデルの互換性を保証するためのフォーマットです。これにより、InsightFaceが使用する人工知能モデルを他のフレームワークなどでも利用することができます。
簡単な実装:ONNXRuntimeは簡単なAPIを提供するため、人工知能モデルを実行するためのコードを書くことが簡単になります。これにより、InsightFaceを使って顔認識を行う際にも簡単な実装ができます。
【モデル】
InsightFaceには様々な顔認識のモデルが用意されており、それらのモデルは以下の役割を持っています。
顔検出: 画像中から顔を検出して領域を抽出する役割を担います。
顔特徴量抽出: 顔領域を入力として、顔の特徴量を抽出する役割を担います。
顔認識: 顔特徴量から、その顔がどの人物かを認識する役割を担います。
InsightFaceは、深層学習に基づいたモデルを提供しており、大量のデータを学習することで高い精度を実現しています。また、InsightFaceは複数のフレームワークからの使用をサポートしており、統一されたAPIを提供することで使いやすいライブラリとなっています。
InsightFaceインストール
pipとsetuptoolsを最新化
command $ python -m pip install --upgrade pip setuptools
InsightFaceのインストール
command $ pip install insightface
InsightFaceがインストールされましたので、顔認識のプログラムを作成していきます。
顔認識プログラムの作成
今回使用する画像データ(meeting_image.jpg)

上記の画像で認識した顔を長方形で囲むプログラムを作成していきます。
import os
import cv2
import numpy as np
import insightface
# 画像パスの取得
img_path = os.path.abspath("meeting_image.jpg")
# 画像の読み込み
img =cv2.imread(img_path)
# 読み込んだ画像の確認
print(type(img))
print(img.shape)
print(img.dtype)
# オブジェクトの生成
app = insightface.app.FaceAnalysis()
# app.prepare(ctx_id=0) は、GPU を使用するか CPU を使用するかの指定です。
# GPU を使用する場合は ctx_id=0、CPU を使用する場合は ctx_id=-1 を指定します。
app.prepare(ctx_id=0)
# 顔の検出
faces = app.get(img)
# 顔を四角形で囲む
for face in faces:
x1, y1, x2, y2 = face.bbox.astype(np.int32)
x1 = max(0, x1)
y1 = max(0, y1)
x2 = min(img.shape[1] - 1, x2)
y2 = min(img.shape[0] - 1, y2)
cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 7)
# 検出結果を保存
cv2.imwrite("output.jpg", img)
顔検出で取得した変数facesの確認

bbox(bounding box)は、画像から物体を検出する際に使われます。InsightFaceでは顔認識を行う際に、顔の位置を示すbboxを取得することができます。bboxは画像の左上と右下の座標から構成されており、そこに囲まれた範囲が物体です。
len(faces)で認識された顔の数を取得することができます。
プログラムの実行
作成したプログラムを実行します。
command $ python image_recognition.py
処理完了後に同ディレクトリに【output.jpg】が作成されます。
以下のように青枠で囲まれた顔認識がされています。

今回は以上です。
コメント