Open5

画像からオブジェクトを検出する

Watson-SeiWatson-Sei

opencv_traincascadeを利用して独自のカスケード分類器の作成をすることが可能であり、例えば人間であればOpenCV公式が提供しているが魚などのカスケード分類器などは提供されていないので自ら作成する必要がある。また魚のカスケード分類器を作成する場合のコマンドは以下である

C:\OpenCV\build\x64\vc15\bin\opencv_traincascade -data data -vec fish.vec -bg neg.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 1000 -numNeg 500 -w 40 -h 40 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024
Watson-SeiWatson-Sei

魚が含まれる画像は、「正解画像」と呼ばれ、魚が含まれない画像は、「負解画像」と呼ばれる。上記で作成した分類器を利用することで画像から魚を検出することができるようになる。

Watson-SeiWatson-Sei

OpenCVバージョン4.6以降でopencv_traincascadeコマンドが廃止されたので、カスケード分類器を独自でさらに作る難易度が上がったとのこと。なので画像収集を行った後に収集した画像から最適化された画像をpositive_imageとしてカスケードxmlとして作成する処理を作る。

Watson-SeiWatson-Sei

Haar-like 特徴と LBP (Local Binary Pattern) 特徴は、画像から特徴を抽出する手法です。

Haar-like 特徴は、画像の輝度の差を特徴とする手法です。画像内にある物体を検出する際には、画像内の輝度の差が大きい場所を探すことで、物体を検出することができます。Haar-like 特徴は、OpenCV のカスケード分類器でよく使用されます。

LBP 特徴は、画像の周りの輝度を特徴とする手法です。LBP 特徴は、画像を小さな領域に分割し、それぞれの領域内の輝度を比較して

Watson-SeiWatson-Sei
import cv2

# 学習用のデータセットを読み込む
# positive_imagesは物体が写っている画像のリスト、negative_imagesは物体が写っていない画像のリスト
positive_images = []
negative_images = []

# カスケード分類器のアルゴリズムを定義するためのパラメータを指定
params = cv2.CascadeClassifier_create()
params.setInt('minNeighbors', 6)
params.setInt('minSize', (20, 20))

# 学習用のデータセットとパラメータを使用してカスケード分類器をトレーニング
classifier = cv2.CascadeClassifier.train(positive_images, negative_images, params)

# トレーニングされたカスケード分類器をxmlファイルとして保存
classifier.save('classifier.xml')