前回まではカスケード分類機によって顔の検出を行っていましたが精度があまり良くなかったと思います。今回はオープンソースのinsightfaceを使って顔の検出を行ってみます。検証はMac(M1)とWindowsで行いました。
実行結果
緑の文字は F:女性、M:男性 , 年齢となります。
OS:Windows11、macOS Ventura 13.1
仮想環境:miniconda
Python 3.10.9
事前準備
画像は「写真AC」を利用しました。
WindowsとMacではパッケージのインストールが若干違いましたので記載しておきます。また仮想環境は新たに作りました。仮想環境名は何でも良いです。
conda activateで新しい仮想環境に変更して下さい。
#共通
conda create -n 仮想環境名 python=3.10.9
Windows
仮想環境を作る前に「Microsoft C++ Build Tools」をインストールして下さい。insightfaceをダウンロードした際にビルドエラーになってしまいます。
下記サイトから「vs_BuildTools.exe」をダウンロードしてインストーラを起動して下さい。「C++ によるデスクトップ開発」をチェックしてインストールを行って下さい。結構時間がかかります。
Pythonパッケージ
conda install で numpy、cython、onnxruntime をインストールします。
conda install numpy cython onnxruntime
pip install で opencv-python、insightface をインストールします。
python -m pip install opencv-python insightface
最終的に下記のようなパッケージ構成になりました。
# packages in environment at C:\Users\○○○○○\miniconda3\envs\opencv:
#
# Name Version Build Channel
albumentations 1.3.0 pypi_0 pypi
blas 1.0 mkl
bzip2 1.0.8 he774522_0
ca-certificates 2023.01.10 haa95532_0
certifi 2022.12.7 py310haa95532_0
charset-normalizer 3.0.1 pypi_0 pypi
colorama 0.4.6 py310haa95532_0
coloredlogs 15.0.1 py310haa95532_1
contourpy 1.0.7 pypi_0 pypi
cycler 0.11.0 pypi_0 pypi
cython 0.29.32 py310hd77b12b_0
easydict 1.10 pypi_0 pypi
eigen 3.3.7 h59b6b97_1
fonttools 4.38.0 pypi_0 pypi
glib 2.69.1 h5dc1a3c_2
gst-plugins-base 1.18.5 h9e645db_0
gstreamer 1.18.5 hd78058f_0
hdf5 1.12.1 h1756f20_2
humanfriendly 10.0 py310haa95532_1
icc_rt 2022.1.0 h6049295_2
icu 58.2 ha925a31_3
idna 3.4 pypi_0 pypi
imageio 2.25.0 pypi_0 pypi
insightface 0.7.2 pypi_0 pypi
intel-openmp 2021.4.0 haa95532_3556
joblib 1.2.0 pypi_0 pypi
jpeg 9e h2bbff1b_0
kiwisolver 1.4.4 pypi_0 pypi
lerc 3.0 hd77b12b_0
libclang 12.0.0 default_h627e005_2
libcurl 7.87.0 h86230a5_0
libdeflate 1.8 h2bbff1b_5
libffi 3.4.2 hd77b12b_6
libiconv 1.16 h2bbff1b_2
libogg 1.3.5 h2bbff1b_1
libpng 1.6.37 h2a8f88b_0
libprotobuf 3.20.1 h23ce68f_0
libssh2 1.10.0 hcd4344a_0
libtiff 4.5.0 h8a3f274_0
libvorbis 1.3.7 he774522_0
libwebp 1.2.4 h2bbff1b_0
libwebp-base 1.2.4 h2bbff1b_0
libxml2 2.9.14 h0ad7f3c_0
libxslt 1.1.35 h2bbff1b_0
lz4-c 1.9.4 h2bbff1b_0
matplotlib 3.6.3 pypi_0 pypi
mkl 2021.4.0 haa95532_640
mkl-service 2.4.0 py310h2bbff1b_0
mkl_fft 1.3.1 py310ha0764ea_0
mkl_random 1.2.2 py310h4ed8f06_0
mpmath 1.2.1 py310haa95532_0
networkx 3.0 pypi_0 pypi
numpy 1.23.5 py310h60c9a35_0
numpy-base 1.23.5 py310h04254f7_0
onnx 1.13.0 pypi_0 pypi
onnxruntime 1.12.1 py310hc0725f4_0
opencv-python 4.7.0.68 pypi_0 pypi
opencv-python-headless 4.7.0.68 pypi_0 pypi
openssl 1.1.1s h2bbff1b_0
packaging 22.0 py310haa95532_0
pcre 8.45 hd77b12b_0
pillow 9.4.0 pypi_0 pypi
pip 22.3.1 py310haa95532_0
prettytable 3.6.0 pypi_0 pypi
protobuf 3.20.3 pypi_0 pypi
pyparsing 3.0.9 pypi_0 pypi
pyreadline3 3.4.1 py310haa95532_0
python 3.10.9 h966fe2a_0
python-dateutil 2.8.2 pypi_0 pypi
python-flatbuffers 2.0 pyhd3eb1b0_0
pywavelets 1.4.1 pypi_0 pypi
pyyaml 6.0 pypi_0 pypi
qt-main 5.15.2 he8e5bd7_7
qt-webengine 5.15.9 hb9a9bb5_5
qtwebkit 5.212 h3ad3cdb_4
qudida 0.0.4 pypi_0 pypi
re2 2022.04.01 hd77b12b_0
requests 2.28.2 pypi_0 pypi
scikit-image 0.19.3 pypi_0 pypi
scikit-learn 1.2.1 pypi_0 pypi
scipy 1.10.0 pypi_0 pypi
setuptools 65.6.3 py310haa95532_0
six 1.16.0 pyhd3eb1b0_1
sqlite 3.40.1 h2bbff1b_0
sympy 1.11.1 py310haa95532_0
threadpoolctl 3.1.0 pypi_0 pypi
tifffile 2023.1.23.1 pypi_0 pypi
tk 8.6.12 h2bbff1b_0
tqdm 4.64.1 pypi_0 pypi
typing-extensions 4.4.0 pypi_0 pypi
tzdata 2022g h04d1e81_0
urllib3 1.26.14 pypi_0 pypi
vc 14.2 h21ff451_1
vs2015_runtime 14.27.29016 h5e58377_2
wcwidth 0.2.6 pypi_0 pypi
wheel 0.37.1 pyhd3eb1b0_0
wincertstore 0.2 py310haa95532_2
xz 5.2.10 h8cc25b3_1
zlib 1.2.13 h8cc25b3_0
zstd 1.5.2 h19a0ad4_0
macOS
Macの場合は特に何かをインストールする必要はありませんでした。
Pythonパッケージ
conda install で opencv、numpy、cython、onnxruntime をインストールします。
conda install opencv numpy cython onnxruntime
pipで insightface をインストールします。
python -m pip install insightface
# packages in environment at /opt/miniconda3/envs/opencv:
#
# Name Version Build Channel
albumentations 1.3.0 pypi_0 pypi
aom 3.5.0 h7ea286d_0 conda-forge
blas 2.116 openblas conda-forge
blas-devel 3.9.0 16_osxarm64_openblas conda-forge
bzip2 1.0.8 h620ffc9_4
c-ares 1.18.1 h1a28f6b_0
ca-certificates 2023.01.10 hca03da5_0
cairo 1.16.0 h73a0509_1014 conda-forge
certifi 2022.12.7 py310hca03da5_0
charset-normalizer 3.0.1 pypi_0 pypi
coloredlogs 15.0.1 py310hca03da5_1
contourpy 1.0.7 pypi_0 pypi
cycler 0.11.0 pypi_0 pypi
cython 0.29.32 py310hc377ac9_0
easydict 1.10 pypi_0 pypi
expat 2.4.9 hc377ac9_0
ffmpeg 5.1.2 lgpl_h75e0260_2 conda-forge
font-ttf-dejavu-sans-mono 2.37 hd3eb1b0_0
font-ttf-inconsolata 2.001 hcb22688_0
font-ttf-source-code-pro 2.030 hd3eb1b0_0
font-ttf-ubuntu 0.83 h8b1ccd4_0
fontconfig 2.14.1 h6b8db82_1
fonts-anaconda 1 h8fa9717_0
fonts-conda-ecosystem 1 hd3eb1b0_0
fonttools 4.38.0 pypi_0 pypi
freetype 2.12.1 h1192e45_0
gettext 0.21.1 h0186832_0 conda-forge
gmp 6.2.1 hc377ac9_3
gmpy2 2.1.2 py310h8c48613_0
gnutls 3.7.8 h9f1a10d_0 conda-forge
graphite2 1.3.14 hc377ac9_1
harfbuzz 6.0.0 hddbc195_0 conda-forge
hdf5 1.12.2 nompi_h55deafc_101 conda-forge
humanfriendly 10.0 py310hca03da5_1
icu 70.1 h6b3803e_0 conda-forge
idna 3.4 pypi_0 pypi
imageio 2.25.0 pypi_0 pypi
insightface 0.7.2 pypi_0 pypi
jasper 2.0.33 hba35424_0 conda-forge
joblib 1.2.0 pypi_0 pypi
jpeg 9e h1a28f6b_0
kiwisolver 1.4.4 pypi_0 pypi
krb5 1.19.4 h8380606_0
lame 3.100 h1a28f6b_0
lerc 3.0 hc377ac9_0
libaec 1.0.6 hb7217d7_1 conda-forge
libblas 3.9.0 16_osxarm64_openblas conda-forge
libcblas 3.9.0 16_osxarm64_openblas conda-forge
libcurl 7.87.0 h0f1d93c_0
libcxx 14.0.6 h848a8c0_0
libdeflate 1.8 h1a28f6b_5
libedit 3.1.20221030 h80987f9_0
libev 4.33 h1a28f6b_1
libffi 3.4.2 hca03da5_6
libgfortran 5.0.0 11_3_0_hca03da5_28
libgfortran5 11.3.0 h009349e_28
libglib 2.74.1 h14ed1c1_0 conda-forge
libiconv 1.17 he4db4b2_0 conda-forge
libidn2 2.3.1 h1a28f6b_0
liblapack 3.9.0 16_osxarm64_openblas conda-forge
liblapacke 3.9.0 16_osxarm64_openblas conda-forge
libnghttp2 1.46.0 h95c9599_0
libopenblas 0.3.21 openmp_hc731615_3 conda-forge
libopencv 4.7.0 py310h57d381e_0 conda-forge
libpng 1.6.39 h76d750c_0 conda-forge
libprotobuf 3.21.12 hb5ab8b9_0 conda-forge
libsqlite 3.40.0 h76d750c_0 conda-forge
libssh2 1.10.0 hf27765b_0
libtasn1 4.19.0 h1a8c8d9_0 conda-forge
libtiff 4.5.0 h2fd578a_0
libunistring 0.9.10 h1a28f6b_0
libvpx 1.11.0 hc377ac9_0
libwebp-base 1.2.4 h1a28f6b_0
libxml2 2.9.14 h9d8dfc2_4 conda-forge
libzlib 1.2.13 h03a7124_4 conda-forge
llvm-openmp 14.0.6 hc6e5704_0
lz4-c 1.9.4 h313beb8_0
matplotlib 3.6.3 pypi_0 pypi
mpc 1.1.0 h8c48613_1
mpfr 4.0.2 h695f6f0_1
mpmath 1.2.1 pypi_0 pypi
ncurses 6.4 h313beb8_0
nettle 3.8.1 h63371fa_1 conda-forge
networkx 3.0 pypi_0 pypi
numpy 1.23.5 py310hb93e574_0
numpy-base 1.23.5 py310haf87e8b_0
onnx 1.13.0 pypi_0 pypi
onnxruntime 1.13.1 py310h46e22f8_1 conda-forge
openblas 0.3.21 openmp_hf78f355_3 conda-forge
opencv 4.7.0 py310hb6292c7_0 conda-forge
opencv-python-headless 4.7.0.68 pypi_0 pypi
openh264 2.3.1 hb7217d7_1 conda-forge
openssl 1.1.1s h1a28f6b_0
p11-kit 0.24.1 h29577a5_0 conda-forge
packaging 22.0 py310hca03da5_0
pcre2 10.37 h37e8eca_1
pillow 9.4.0 pypi_0 pypi
pip 22.3.1 py310hca03da5_0
pixman 0.40.0 h1a28f6b_0
prettytable 3.6.0 pypi_0 pypi
protobuf 3.20.3 pypi_0 pypi
py-opencv 4.7.0 py310h69fb684_0 conda-forge
pyparsing 3.0.9 pypi_0 pypi
python 3.10.8 hf452327_0_cpython conda-forge
python-dateutil 2.8.2 pypi_0 pypi
python-flatbuffers 2.0 pyhd3eb1b0_0
python_abi 3.10 3_cp310 conda-forge
pywavelets 1.4.1 pypi_0 pypi
pyyaml 6.0 pypi_0 pypi
qudida 0.0.4 pypi_0 pypi
re2 2022.06.01 h9a09cb3_1 conda-forge
readline 8.2 h1a28f6b_0
requests 2.28.2 pypi_0 pypi
scikit-image 0.19.3 pypi_0 pypi
scikit-learn 1.2.1 pypi_0 pypi
scipy 1.10.0 pypi_0 pypi
setuptools 65.6.3 py310hca03da5_0
six 1.16.0 pypi_0 pypi
svt-av1 1.3.0 h7ea286d_0 conda-forge
sympy 1.11.1 py310hca03da5_0
threadpoolctl 3.1.0 pypi_0 pypi
tifffile 2023.1.23.1 pypi_0 pypi
tk 8.6.12 hb8d0fd4_0
tqdm 4.64.1 pypi_0 pypi
typing-extensions 4.4.0 pypi_0 pypi
tzdata 2022g h04d1e81_0
urllib3 1.26.14 pypi_0 pypi
wcwidth 0.2.6 pypi_0 pypi
wheel 0.37.1 pyhd3eb1b0_0
xz 5.2.10 h80987f9_1
zlib 1.2.13 h03a7124_4 conda-forge
zstd 1.5.2 h8574219_0
プログラミング
プログラムファイルは任意の名称をつけて下さい。
実行は「python ○○○○○.py」です。
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
# FaceAnalysisクラスのインスタンス化
app = FaceAnalysis()
app.prepare(ctx_id=0, det_size=(640, 640))
# カメラ定義 windowsの場合:CAP_MSMF Macの場合:CAP_AVFOUNDATION
capture = cv2.VideoCapture(0, cv2.CAP_MSMF)
while(True):
# ビデオキャプチャ
ret, flame = capture.read()
if (ret == False):
break
# 顔の判定
faces = app.get(flame)
# 検出した顔を囲む矩形の作成
detect = app.draw_on(flame, faces)
# 画面表示
cv2.imshow("flame", detect)
# qが押されたら終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
まとめ
プログラム自体はそれほど難しくはないのですが動くまでに結構エラーが出ました。またWindowsとMacでopencvのバージョンの差でエラーが出て時間を費やしてしまいました。
opencv、numpy、cython、onnxruntime、insightfaceがあれば動きます。
処理は結構重いです。実行結果の動画もカクカクしています。そのぶん精度はかなり高いです。
ぜひ試してください。
コメント