#BoVW(Bag of Visual Words)の概要について
画像認識の分野ではよく知られているBoVW(Bag of Visual Words)。
今回はBoVWの概要とOpenCVを用いたコードの記述方法についてまとめました。
#BoVWとは
まずBoVWの先駆けとなったBoWという手法について触れたいと思います。
##BoW(Bag of Words)
BoVWの元になった手法で、文章の特徴を単語ごとの出現回数で表した特徴ベクトルです。
つまり、BoWは文書ごとの単語出現数のヒストグラム(度数分布)を作ることを指します。
##BoVW(Bag of Visual Words)
BoWを応用して画像の特徴を特徴点が属するVisual Word
ごとの出現回数で表した特徴ベクトルです。
この特徴ベクトルのヒストグラムを画像の特徴を表すものとして識別に利用します。画像処理版BoWとも言えます。
Bag-of-FeaturesやBag-of-Keypointsとも呼ばれることがあります。
技術の背景を鑑みると、BoVWが覚えやすいですね。
#BoVWの流れ
1.入力画像のkeypoints
, descriptors
を取得
keypoints, descriptors = detector.detectAndCompute(image, None)
2.クラスタを準備
bowTrainer = cv.BOWKMeansTrainer("クラスタの数")
3.準備したクラスタに特徴点(keypoints
のdescriptors
)をセット
bowTrainer.add(descriptors)
4.descriptors
でクラスタリングする(codebook
=Visual Wordの作成)
codebook = bowTrainer.cluster()
5.Visual Word
の出現頻度でヒストグラムを作成
(このヒストグラムが画像の特徴を表現する)
次に画像認識や機械学習の用語について解説していきたいと思います。
#局所特徴量とは?
特徴点検出法により画像中 の濃淡の変化が大きい特徴点を検出し、その特徴点周りの領域を画素値や微分値により特徴ベクトルにしたものです。
プログラム中ではdescriptors
と定義されていることが多いです。
#クラスタリングとは?
教師なし学習の一つで、データの集合をクラスタという部分集合に分けることです。
BoVWでは、取得したdescriptors
に対してクラスタリングを行います。
さらにクラスタリングについて知りたい方はこちらを参考にしてください。
何ができるのか、実際にどう使うのかを体系的に学ぶことができます。
BoVWでのクラスタリングにはk-meansを用いることが多いです。
#OpenCVで用意されているBoVWの関数
上記のコードではOpenCVに用意されている以下の関数を使っていますが、OpenCVには利用用途に応じで他にもBoVWのための関数が用意されています。
その他の関数についてはこちらを参考にしてください。
テンプレートマッチングのようにmatchTemplate
関数を用いて一発でBoVWが取得されるということではなく、
BoVWを作成するための手段として組み合わせて使う、と考えるとイメージしやすいかと思います。
##OpenCVで用意されているBoVWのための関数(一部)
-
BOWKMeansTrainer
BoVWでk-means法によるクラスタリングを行う。
クラスタの中心(codebook
)を返す。 -
bowTrainer.add
クラスタリングするdescriptors
を分類器に追加する。 -
bowTrainer.cluster
追加したdescriptors
をクラスタリングする。
参考文献
Lecture 17: Bag-of-Features (Bag-of-Words)
英語の講義動画ですが、図が多いのでBoVWについてとてもわかりやすく解説しています。
よかったら参考にしてみてください。
OpenCV: 局所特徴量による類似画像検索/分類
日本語ですとこちらがおすすめ。
こちらでは実際のコードも合わせてアルゴリズムも含めわかりやすく解説しています。
今後もBoVWだけでなく、画像認識や機械学習について時間を見つけて記事を書きたいと思います。