ゴール:画像から人物の顔を検出し切り出して保存する
機械学習のために、人物の顔の画像を写真から切り出して保存する方法を検証しました。
まずは、一人の人物の正面の画像をもとにOpenCVを使い顔検出・切り出しを行いました。
やってみた結果
やってみて、一人の人物の画像であれば難なく画像を切り出して保存することができるようになりました。
この記事を読んだ人も、以下のコードを利用して、人物の顔検出・切り出しを試していただければと思います。
開発環境
- Ubuntu
- Vscode
- Xcode
- Python 3.8.15
事前準備
一人の人物の正面の画像を準備します。
今回はこちらのフリー素材を利用します。
やったこと
opencvのインストール
$ pip install opencv-contrib-python
今回、私が利用したバージョンは以下になります。
opencv-contrib-python 4.8.1.78
matplotlibのインストール
$ pip install matplotlib
今回、私が利用したバージョンは以下になります。
matplotlib 3.7.4
画像のグレイ変換
img_g = cv2.imread(input_file_path,0)
input_file_pathに私用する画像の拡張子までのフルパスを記入します。
ちなみに私の変換結果は以下のようになりました。
人物の顔の検出
#カスケード型分類器に使用する分類器のデータ(xmlファイル)を読み込みします。
cv2フォルダの中からhaarcascade_frontalface_default.xmlのフルパスを記入します。
HAAR_FILE = "/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(HAAR_FILE)
#カスケード型分類器を使用して画像ファイルから顔部分を検出します。
faces = cascade.detectMultiScale(img_g)
今回利用した画像は少しわかりにくいかもしれませんが、顎と顔の二か所が検出されています。
検出されたオブジェクトの中で一番大きなものの値を取得
検出したオブジェクトの幅×高さの最大値を取得します。
max_face = max(faces, key=lambda x: x[2] * x[3])
該当の部分だけを白線で囲んだ画像が以下になります。
顔の部分の切り出し
# 矩形の値を取得
x, y, w, h = max_face
# 顔のみ切り取り
face = img[y:y+h, x:x+w]
※切り出す前に切り出す部分を線で囲むことができます。
cv2.rectangle(img, (x, y), (x + w, y + h), color=(255,255,255), thickness=5)
colorにRGB値を入れることで色を指定できます。
thicknessの数字を変更すると線の太さが変更できます。
画像の表示
faceに画像データを入れて利用します。
plt.imshow(face)
plt.show()
その場で確認できるので便利です。
画像の保存
出力先のパスとファイル名を拡張子付きで一つ目の引数に使います。
二つ目の引数には画像データを入れて利用します。
cv2.imwrite(output_file_path+filename+".jpg", face)
このように顔の部分のみの画像が保存されました。
まとめ
今回は一人の正面画像を利用しましたが次は複数人の画像や横顔の画像等から顔を検出する記事を書きたいと思います。
今回、利用した画像ではシンプルに見えて、顎も顔に認識されたりしました。
そのため、今後はAIを使った検出方法等も記事にしていきたいと思います。