コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

画像解析をやった気になろう

OpenCV使って顔認識とかやります。

はい、おはようございます。僕です。みなさんは元気ですか。僕はいつも通りです。

えー本日は、画像解析の「Hello World」とも言われている顔認証をやっていきたいと思います [要出典]。実際、画像解析のハロワって何に当たるんですかね?電子工作のハロワはLチカ、機械学習のハロワは数字認識だと思うけども……。まあいいや。それやっていきます。


OpenCVには、Haar-like特徴量*1を使って顔認識ができるらしいぞ。んで、その特徴量はOpenCV側であらかじめ用意されているカスケード分類器使えば取得できちゃうそうです。へー。

参考
Haar Cascadesを使った顔検出 — OpenCV-Python Tutorials 1 documentation

なんか触ってみた

ということで、顔認識をやってみた。ネット上のサンプルって矩形選択なんですけど、そのままコピペしても面白くないので取得部分の矩形を円で取得してみます。まあ囲いのパラメータ雑に加工しただけなので、判定は粗いです……。描画周りは理論と比べてしまったらそこまで重要でないから許して。

とりあえず結果みて。

f:id:andron:20181102220104j:plainf:id:andron:20181102220058p:plain
横向きは弱いっぽいです。


f:id:andron:20181102220630j:plainf:id:andron:20181102220639p:plain
メガネクリアしました。


f:id:andron:20181102220727j:plainf:id:andron:20181102220733p:plain
おわかりいただけただろうか。目には見えない不可解な顔のようなものを……。


とそんな感じの結果になりました。いかがですか?なんか凄いことやった気になれましたね。僕はなれました。


おわり





まあ、なんの学びとかないのもアレなんでソース貼っておきます。

ソース

import numpy as np
import cv2

path = "パス"

# 顔・目検出用の特徴量
face_cascade = cv2.CascadeClassifier(path+"\haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier(path+"\haarcascade_eye.xml")

#ファイル読み込み
img = cv2.imread("ファイル名")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔認識の実行
faces = face_cascade.detectMultiScale(gray, 1.3, 2)
for (x,y,w,h) in faces:
    img = cv2.circle(img,(x+int(w/2),y+int(h/2)),int((x+y)/8),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.circle(roi_color,(ex+int(ew/2),ey+int(eh/2)),int((ex+ey)/4),(0,255,0),2)

# 結果の表示
cv2.imshow('img',img)
cv2.imwrite("output.png",img) # 画像の保存(書出)
cv2.waitKey(0)
cv2.destroyAllWindows()

大体こんな感じです。大量の認識用データでぶんなぐって、正解に畳み込んでるって感じです。んで多分、ここで重要な要素はこれdetectMultiScaleです。引数とかの説明は参考リンクにまかせるとして、これがこのコードのキモとなる部分と思われ。

参考
Cascade Classification — OpenCV 2.4.13.7 documentation


まあ、そういった感じでできるっぽいです。正解データが集められれば色んな分類器つくれそうですね。



あ、画像はぱくたそからです。
ぱくたそ-フリー素材


本日のエラー

error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

XMLファイルがうまく読み込めないとなんか空だとか言って怒られます。

*1:ざっくりとした特徴は画像の明暗差で特徴を捉えること。僕の雑な説明よりもちゃんとした解説ページでググった方が理解がはやいぞ