【Python】opencvを使って写真から顔検出プログラム

Pythonに関する記事です Python
Pythonに関する記事です

Pythonらしいプログラミングを行なってみたいと思います。顔検出!!ということで今回は画像ファイルから顔検出を行なって枠線を描画するプログラムになります。

実行結果

顔検出!!ということで今回は画像ファイルから顔検出を行なって枠線を描画するプログラムになります。

OS:Windows11

IDE:VS Code

言語:Python3.10.9

パッケージ:opencv 4.6.0

仮想環境:Miniconda

スポンサーリンク

下準備

仮想環境の作成

ターミナルが表示されていなければメニューバーの「ターミナル」をクリックして「新しいターミナル」をクリックしてください。またはショートカットキー「Ctrl + Shift + @」

ターミナルが表示されていなければメニューバーの「ターミナル」をクリックして「新しいターミナル」をクリックしてください。またはショートカットキー「Ctrl + Shift + @」

ターミナルを開くと仮想環境(base)の状態になります。

仮想環境ではない場合、先頭に(base)が表示されていない場合は下記のコマンドを入力してください。

activate base
ターミナルを開くと仮想環境(base)の状態になります。

仮想環境ではない場合、先頭に(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つダウンロードすれば良いのですが一式ダウンロードします。下記にアクセスしてください。

GitHub - opencv/opencv at master
Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

①「Code」をクリックしてください。

②「Download ZIP」をクリックしてください。

①「Code」をクリックしてください。
②「Download ZIP」をクリックしてください。

opencv-master.zipがダウンロードされます。このファイルを右クリックします。

opencv-master.zipがダウンロードされます。このファイルを右クリックします。

「すべて展開」をクリックします。

「すべて展開」をクリックします。

「ファイルを下のフォルダーに展開する」をPythonの作業フォルダ内にします。

C:¥python_work

設定したら「展開」をクリックします。

「ファイルを下のフォルダーに展開する」をPythonの作業フォルダ内にします。

C:¥python_work

設定したら「展開」をクリックします。

VS Codeのエクスプローラーに表示されていることを確認します。

VS Codeのエクスプローラーに表示されていることを確認します。

画像ファイルの準備

python_workに「input」、「output」フォルダを追加してください。

inputフォルダに画像ファイルを入れます。ファイル名を「face

画像は「写真AC」からダウンロードしました。顔が写っていれば何でもいいです。

オフィスで会議をする男女のビジネスマン
オフィスで会議をする男女のビジネスマン(No: 24683531)の無料写真素材を提供する「写真AC」のフリー写真素材は、個人、商用を問わず無料でお使いいただけます。クレジット表記やリンクは一切不要です。Web、DTP、動画などの写真素材と...
python_workに「input」、「output」フォルダを追加してください。

inputフォルダに画像ファイルを入れます。

画像は「写真AC」からダウンロードしました。顔が写っていれば何でもいいです。

プログラミング

「face_detection.py」という名前でファイルを新規追加します。

インタープリターがbase環境になっているので右下の「Python 3.10.8(’base’:conda)」をクリックます。

「face_detection.py」という名前でファイルを新規追加します。

インタープリターがbase環境になっているので右下の「Python 3.10.8('base':conda)」をクリックます。

「Python 3.10.9(’face_detection’)」をクリックします。※バージョンは変わりますので仮想環境名(face_detection)を選択してください。

「Python 3.10.0('face_detection')」をクリックします。

ステータスバーが「Python 3.10.9(’face_detection’:conda)」に変更されていることを確認します。

ステータスバーが「Python 3.10.0('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」が作成されます。

正常終了すると「output」フォルダに「face.jpg」が作成されます。

まとめ

Pythonの文法についてはあまり触れていませんがPythonのプログラミングっぽいことをしてみました。今回の内容を振り返ってみましょう。

  1. Minicondaを使って新しい仮想環境の構築
  2. opencvのインストール
  3. 顔検出用のファイルの設定
  4. 画像ファイルの準備
  5. プログラミング

どうでしたか?

次回はPCについているカメラ映像を使って顔検出を行うプログラムを紹介します。

中澤 一人

沖縄支店の中澤です。
プログラミング講師やシステム開発を行っています。

#有限会社エヌ・ユー・エスをフォローする

コメント

タイトルとURLをコピーしました