顔の抽出ができると、何かのキャンペーンで活用できたり、機械学習用に素材から顔を抽出するのに使えそうだなと思いつつ、手作業でやると大変そうだとも思い、OpenCV を利用して、顔を検出して、画像から顔領域の抽出を自動化できないかと思い、試してみました。
この記事では、インストール直後の Windows で実行する手順だけをシンプルにまとめてみます。
1.Python をインストール
https://www.python.org/downloads/ から、Python をインストールします。この記事を書いている時点でのバージョンは 3.10.4 でした。
インストール画面が出てきたら、「 Add Python 3.10 to Path 」は、最初チェックが外れているのですが、チェック入れてインストールすると、コマンドラインから毎回フルパス入れずに起動できるので便利です。
2.pip を利用して、OpenCV 関連のライブラリをインストールします。
# pip install opencv-python
3.カスケード分類器のダウンロード
カスケード分類器とは、OpenCV を利用して、どういう検出をするかということを学習した結果を保存した XML ファイルです。
今回は、顔検出をしますので、顔検出用のカスケード分類器「haarcascade_frontalface_default.xml」を利用します。このファイルは、以下の URL からダウンロード可能です。
https://github.com/opencv/opencv/tree/master/data/haarcascades
4.検出対象画像を用意
今回は、PhotoAC (https://www.photo-ac.com/) さんの画像を利用させてもらいました。
5.Python コードを記述して検出実行
カスケード分類器、検出対象画像を、全部同じフォルダに置いて、下記 python コードを実行
import cv2
# 検出対象画像の読み込み
img = cv2.imread("./315142_s.jpg")
# カスケード分類器の指定
cascade = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
# OpenCV を利用して顔検出
face = cascade.detectMultiScale(img);
# 検出した場所に枠線を描く
for (x, y, w, h) in face:
cv2.rectangle(img, (x, y), (x + w, y+h), (0, 0, 200), 3)
# 枠線を描いた画像を出力
cv2.imwrite("./output1.png", img)
6.結果
カスケード分類器が正面顔用だったので、横顔は難しかったみたいですね。
人には見えない顔?が OpenCV には見えている?
7.最後に
ちなみに、Linux 上でも、ほぼ同じ仕組みで動かせるはずなので、機会をみて弊社提供サーバーでも試してみたいと思います。
というわけで、結構簡単に、検出できたので、あとは、これをベースに、画像操作ライブラリと組み合わせていろいろ機能を付け足せば、面白い使い方もできそうです。