AKAZE特徴量の紹介と他特徴量との比較
1月6日追記:作者のPablo氏とメールのやり取りをする中で、当初掲載していたスピードのベンチマークはコンパイラの最適化オプションが指定されていなかったことに気づきましたので、最適化オプションを指定して再度計測し、結果を差し替えました。
2012年のComputer Vision Advent Calendarで、さかな前線 » ECCV2012で発表されたKAZE局所特徴量を試してみた という記事を見て以来、ずっと気になっていた、KAZE特徴量を自分でも使ってみようと色々試していたところ、KAZE特徴量を高速化したAKAZE特徴量が公開されていることに気づきました。
Accelerated KAZEとかいうKAZEの高速化版がいつの間にか作られていた。動画を見る限り、リアルタイムの用途にも使えそう。試してみるか。 http://t.co/Q3mEMuaeV4
— Takahiro Horikawa (@thorikawa) January 3, 2014
僕の用途は、Android上のカメラプレビューからの特定物体認識なのですが、SIFTやSURFは特許問題があるし、KAZE特徴量はとにかく遅くて困っていた*1ので、これは渡りに船です。さっそく試してみたので、AKAZEの簡単な紹介と、他特徴量との比較ベンチマークを公開したいと思います。
AKAZE特徴量とは
作者のページによると、AKAZEのもととなっているKAZEのアイデアは、SIFTやSURFで使われているGaussian filterによるスケールスペースは、Gaussian filterが等方的であるため、オブジェクトのエッジもぼやかしてしまい、局所的な特徴をうまくとれないことがある。それを解決するために、非線形で非等方的なスケールスペースを使いましょう、というもの*2。
さらにAKAZEでは、Feature Descriptorとして、Modified-Local Difference Binary (M-LDB)という独自のDescriptorを使用し、さらにピラミッド構造の計算を高速化するための独自の工夫を組み入れることで、ロバスト性の向上と高速化を図った、ということです。
AKAZEのOpenCVへの組み込み
AKAZEのソースコードは、githubに公開されています。
AKAZE - https://github.com/pablofdezalc/akaze
素の状態でもわりと使いやすいのですが、OpenCV feature2dのcommon interfaceに対応しているとさらに使いやすいと思ったので、それに対応したバージョンを以下で公開しています*3。
AKAZE - cv::Feature2D API wrapper: https://github.com/thorikawa/akaze-opencv
詳しい使い方は、main.cppを見てください。以下のような使い方ができます。
Mat img = imread(...); std::vector<KeyPoint> keypoints; Mat descriptors; Ptr<FeatureDetector> detector = FeatureDetector::create("AKAZE"); detector->detect(img, keypoints); Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("AKAZE"); extractor->compute(img, keypoints, descriptors);
比較ベンチマーク
実際どれだけの性能なのか、他の特徴量との比較ベンチマークをとってみました。ベンチマークツールとしては、thorikawa/OpenCV-Features-Comparison · GitHub
を利用しており*4、Lenaさん画像を回転させたりスケール変化させたりしながら、特徴点対応の正確さを計算しています。なお、パラメータは全てデフォルトですので、チューニング次第で結果は異なります。(当たり前ですが)
スケール変化耐性
[f:id:thorikawa:20140105195310p:original]
回転耐性
輝度変化耐性
Blur耐性
スピード
注意:当初掲載していたスピードのベンチマークは、コンパイラの最適化オプションを指定せず計測したものでしたので、最適化オプション付きで再度計測し、結果を差し替えました。
Algorithm | Average time per Frame (ms) | Average time per KeyPoint (ms) |
---|---|---|
AKAZE | 30.4636 | 0.208972 |
KAZE | 108.736 | 0.553694 |
ORB | 5.78174 | 0.015048 |
SIFT | 44.0598 | 0.161384 |
SURF | 20.917 | 0.0444678 |
スピードに関して1点注意事項があります。AKAZE/KAZEのコードはOpenMPでの並列化に対応しているのですが、このベンチマークではOpenMPを利用していません*5。Pablo氏からの指摘によれば、AKAZEのロジックは並列化に向いているため、OpenMPの利用により大幅なスピードアップが見込めるとのことです。OpenCVのSIFTとSURFのコードを見たところ、SIFTのコードは並列化していませんが、SURFのコードは並列化しています。上記ベンチマークのSURFの速さは、それも起因していると思われます。
参考:最適化オプション指定前の計測結果
結論
画像変化のロバスト性については、スケール・回転・輝度・Blur全てにおいて、AKAZEが最も良い数値を示していることが分かります。実際使ってみた感じでも、かなり正確にトラッキングしている感じがします。
スピードに関しては、SIFTやSURFに比べてもかなり遅いです。スピードに関しても、SIFTやSURFに比べて同程度、もしくはそれ以上です。作者のPablo氏によると現在も改良を続けているとのことで、今後も期待できます。
このブログによると、SIFTやSURFよりもライセンス的に使いやすいオープンソースな特徴量を目指して作られたということで、画像認識で商用化を狙っている人たちには朗報ではないでしょうか。
Pablo氏は、もしAKAZE/KAZEを利用する場合は自分に教えてほしい、と言っています。実績づくりや、今度の改善に貢献するためにも、興味のある方はgithubに記載されているアドレスに連絡をとってあげてください。