Python + OpenCV で顔認識

Python + OpenCV で顔認識

Open CV

近年では SNS に画像や動画をアップロードすることができ、より多くの情報を直ぐにシェアすることができるようになりました。しかし、 SNS を運営する企業にとってはモラルに反した画像でないかチェックが必要になってきます。特に個人情報に紐づく画像などは、センシティブなものです。
例えば、動物専門の SNS で人の顔を許可していない場合、人の顔にモザイクをかければ問題なくアップロードできます。現在の一般的な技術で、人の顔を検出することは可能です。
今回は画像に顔が写っている場合、顔を黒塗りする方法を紹介します。顔を検出するのに適したモジュールは OpenCV でしょう。画像認識で顔認証というと難しそうなイメージがありますが、この OpenCV を利用すると数ステップで実現することができます。今回の環境は、以下の通りです。
・Windows11
・Python 3.8.10
・OpenCV 4.5.5

OpenCV インストール

OpenCV のインストールは pip で行うことができます。
PS C:\Users\(user)\PycharmProjects\FaceRecognition> pip install opencv-python
Package    Version
Collecting opencv-python
  Downloading opencv_python-4.5.5.62-cp36-abi3-win_amd64.whl (35.4 MB)
     |████████████████████████████████| 35.4 MB 6.4 MB/s
Collecting numpy>=1.17.3
  Downloading numpy-1.21.5-cp38-cp38-win_amd64.whl (14.0 MB)
     |████████████████████████████████| 14.0 MB 6.4 MB/s
Installing collected packages: numpy, opencv-python
Successfully installed numpy-1.21.5 opencv-python-4.5.5.62

OpenCV と一緒に numpy もインストールされましたね
念のため、現在インストールしているパッケージを表示してみます。
PS C:\Users\(user)\PycharmProjects\FaceRecognition> pip list
Package       Version
------------- --------
numpy         1.21.5
opencv-python 4.5.5.62
pip           21.3.1
setuptools    57.0.0
wheel         0.36.2


顔認証のための学習済みモデル

顔認証をするには学習済みのモデルが必要になります。それは OpenCV 公式で用意されているものを利用します。
https://github.com/opencv/opencv/tree/master/data/haarcascades

この中の「 haarcascade_frontalface_alt.xml 」をダウンロードし、実行する Python のファイルと同じ位置に配置します。上記には顔以外にも多くの学習済みモデルが用意されているので、必要に応じてダウンロードしてください。

画像の準備

当然のことながら、顔を含む画像が必要になります。今回は OpenCV で最も有名な画像をお借りしましょう。これも実行する Python のファイルと同じ位置に配置しました。

実行する Python ファイルの準備

ソースコードは次の通りです。画像ファイルのファイル名やモデルのファイル名は適宜変更してください。最後に黒く塗りつぶした画像を出力しています。
OpenCV では画像をウィンドウで表示する機能もありますが、サーバで動かすことを想定していますので、ファイル出力としています。
下記を main.py として用意しました。
import cv2

# 画像の読み込み
filename = 'sample.png'
image = cv2.imread(filename)

# 顔認証のための学習済みモデル読み込み
cascade_file = 'haarcascade_frontalface_alt.xml'
cascade_face = cv2.CascadeClassifier(cascade_file)

# 顔認証実行
face_list = cascade_face.detectMultiScale(image)

for (x, y, w, h) in face_list:
    # 顔を黒く塗りつぶす
    cv2.rectangle(img=image, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 0), thickness=-1)

# 別ファイルに画像を保存
cv2.imwrite('sample2.png', image)

それでは実行してみましょう。
python main.py 正しく処理されると、 sample2.png が出力されます。

出力された画像の確認

それでは出力された画像を確認してみましょう。

顔が黒く塗りつぶされていることがわかりますね。

まとめ

今回は Python + OpenCV により、画像に顔が写っている場合に顔を黒塗りする方法を紹介しました。実際にやってみると、数ステップで処理できることがわかりました。ぜひ今回紹介したような技術を用い、個人情報を守るようなシステムを構築しましょう。
» エンジニア登録はこちら