はじめに
機械学習に必要な人の顔の画像を集めようと思ったら結構大変だったので、ちょっと作業負荷を軽減させるためにスクリプトを作ってみました。
OpenCVのインストール
以下のコマンドでインストールします。
ちなみに、Python2.7用です。
$ sudo apt install libopencv-dev python-opencv
機能
集合写真の画像URLを指定すると、インターネット上から画像をダウンロードして顔検出し、検出結果の画像を保存するというものです。
ライブラリの読込
使用するライブラリを読み込みます。
import cv2
import sys
from PIL import Image
import urllib
import os
画像用フォルダの作成
検出用、結果用の画像それぞれを保存するフォルダを作成します。
if os.path.exists("input") == False:
os.mkdir("input")
if os.path.exists("output") == False:
os.mkdir("output")
画像データのダウンロード
指定したURLからinputフォルダに画像を保存します。
また、URLから画像ファイルの名前を取得します。
※ 例では「photo.jpg」
url = "http://hoge.com/photo.jpg"
# ファイル名の取得
tmp = url.split("/")
imgname = tmp[len(tmp)-1]
imgpath = "input/" + imgname
# 画像データのダウンロード
response = urllib.urlopen(url)
with open(imgpath, "wb") as fout:
fout.write(response.read())
画像データの加工
フルカラーだと処理に時間がかかるので、グレースケールに変換します。
# 画像データ読込
image = cv2.imread(imgpath)
# グレースケール変換
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
顔の検出処理
顔を検出するための学習済データを読み込み、検出します。
# HAAR分類器の指定
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"
# カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)
# 検出処理
faces = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
print "検出結果",len(faces),"人"
検出結果から顔の画像を切り取り保存
グレースケールに変換する前の画像データから顔の画像を切り取り、保存します。
この時、機械学習で使いやすいように画像サイズを50x50にリサイズしておきます。
img = Image.open(imgpath)
for i in range(len(faces)):
[x,y,w,h] = faces[i]
imgCroped = img.crop((x,y,x+w,y+h)).resize((50, 50))
filename = "output/%s_%02d.jpg" % (imgname.split(".")[0], i)
imgCroped.save(filename)
できた!!
いくつか顔以外のものも検出されますが、概ね満足(^-^)
おわりに
Google先生に「集合写真」でお伺いをすると大量に高解像度の写真が出てきますね。
ちょっと驚きました。