Pythonらしいプログラミングを行なってみたいと思います。顔検出!!ということで今回は画像ファイルから顔検出を行なって枠線を描画するプログラムになります。
実行結果
OS:Windows11
IDE:VS Code
言語:Python3.10.9
パッケージ:opencv 4.6.0
仮想環境:Miniconda
下準備
仮想環境の作成
ターミナルが表示されていなければメニューバーの「ターミナル」をクリックして「新しいターミナル」をクリックしてください。またはショートカットキー「Ctrl + Shift + @」
ターミナルを開くと仮想環境(base)の状態になります。
仮想環境ではない場合、先頭に(base)が表示されていない場合は下記のコマンドを入力してください。
activate base
condaコマンドを入力して「face_detection」という名前で仮想環境を構築します。
(base) C:\python_work>conda create -n face_detection
Retrieving notices: ...working... done
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: C:\Users\○○○○○\miniconda3\envs\face_detection
Proceed ([y]/n)? y
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate face_detection
#
# To deactivate an active environment, use
#
# $ conda deactivate
(base) C:\python_work>
仮想環境を切り替えます。
(base) C:\python_work>activate face_detection
(face_detection) C:\python_work>
opencvをインストールします。
(face_detection) C:\python_work>conda install opencv
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: C:\Users\○○○○○\miniconda3\envs\face_detection
added / updated specs:
- opencv
The following packages will be downloaded:
package | build
---------------------------|-----------------
eigen-3.3.7 | h59b6b97_1 831 KB
glib-2.69.1 | h5dc1a3c_2 1.8 MB
gst-plugins-base-1.18.5 | h9e645db_0 1.7 MB
gstreamer-1.18.5 | hd78058f_0 1.7 MB
hdf5-1.12.1 | h1756f20_2 9.5 MB
icc_rt-2022.1.0 | h6049295_2 6.5 MB
icu-58.2 | ha925a31_3 9.4 MB
jpeg-9e | h2bbff1b_0 292 KB
lerc-3.0 | hd77b12b_0 120 KB
libclang-12.0.0 |default_h627e005_2 17.8 MB
libdeflate-1.8 | h2bbff1b_5 46 KB
libiconv-1.16 | h2bbff1b_2 651 KB
libogg-1.3.5 | h2bbff1b_1 33 KB
libpng-1.6.37 | h2a8f88b_0 333 KB
libprotobuf-3.20.1 | h23ce68f_0 2.0 MB
libtiff-4.5.0 | h8a3f274_0 1.2 MB
libvorbis-1.3.7 | he774522_0 202 KB
libwebp-1.2.4 | h2bbff1b_0 67 KB
libwebp-base-1.2.4 | h2bbff1b_0 279 KB
libxml2-2.9.14 | h0ad7f3c_0 1.5 MB
libxslt-1.1.35 | h2bbff1b_0 407 KB
lz4-c-1.9.4 | h2bbff1b_0 143 KB
mkl-service-2.4.0 | py310h2bbff1b_0 48 KB
mkl_fft-1.3.1 | py310ha0764ea_0 136 KB
mkl_random-1.2.2 | py310h4ed8f06_0 221 KB
numpy-1.23.5 | py310h60c9a35_0 11 KB
numpy-base-1.23.5 | py310h04254f7_0 6.0 MB
opencv-4.6.0 | py310ha7641e4_2 24.8 MB
pcre-8.45 | hd77b12b_0 382 KB
python-3.10.9 | h966fe2a_0 15.8 MB
qt-main-5.15.2 | he8e5bd7_7 50.0 MB
qt-webengine-5.15.9 | hb9a9bb5_5 48.9 MB
qtwebkit-5.212 | h3ad3cdb_4 10.3 MB
setuptools-65.6.3 | py310haa95532_0 1.2 MB
xz-5.2.10 | h8cc25b3_1 520 KB
zstd-1.5.2 | h19a0ad4_0 509 KB
------------------------------------------------------------
Total: 214.9 MB
The following NEW packages will be INSTALLED:
blas pkgs/main/win-64::blas-1.0-mkl
bzip2 pkgs/main/win-64::bzip2-1.0.8-he774522_0
ca-certificates pkgs/main/win-64::ca-certificates-2022.10.11-haa95532_0
certifi pkgs/main/win-64::certifi-2022.12.7-py310haa95532_0
eigen pkgs/main/win-64::eigen-3.3.7-h59b6b97_1
glib pkgs/main/win-64::glib-2.69.1-h5dc1a3c_2
gst-plugins-base pkgs/main/win-64::gst-plugins-base-1.18.5-h9e645db_0
gstreamer pkgs/main/win-64::gstreamer-1.18.5-hd78058f_0
hdf5 pkgs/main/win-64::hdf5-1.12.1-h1756f20_2
icc_rt pkgs/main/win-64::icc_rt-2022.1.0-h6049295_2
icu pkgs/main/win-64::icu-58.2-ha925a31_3
intel-openmp pkgs/main/win-64::intel-openmp-2021.4.0-haa95532_3556
jpeg pkgs/main/win-64::jpeg-9e-h2bbff1b_0
lerc pkgs/main/win-64::lerc-3.0-hd77b12b_0
libclang pkgs/main/win-64::libclang-12.0.0-default_h627e005_2
libdeflate pkgs/main/win-64::libdeflate-1.8-h2bbff1b_5
libffi pkgs/main/win-64::libffi-3.4.2-hd77b12b_6
libiconv pkgs/main/win-64::libiconv-1.16-h2bbff1b_2
libogg pkgs/main/win-64::libogg-1.3.5-h2bbff1b_1
libpng pkgs/main/win-64::libpng-1.6.37-h2a8f88b_0
libprotobuf pkgs/main/win-64::libprotobuf-3.20.1-h23ce68f_0
libtiff pkgs/main/win-64::libtiff-4.5.0-h8a3f274_0
libvorbis pkgs/main/win-64::libvorbis-1.3.7-he774522_0
libwebp pkgs/main/win-64::libwebp-1.2.4-h2bbff1b_0
libwebp-base pkgs/main/win-64::libwebp-base-1.2.4-h2bbff1b_0
libxml2 pkgs/main/win-64::libxml2-2.9.14-h0ad7f3c_0
libxslt pkgs/main/win-64::libxslt-1.1.35-h2bbff1b_0
lz4-c pkgs/main/win-64::lz4-c-1.9.4-h2bbff1b_0
mkl pkgs/main/win-64::mkl-2021.4.0-haa95532_640
mkl-service pkgs/main/win-64::mkl-service-2.4.0-py310h2bbff1b_0
mkl_fft pkgs/main/win-64::mkl_fft-1.3.1-py310ha0764ea_0
mkl_random pkgs/main/win-64::mkl_random-1.2.2-py310h4ed8f06_0
numpy pkgs/main/win-64::numpy-1.23.5-py310h60c9a35_0
numpy-base pkgs/main/win-64::numpy-base-1.23.5-py310h04254f7_0
opencv pkgs/main/win-64::opencv-4.6.0-py310ha7641e4_2
openssl pkgs/main/win-64::openssl-1.1.1s-h2bbff1b_0
pcre pkgs/main/win-64::pcre-8.45-hd77b12b_0
pip pkgs/main/win-64::pip-22.3.1-py310haa95532_0
python pkgs/main/win-64::python-3.10.9-h966fe2a_0
qt-main pkgs/main/win-64::qt-main-5.15.2-he8e5bd7_7
qt-webengine pkgs/main/win-64::qt-webengine-5.15.9-hb9a9bb5_5
qtwebkit pkgs/main/win-64::qtwebkit-5.212-h3ad3cdb_4
setuptools pkgs/main/win-64::setuptools-65.6.3-py310haa95532_0
six pkgs/main/noarch::six-1.16.0-pyhd3eb1b0_1
sqlite pkgs/main/win-64::sqlite-3.40.1-h2bbff1b_0
tk pkgs/main/win-64::tk-8.6.12-h2bbff1b_0
tzdata pkgs/main/noarch::tzdata-2022g-h04d1e81_0
vc pkgs/main/win-64::vc-14.2-h21ff451_1
vs2015_runtime pkgs/main/win-64::vs2015_runtime-14.27.29016-h5e58377_2
wheel pkgs/main/noarch::wheel-0.37.1-pyhd3eb1b0_0
wincertstore pkgs/main/win-64::wincertstore-0.2-py310haa95532_2
xz pkgs/main/win-64::xz-5.2.10-h8cc25b3_1
zlib pkgs/main/win-64::zlib-1.2.13-h8cc25b3_0
zstd pkgs/main/win-64::zstd-1.5.2-h19a0ad4_0
Proceed ([y]/n)? y
done
(face_detection) C:\python_work>
condaコマンドでインストールされていることを確認します。
(face_detection) C:\python_work>conda list
# packages in environment at C:\Users\○○○○○\miniconda3\envs\face_detection:
#
# Name Version Build Channel
blas 1.0 mkl
bzip2 1.0.8 he774522_0
ca-certificates 2022.10.11 haa95532_0
certifi 2022.12.7 py310haa95532_0
eigen 3.3.7 h59b6b97_1
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
icc_rt 2022.1.0 h6049295_2
icu 58.2 ha925a31_3
intel-openmp 2021.4.0 haa95532_3556
jpeg 9e h2bbff1b_0
lerc 3.0 hd77b12b_0
libclang 12.0.0 default_h627e005_2
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
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
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
numpy 1.23.5 py310h60c9a35_0
numpy-base 1.23.5 py310h04254f7_0
opencv 4.6.0 py310ha7641e4_2
openssl 1.1.1s h2bbff1b_0
pcre 8.45 hd77b12b_0
pip 22.3.1 py310haa95532_0
python 3.10.9 h966fe2a_0
qt-main 5.15.2 he8e5bd7_7
qt-webengine 5.15.9 hb9a9bb5_5
qtwebkit 5.212 h3ad3cdb_4
setuptools 65.6.3 py310haa95532_0
six 1.16.0 pyhd3eb1b0_1
sqlite 3.40.1 h2bbff1b_0
tk 8.6.12 h2bbff1b_0
tzdata 2022g h04d1e81_0
vc 14.2 h21ff451_1
vs2015_runtime 14.27.29016 h5e58377_2
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
(face_detection) C:\python_work>
顔検出用ファイルのダウンロード
GitHubから顔検出に使うファイルをダウンロードします。本来はxmlファイルを1つダウンロードすれば良いのですが一式ダウンロードします。下記にアクセスしてください。
①「Code」をクリックしてください。
②「Download ZIP」をクリックしてください。
opencv-master.zipがダウンロードされます。このファイルを右クリックします。
「すべて展開」をクリックします。
「ファイルを下のフォルダーに展開する」をPythonの作業フォルダ内にします。
C:¥python_work
設定したら「展開」をクリックします。
VS Codeのエクスプローラーに表示されていることを確認します。
画像ファイルの準備
python_workに「input」、「output」フォルダを追加してください。
inputフォルダに画像ファイルを入れます。ファイル名を「face
画像は「写真AC」からダウンロードしました。顔が写っていれば何でもいいです。
プログラミング
「face_detection.py」という名前でファイルを新規追加します。
インタープリターがbase環境になっているので右下の「Python 3.10.8(’base’:conda)」をクリックます。
「Python 3.10.9(’face_detection’)」をクリックします。※バージョンは変わりますので仮想環境名(face_detection)を選択してください。
ステータスバーが「Python 3.10.9(’face_detection’:conda)」に変更されていることを確認します。
やっとプログラミングです。face_detection.pyに記述します。
import cv2
# 分類器
cascade_path = "opencv-master/data/haarcascades/haarcascade_frontalface_default.xml"
# 画像ファイル
image_input = "input/face.jpg"
# 出力ファイル
image_output = "output/face.jpg"
# ファイル読み込み
image = cv2.imread(image_input)
# グレースケール変換
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 特徴量読み込み
cascade = cv2.CascadeClassifier(cascade_path)
# 顔検出
face_detect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
# 検出した場合
if len(face_detect) > 0:
# 検出した顔を囲む矩形の作成
for x, y, w, h in face_detect:
cv2.rectangle(image, (x, y), (x + w, y + h), (127, 255, 0), 2)
# 認識結果の保存
cv2.imwrite(image_output, image)
import
opencvをプログラム内で使えるようにインポートします。
import cv2
ファイル設定
cascade_path:顔検出用のファイルを設定します。「haarcascade_frontalface_default.xml」は正面の顔を検出するためのxmlファイルです。
image_input:顔検証させるための画像ファイルを設定します。
image_output:顔検出後に顔に枠線を描画した画像ファイルを設定します。
# 分類器
cascade_path = "opencv-master/data/haarcascades/haarcascade_frontalface_default.xml"
# 画像ファイル
image_input = "input/face.jpg"
# 出力ファイル
image_output = "output/face.jpg"
opencvの関数を使って顔検出
cv2.imread():opencvで画像を読み込みます。
cv2.cvtColor():読み込んだ画像の色空間を変更します。「cv2.COLOR_BGR2GRAY」でグレースケールに変更します。
cv2.CascadeClassifier():顔検出用のxmlファイルを読み込みます。
cascade.detectMultiScale():顔の検出を行います。detectMultiScale関数で顔を検出すると顔の座標が「face_detect」に代入されます。
# ファイル読み込み
image = cv2.imread(image_input)
# グレースケール変換
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 特徴量読み込み
cascade = cv2.CascadeClassifier(cascade_path)
# 顔検出
face_detect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
if文(分岐処理)の条件は「face_detect」の要素数が0より大きければif文の中が実行されます。
Javaでは{ }を使ってif文のブロックを定義しますがPythonはインデントを使ってブロックを定義します。
# 検出した場合
if len(face_detect) > 0:
for x, y, w, h in face_detect:for文(繰り返し処理)です。face_detectに入っている座標情報を変数x、y、w、hに代入して繰り返し処理を行います。
cv2.rectangle():長方形を描画します。
# 検出した顔を囲む矩形の作成
for x, y, w, h in face_detect:
cv2.rectangle(image, (x, y), (x + w, y + h), (127, 255, 0), 2)
cv2.imwrite():顔に枠線を描画した画像を保存します。
# 認識結果の保存
cv2.imwrite(image_output, image)
プログラム実行
プログラムの実行は「python face_detection.py」となります。
(face_detection) C:\python_work>python face_detection.py
正常終了すると「output」フォルダに「face.jpg」が作成されます。
まとめ
Pythonの文法についてはあまり触れていませんがPythonのプログラミングっぽいことをしてみました。今回の内容を振り返ってみましょう。
- Minicondaを使って新しい仮想環境の構築
- opencvのインストール
- 顔検出用のファイルの設定
- 画像ファイルの準備
- プログラミング
どうでしたか?
次回はPCについているカメラ映像を使って顔検出を行うプログラムを紹介します。
コメント