「RetinaFaceによる顔認識をPythonで試したい」
「ディープラーニングによる顔認識を実行したい」
「InsightFaceのインストールに失敗する」
このような場合には、RetinaFace(retina-face)がおススメです。
この記事では、RetinaFace(retina-face)について解説しています。
本記事の内容
- RetinaFace(retina-face)とは?
- RetinaFace(retina-face)のシステム要件
- RetinaFace(retina-face)のインストール
- RetinaFace(retina-face)の動作確認
それでは、上記に沿って解説していきます。
RetinaFace(retina-face)とは?
RetinaFace(retina-face)は、深層学習をベースにしたPython用の最先端の顔検出器です。
つまり、ディープラーニングによる顔認識ライブラリということです。
まずは、その精度をご覧ください。
RetinaFace(retina-face)を用いて、認識できた顔の数は210個になります。
実は、これよりもさらに多く顔を認識できる方法があります。
InsightFaceを用いれば、1個だけ多い211個の顔を認識可能です。
結果の画像は、以下。
結果を見れば、RetinaFace(retina-face)よりもInsightFaceの方を利用したくなります。
ただ、RetinaFaceはInsightFaceの一部でもあるのです。
このややこしい部分を説明します。
InsightFaceには、顔認識のための技術・理論が3つ用意されています。
- RetinaFace (CVPR’2020)
- SCRFD (Arxiv’2021)
- blazeface_paddle
RetinaFaceとは、顔認識のための理論の名前にあたります。
だから、InsightFaceにおいてもRetinaFaceを用いて顔認識を行うことが可能です。
ただ、現状ではSCRFDがInsightFaceのデフォルト扱いです。
実際、InsightFaceで用意してくれているモデルにはSCRFDしか存在していません。
「buffalo_l」が、標準のモデルパッケージとなります。
そのため、RetinaFaceの利用は難しい状況と言えます。
ここで、整理しておきます。
RetinaFace(retina-face)は、RetinaFaceの理論に基づいた顔認識に特化したPythonライブラリです。
そして、RetinaFace(retina-face)はインストールが簡単です。
Tensorflowさえ動く環境があれば、簡単にインストールできます。
それに対して、InsightFaceは決して簡単とは言えません。
どちらかと言うと、インストールが難しい部類です。
それでも、わかりやすいように記事で解説をしていますけどね。
だから、InsightFaceがインストールできたらそれでOKです。
でも、その場合はSCRFDで十分に事足ります。
むしろ、RetinaFace以上の結果も出ています。
しかし、InsightFaceをインストールできないことがあるでしょう。
そのような場合、RetinaFace(retina-face)の利用がおススメとなります。
以上、RetinaFace(retina-face)について説明しました。
次は、RetinaFace(retina-face)のシステム要件を確認します。
RetinaFace(retina-face)のシステム要件
現時点(2021年10月末)でのRetinaFace(retina-face)の最新バージョンは、0.0.5となります。
この最新バージョンは、2021年8月2日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
また、サポート対象となるPythonのバージョンはPythom 3.5.5以降となります。
あとは、TensorFlowのバージョンが要注意です。
TensorFlow 1.9.0以降が、必要となります。
TensorFlow 2でも問題ありません。
なお、RetinaFace(retina-face)のインストールの際に、TensorFlowも自動的にインストールされます。
つまり、事前にTensorFlowをインストールする必要はないということです。
以上、RetinaFace(retina-face)のシステム要件を説明しました。
次は、RetinaFace(retina-face)をインストールします。
RetinaFace(retina-face)のインストール
検証は、次のバージョンのPythonで行います。
>python -V Python 3.9.7
まずは、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 21.3.1 setuptools 58.3.0
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、RetinaFace(retina-face)のインストールです。
RetinaFace(retina-face)のインストールは、以下のコマンドとなります。
pip install retina-face
インストールは、しばらく時間がかかります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ----------------------- --------- absl-py 0.15.0 astunparse 1.6.3 beautifulsoup4 4.10.0 cachetools 4.2.4 certifi 2021.10.8 charset-normalizer 2.0.7 clang 5.0 colorama 0.4.4 filelock 3.3.1 flatbuffers 1.12 gast 0.4.0 gdown 4.2.0 google-auth 2.3.2 google-auth-oauthlib 0.4.6 google-pasta 0.2.0 grpcio 1.41.1 h5py 3.1.0 idna 3.3 keras 2.6.0 Keras-Preprocessing 1.1.2 Markdown 3.3.4 numpy 1.19.5 oauthlib 3.1.1 opencv-python 4.5.4.58 opt-einsum 3.3.0 Pillow 8.4.0 pip 21.3.1 protobuf 3.19.0 pyasn1 0.4.8 pyasn1-modules 0.2.8 PySocks 1.7.1 requests 2.26.0 requests-oauthlib 1.3.0 retina-face 0.0.5 rsa 4.7.2 setuptools 58.3.0 six 1.15.0 soupsieve 2.2.1 tensorboard 2.7.0 tensorboard-data-server 0.6.1 tensorboard-plugin-wit 1.8.0 tensorflow 2.6.0 tensorflow-estimator 2.6.0 termcolor 1.1.0 tqdm 4.62.3 typing-extensions 3.7.4.3 urllib3 1.26.7 Werkzeug 2.0.2 wheel 0.37.0 wrapt 1.12.1
依存するパッケージは、かなり多いです。
そのため、Python仮想環境の利用が必須でしょう。
Windowsなら、IDEにPyCharmを使えば簡単に仮想環境を利用できます。
プロジェクト(今回ならTikTokApi専用)毎に仮想環境となります。
また、次の記事のようにコマンドでも簡単に仮想環境を利用できます。
GUIのない Linuxサーバーなら、こちらが一般的となるでしょう。
以上、 RetinaFace(retina-face)のインストールについて説明しました。
最後は、 RetinaFace(retina-face)の動作確認を行います。
RetinaFace(retina-face)の動作確認
まず、顔認識を行いたい画像を用意します。
今回は、次の画像をtest.jpgとして用意しています。
test.jpg
この画像を顔認識するサンプルコードは、以下。
from retinaface import RetinaFace import cv2 img_path = "test.jpg" img = cv2.imread(img_path) resp = RetinaFace.detect_faces(img_path, threshold = 0.5) print("faces:" + str(len(resp))) def int_tuple(t): return tuple(int(x) for x in t) for key in resp: identity = resp[key] #--------------------- landmarks = identity["landmarks"] diameter = 1 cv2.circle(img, int_tuple(landmarks["left_eye"]), diameter, (0, 0, 255), -1) cv2.circle(img, int_tuple(landmarks["right_eye"]), diameter, (0, 0, 255), -1) cv2.circle(img, int_tuple(landmarks["nose"]), diameter, (0, 0, 255), -1) cv2.circle(img, int_tuple(landmarks["mouth_left"]), diameter, (0, 0, 255), -1) cv2.circle(img, int_tuple(landmarks["mouth_right"]), diameter, (0, 0, 255), -1) facial_area = identity["facial_area"] cv2.rectangle(img, (facial_area[2], facial_area[3]), (facial_area[0], facial_area[1]), (255, 255, 255), 1) #facial_img = img[facial_area[1]: facial_area[3], facial_area[0]: facial_area[2]] #plt.imshow(facial_img[:, :, ::-1]) cv2.imwrite('output.'+img_path.split(".")[1], img) #------------------------------ #alignment """ img_path = "dataset/img11.jpg" resp = RetinaFace.extract_faces(img_path = img_path, align = True) for img in resp: plt.imshow(img[:, :, ::-1]) plt.axis('off') plt.show() cv2.imwrite('outputs/'+img_path.split("/")[1], img)
上記を実行すると、スクリプトと同じディレクトリ上にoutput.jpgが作成されます。
output.jpg
コンソールには、以下が表示されます。
faces:30
30人分の顔を認識できたということです。
次の顔が認識できているのは、なかなかスゴイと思います。
以上、RetinaFace(retina-face)の動作確認の説明でした。