雑記
カスケード分類器を利用した物体検出について調べてみた
ぽんて
公開日:2023/06/30
こんにちは、ぽんてです。お久しぶりです。
今回は「カスケード分類器」を用いた物体検出について調べました!
この記事を読めば集合写真から顔検出ができるようになります。
物体検出とは
ここでいう物体検出とは「ある画像からある物体のみを抽出する」ことです。
よくあるのは集合写真から人の顔の部分だけ枠で囲むとかですね!
本記事もそこをゴールとします。
カスケード分類器とは
抜き取りたい物体の特徴の集合体、的なものです。
次の画像を見てください。
(引用:OpenCV Cascade Classifier)
左下の顔写真が学習用データ画像、上に並んでいる白黒のものが特徴量です。
カスケード分類器による物体検出ではこのように複数の特徴量を利用します。
対象画像と特徴量1を比較し、当てはまる場合はまた次の特徴量2と比較、その次は特徴量3と比較していき、すべての特徴量をクリアすると「抽出したい画像」として判定されます。
※あくまでイメージです
画像から顔の部分だけ切り取ってみよう!
理屈はひとまずおいておき、実行してみよう!
次の手順を踏めば対象の画像から顔の部分だけを四角で囲んだ画像が表示されます。
※Wndowsで実行しています。
opencvのダウンロード
https://opencv.org/releases/ からopencvをダウンロードします。
今回は3.4.16をダウンロードしました。
カスケード分類機をgoogleドライブへアップロード
ダウンロードしたopencvの中にある「haarcascade_frontalface_alt2.xml」ファイルをgoogleドライブへアップロードします。
※opencv\sources\data\haarcascadesフォルダ内にあると思います。
物体検出をしたい画像をgoogleドライブへアップロード
今回は顔検出ですので、何かの集合写真とかがおすすめです。
ファイル名はtest.pngにしています。
google colabにて以下のプログラムを実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import cv2 from google.colab.patches import cv2_imshow from google.colab import drive drive.mount('/content/drive') #カスケード分類器の設定 HAAR = "/content/drive/MyDrive/haarcascade_frontalface_alt2.xml cascade = cv2.CascadeClassifier(HAAR) #物体検出したい画像の設定 filepath = '/content/drive/MyDrive/test.png' image = cv2.imread(filepath) #物体検出対象の座標を取得 coordinates= cascade.detectMultiScale(image) #検出物体を枠で囲む for x, y, w, h in coordinates: cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),1) cv2_imshow(image) cv2.waitKey(0) |
いかがでしょうか。
顔の部分が四角で囲まれた画像が表示されたでしょうか。
haarcascade_frontalface_alt2.xmlのあったフォルダにある別のカスケード分類器を利用するとまた異なる結果となるので、いろいろ差し替えて遊んでも楽しいかもしれません。