catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

画像認識で機械学習が必要そうという結論に至るまでのメモ

考えを整理するための個人的なメモ的なものです。かたりぃなです。

画像・動画・音声などから特定の「もの」を認識したいことって多々ありますよね。
少なくとも私の中ではしょっちゅうあります。

さて、今回の記事は物体認識の問題色々調べた結果を自分の中で整理するためのメモです。
基本概念の整理が目的です。

物体認識とは

まず物体認識とは何ぞや?という問いについて。物体認識を問題領域の観点から大別して2系統あるようです。

  1. 特定物体認識
  2. 一般物体認識

まず1について。これが私の欲しい物体認識です。
既知の物体Aについて、画像中のどこに物体Aが存在するか(もしくは存在しない)を調べる

2ですが、画像が何を示しているものなのかを言い当てる(車の画像!とか)物体認識です。
画像処理以外の方面の知識も必要となってくるので、こちらは当面は保留とします。

特定物体認識の古典的手法

古くからあるアルゴリズムとして、次の2つをあたってみました。

  1. 物体の形状認識
  2. テンプレートマッチング

まず形状認識ですが、これは物体の形状を表現しやすいデータへと変換し、目的の形状と一致しているかを調べる方法です。
OpenCVの関数でいうとFindContourなどで形状抽出し、shape::match(内部的にはモーメントの比較)などが考えられます。
輪郭線などの画像の特徴的な点は、後で述べる特徴量という考え方にも関連してきそうです。

テンプレートマッチングは使い古された手法で、対象画像とテンプレート画像を比較し、
テンプレート画像をスライドさせていき、もっともよくマッチする場所を探すというものです。

テンプレートマッチングの課題

テンプレートマッチングは外界からのノイズに弱いという課題があります。
外界からのノイズとして、カメラの性能もそうですが、カメラ自身の置かれている環境の影響もあります。
特にwebカメラから取り込む画像というものは外界の影響をふんだんにうけます。(部屋の照明、手ぶれ、など)
テンプレートマッチングでは、対象画像に事前処理を施すことによって不安定要素を取り除くというアプローチが見られます。
照明が安定しないのであれば、適応的に輝度調整を行って誤検出となりうる影を取り除くなど。
(ロバスト設計、ロバスト性などの言葉がキーワード)
このように外界の不安定要素に対して固有に対処して乗り切ることもできますが、外界のすべての事象を事前に予測しておくことは困難です。

またテンプレートマッチングのアルゴリズムの特性上、画像の回転・拡大に弱いという問題があります。
これは、テンプレートマッチングがピクセル単位での比較が基本となっていることに起因します。
OpenCVが提供している比較式を眺めてみても、これは明らかです。
http://docs.opencv.org/master/df/dfb/group__imgproc__object.html#gsc.tab=0
ピクセル単位での比較ではなく、もっと抽象的な比較が行えれば問題解決に向けて大きく前進しそうです。

特徴量という考え方

特徴量といえば顔検出のHaarLikeが真っ先にあがります。
あとはHOGで人体検出などといった文献も見受けられます。
SIFTやSURF,最近のOpenCVではAKAZEが実装されて、AKAZEが今の注目ではないでしょうか。

さて、特徴量の詳細はもっと有用なサイトに譲るとして、
特徴量による画像比較は、検出したい物体について「ピクセルの値(RGB値など)の表現ではなく、その物体をもっともよく表現するポイントを数値で表現し、そのポイントごとの数値で比較しよう」
というアプローチと解釈しています。

さて、特徴量の具体的な例ですが、HaarLikeでは明度差、HOGでは輝度の勾配方向を使って表現します。
このようにして求められた値が特徴的な場所(キーポイント)を特徴点と呼ぶようです。

特徴記述

特徴量がわかったとして、その特徴量をソフトウェア内で表現する必要があります。
これが特徴記述と呼ばれるものです。
単純な差分値であればスカラー、勾配であればベクトルといった表現のほかにも、バイナリとしてどのように表現するかなど、色々なアプローチがあります。

特徴点マッチング

ここまでで特徴点とその表現方法が定義されました。
あとはマッチングするだけです。
OpenCVで提供されている特徴点マッチングのアルゴリズムも色々あって、
特徴記述によっては使える・使えないなどがあります。

特徴量とロバスト

さて、ロバスト性の話に戻ってきました。
画像のマッチングを行うとき、回転不変、拡縮不変、アフィン不変などと呼ばれていますが、
特徴量を使えばこれらの不変性を得られるのか(頑強であるか)といえばそうでもありません。
特徴量ごとににこれらの耐性は違っているので、適切な手法を選ぶ必要がありそうです。
こちらのサイトに代表的な特徴量ごとの測定結果が乗っていたので参考になりました。
AKAZE特徴量の紹介と他特徴量との比較 - 遥かへのスピードランナー

学術的には回転に対して頑健でない特徴量を回転不変にするための提案など色々あがっているようです。
そのあたりも含めて自分で実際に何かを作るときの手順は

  1. 特徴量をそのまま使った場合に「何ができるのか・何ができないのか」を理解し、選定する
  2. 目的機能を満足しない項目に対するフォロー(目的機能を満たすためのロバスト設計)

といった手順が考えられます。

じゃあAKAZE使えばいいんじゃない?と思われますが、私がやりたいことを実現するための課題はまだ残っています。
解決したもの

  • 回転不変、拡縮不変なアルゴリズムであること(そういう特性をもった特徴量を利用する。例えばAKAZE)

残っている課題

  • 外界からのノイズ耐性

機械学習

任意の特徴量のマッチングによって回転、拡大、照明に対してそれなりの耐性は付加できそうというところまで来ました。
それでも外界からの影響は少なからず受けますし、影響自体をゼロにすることは現実的ではありません。(専用部屋でのみ使うソフトですとかであれば話は別かもしれませんが。)
現実世界でのノイズとして

  • 撮影機材そのものの品質(解像度どのくらい?)
  • 検出対象物の個体差(検出対象物に傷、凹みなどがついているかもしれない)
  • 撮影環境(ピントが若干ずれているとか)

などが考えられます。
ここにあげた例が全てではなく、外界からの影響をすべて予測することは非常に難しい問題です。
検出対象の物体についても、品質ばらつきが少ない工業製品であればいいのですが、動物の種類や人間の顔に代表されるような「基本的な構造は同じだが、対象物固有の特徴が付加されているもの」は、これまでの手法だけでは個体差を吸収しきれないため、実現はやや困難です。

さて、いよいよ本題の機械学習です。概念的な部分を中心に調べてみました。
機械学習というアプローチに対する私なりの解釈は
「外界からの影響(撮影機材、環境、対象物の品質ばらつき)を完全に制御することは不可能なので、外界からどのような影響があるのかという統計をとって、その統計情報をもとに判断しよう」
というアプローチだと認識してます。
これは現実的な解ですし、最近はこういったアプローチ(機械でできることは機械でやろうよ)が増えていくと思っています。
機械学習って単語カッコイイです。ただ、本質的な部分は統計(だと私は勝手に思っている)なので、「何を学習させたいのか」を明確にしたうえで利用することが重要だと考えています。

私自身はまだ実際に動かしてはいないのですが、目的にあった機械学習のアプローチを選択しておかないと、学習結果が収束しない・期待した精度が得られないという問題に陥りがちのようです。
難しい分野ではありますが、後述のディープラーニング含めて伸びてくる分野だと思っているので、色々試してみたいところです。

ディープラーニング

機械学習のことを調べていると、このキーワードがよく引っかかります。
ディープラーニングの目的を機械学習の延長上から自分なりに解釈してみると、

  • 機械学習は、学習モデルをプログラマが決める(特徴量の抽出手法、比較方法など)
  • ディープラーニングは、学習モデルそのものも、学習させる

といったイメージです。このあたりはまだ深くは理解していないので、ちょっと自信ないです。
これが真だと仮定して続きを書きます。
こうして機械学習と比べてみるとディープラーニングのほうがさらに汎用化でき、実装コストも下がりそうな気がします。
現実的には学習のコスト(機械学習のコスト)が非常に大きいという課題もあるようです。
加えて、自分自身がスキルを身に着けるためにかかるコスト(時間)が極端に増大するうえに、基礎をおろそかにしていては「まずはやってみた」から抜け出せずに「工夫してみた」にたどり着けない恐れがあります。
現在の私の技術力では、まず機械学習から順に追っていくのが良さそうですし、モチベーションも保てそうです。

結論

ディープラーニング、機械学習、特徴量など色々調べてみましたが、
「ソフトウェア機能実現における課題解決手段であって、それ自体が目的ではない」といったところでしょうか。
プリミティブな技術要素だけでなく、その技術要素のあらまし、目的を明確にしておくという、ごく当たり前の結論に帰着しました。まる。
技術的な結論にしたかったのに、哲学的になってしまってちょっと残念。

今後の展望

あとで読むドキュメントのメモ。

OpenCV3.0についてる機械学習モジュール
OpenCV: Machine Learning

OpenCV3.0にOCR(文字認識)としてtextモジュールが増えてるのでどんなものか見てみるのもいいかもしれない。

上二つはまだよくわかりません。
OpenCV: cv::text::BaseOCR Class Reference