11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonでOpenCVのBoVWを使ってみた

Last updated at Posted at 2019-11-07

#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を取得

python
keypoints, descriptors = detector.detectAndCompute(image, None)

2.クラスタを準備

python
bowTrainer = cv.BOWKMeansTrainer("クラスタの数")

3.準備したクラスタに特徴点(keypointsdescriptors)をセット

python
bowTrainer.add(descriptors)

4.descriptorsでクラスタリングする(codebook=Visual Wordの作成)

python
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だけでなく、画像認識や機械学習について時間を見つけて記事を書きたいと思います。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?