![見出し画像](https://assets.st-note.com/production/uploads/images/108505844/rectangle_large_type_2_93908ed43ddfcf4e32feb2e878b1b7c8.png?width=1200)
OpenCVの学習済みモデルを使って、集合写真から顔検出をする
前回の記事
前回はこちらで用意した画像で該当するか判定した
学習済モデル
カスケード分類器(Cascade Classfier)とは
カスケード(cascade)とは「垂れ下がり」などの意味がある。classfierは分類器の意である。カスケード分類器についてはOpenCVのサイトより確認してほしい。
Haar特徴ベースのカスケード分類器を使用した物体検出は、Paul ViolaとMichael Jonesが2001年の論文「単純な特徴のブーストカスケードを使用した迅速な物体検出」で提案した効果的な物体検出方法です。これは機械学習ベースのアプローチであり、カスケード関数は多くのポジティブおよびネガティブな画像からトレーニングされます。次に、他の画像内のオブジェクトを検出するために使用されます。
今回は既に学習済のカスケード分類器を用いて、画像検出(顔検出)を行う。
導入
OpenCVの学習済みモデル「カスケード分類器」はOpenCVのホームページReleaseにある「Sources」リンクからダウンロードし、OpenCVのインストールフォルダ(data)の直下におけばいいと解説している記事がある。
しかし、実際に該当するフォルダを確認したら既にあった。PythonでOpenCVをインストールしていればそもそも作業は不要であることが分かった。
pip install opencv-python
![](https://assets.st-note.com/img/1687006754175-7Uz7b9wrSZ.png?width=1200)
なお、Pythonでインストールしたフォルダの場所を探す方法を調べた結果を残しておく。なぜ、それで調べられるのか分からんが。
import cv2
print(cv2)
![](https://assets.st-note.com/img/1687007406193-bqmKAQYhiX.png?width=1200)
検出時の枠線はRGBより、緑色を指定した。
(0, 0, 0) は黒
(255, 255, 255) は白
(255, 0, 0) は赤
(0, 255, 0) はライム
(0, 0, 255) は青
(255, 255, 0) は黄
(0, 255, 255) はシアン
(255, 0, 255) はマゼンタ
事前準備
写真の準備
人物の集合写真は下記より拝借させていただいた。(Wikimedia Commons)
ファイルパス(カスケード分類器)
また、カスケード分類器はhaarcascade_frontalface_defaultを使うので、ファイルパスを控えておこう
実装
import cv2
# 検索対象画像の読み込み
img = cv2.imread("pic.jpg")
#カスケード分類器の読み込みと検出
face_cascade_path = "*:\***\Python\Python310\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(face_cascade_path)
face = cascade.detectMultiScale(img)
#結果を表示
for (x, y, w, h) in face:
cv2.rectangle(img, (x, y), (x+w, y+h), (0,255,0), 2)
cv2.imshow("result.jpg",img)
cv2.waitKey(50)
cv2.waitKey(2000)
実行結果
![](https://assets.st-note.com/img/1687010580970-7sdGmapmMT.png?width=1200)
研究課題
自分の環境下で使う学習データを用意していけば、自分の環境下で合った精度の画像検出ができるのではないかと思う。次回以降、カスケード分類器を自作してみる。そして、読み取り精度が上がるのか確かめたい。
例えば、AI-OCRでも、OCRでも精度が低い(実用的ではない)のは、学習済データが自分の環境とマッチしないからか、判定アルゴリズムの問題に分けられると思う。しかし、いずれにしても自分の環境下に合う画像で、機械学習させなければ精度がより低くなるのは間違いないだろう。
雑談
OCRだろうが、AI-OCRだろうが、学習させることには変わりはない。AIをビジネス的な冠詞で使う(実のない表現として使う)人が多いのではないか。そういった使い方は弊害を生じかねない。専門分野における自分のレベルは低くても自分なりに試してみることで見えてくることもある。受けてとしては浅くてもいいので特性を把握した説明も求めたい。
まとめ
学習済モデルでも、そこそこの精度で検出できることが分かった。もちろん使う写真によって結果が異なるので注意がは要である。完全を求めず、そのときの検出機会に満足できるのであれば、学習済モデルを使用するのも有りだと思った。何より用意されているものを使うのでお手軽だ。必要に応じて自分で学習させたデータで検索させることも検討したい。
おわり!