まずはじめに
LGTM
乞食なのでよろしくお願いします¥
この記事の目的
なんか顔認証のシステム作りたいなーと思い、OpenCVの基礎的な勉強から始めてます。
OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。
学習済みファイルは下記リンク先からダウンロードできます。
今回は顔検出のために「haarcascade_frontalface_default.xml」を使ってみます。
https://github.com/opencv/opencv/tree/master/data/haarcascades
以下も用意されてるのでまとめてgit clone
しましょう。
カスケード型の識別器のファイル
ファイル名 | 対象物体 |
---|---|
haarcascade_eye.xml | 目 |
haarcascade_eye_tree_eyeglasses.xml | メガネ |
haarcascade_frontalcatface.xml | 猫の顔(正面) |
haarcascade_frontalcatface_extended.xml | 猫の顔(正面) |
haarcascade_frontalface_alt.xml | 顔(正面) |
haarcascade_frontalface_alt2.xml | 顔(正面) |
haarcascade_frontalface_alt_tree.xml | 顔(正面) |
haarcascade_frontalface_default.xml | 顔(正面) |
haarcascade_fullbody.xml | 全身 |
haarcascade_lefteye_2spits.xml | 左目 |
haarcascade_licence_plate_rus_16stages.xml | ロシアのナンバープレート(全体) |
haarcascade_lowerbody.xml | 下半身 |
haarcascade_profileface.xml | 顔(証明写真) |
haarcascade_righteye_2splits.xml | 右目 |
haarcascade_russian_plate_number.xml | 笑顔 |
haarcascade_upperbody.xml | 上半身 |
OpenCV概要
- OpenCVはIntel社で1999年に Gary Bradskyによって開発が開始され、2000年に最初リリースされた
- 画像処理・画像解析および機械学習等の機能を持つC/C++, Java, Python, MATLAB用ライブラリ
- プラットフォームとしてmacOSやFreeBSD等すべてのPOSIXに準拠したUnix系OS、Linux、Windows、Android、iOSをサポート
- 歴史
- 1999年にプロジェクト開始。最初のアルファ版が公開されたのは、国際会議CVPR2000年である
- 2001年から2005年の間に5つのベータ版がリリースされた
- 1.0版がリリースされたのは2006年
- 2008年にWillow Garageによるサポートを受け、開発情況が再び活発になった
- 2009年10月に2回目のメジャーバージョンアップが実施され、2.0版がリリースされた
- OpenCV 2.4.4以降ではJavaが公式にサポートされている
- 2015年6月に3回目のメジャーバージョンアップデートとしてOpenCV 3.0が正式リリースされた
- OpenCV 3.0では従来のC言語関数形式のインターフェースはレガシーAPI扱いとなり、メンテナンスが終了している
- 代わりにC++ APIを使うことが推奨されている
- 2018年11月にOpenCV 4.0がリリースされた
主な機能
# | 項目 | 機能 |
---|---|---|
1 | 画像処理 | 勾配、エッジ、コーナー(Gradients, Egdes and Corners) |
2 | 画像処理 | サンプリング、補間、幾何変換(Sampling, Interpolation and Geometrical Transforms) |
3 | 画像処理 | モルフォロジー演算(morphological Operations) |
4 | 画像処理 | フィルタと色変換(Filters and Color Conversion) |
5 | 画像処理 | ピラミッドとその応用(Pyramids and the Applications) |
6 | 画像処理 | 画像分割、領域結合、輪郭検出(Image Segmentation, Connected Componets and Contour Retrieval) |
7 | 画像処理 | 画像と形状のモーメント(Image and Transforms) |
8 | 画像処理 | 特殊な画像変換(Special Image Transforms) |
9 | 画像処理 | ヒストグラム(Histograms) |
10 | 画像処理 | マッチング(Matching) |
11 | 画像処理 | ラベリング(Labeling)※OpenCV 3.0以降 |
12 | 構造解析 | 輪郭処理(Contour Processing) |
13 | 構造解析 | 計算幾何(Comutational Geometry) |
14 | 構造解析 | 平面再分割(Planar Subdivisions) |
15 | モーション解析と物体追跡 | 背景統計量の累積(Accumulation of Backgorund Statistics) |
16 | モーション解析と物体追跡 | モーションテンプレート(Motion Templates) |
17 | モーション解析と物体追跡 | 物体追跡(Object Tracking) |
18 | モーション解析と物体追跡 | オプティカルフロー(Optical Flow) |
19 | モーション解析と物体追跡 | 推定器(Estimators) |
20 | パターン認識 | 物体検出(Object Detection) |
21 | カメラキャリブレーションと3次元再構成 | カメラキャリブレーション(Camera Calibration) |
22 | メラキャリブレーションと3次元再構成 | 姿勢推定(Pose Estimation) |
23 | メラキャリブレーションと3次元再構成 | エピポーラ幾何(Epipolar Geometry) |
24 | 機械学習 | 単純ベイズ分類器(Native Bayes Classifier) |
25 | 機械学習 | k近傍法(K Nearest Neighbors) |
26 | 機械学習 | サポートベクターマシン(SVM) |
27 | 機械学習 | 決定木(Decision Trees) |
28 | 機械学習 | ブースティング(Boosting) |
29 | 機械学習 | ランダムフォレスト(Random Forest) |
30 | 機械学習 | EMアルゴリズム(Expectation-Maximization) |
31 | 機械学習 | ニューラルネットワーク(Neural Networks) |
32 | ユーザインターフェース | シンプルGUI(Simple GUI) |
33 | ユーザインターフェース | 画像の読み込みと保存(Loading and Saving Images) |
34 | ユーザインターフェース | ビデオ入出力(Video I/O) |
35 | ユーザインターフェース | OpenGL/Direct3Dの相互運用 |
やってみたこと
皆ほぼ同じにしか見えない就活生の顔をdetectしてやりたいと思います🙃
もとの画像
結果
おお、なんか惜しいな...🤔
後ろの方はもはや認識されていないように思える。
探索窓が小さすぎるとダメなねすかね。
前の方は顔半分見切れてるし...🤫
コード
python3
# -*- coding: utf-8 -*-
import cv2
def main():
# 入力画像の読み込み
img = cv2.imread("test.jpg")
# カスケード型識別器の読み込み
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# グレースケール変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 顔領域の探索
face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
# 顔領域を赤色の矩形で囲む
for (x, y, w, h) in face:
cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,300), 4)
# 結果を出力
cv2.imwrite("result.jpg",img)
if __name__ == '__main__':
main()
参考にさせていただいたサイト
幅広く詳解されています。
https://algorithm.joho.info/programming/python/opencv-haar-cascade-face-detection-py/