考察:「モデルベースの画像認識」

by ご近所のきよきよ


 
 自然言語処理システムと知識ベースシステムができましたので、いよいよ画像認識に手を伸ばしていくことにしました。それに先だってJava3DとOpenCVを勉強していました。どっちも大きなシステムで、API仕様とかを参考にしたいと思います。できれば、OpenCVを利用して画像認識を実現していきたくあります。知識ベースとか自然言語処理はJavaで作ってきていますので、OpenCVを使うときにはJNIを使うことになるでしょう。JNIも勉強し始めました。こうゆうライブラリを使えるというのは福音ですね。OpenCVはもう10年以上も開発が成されていきいて、同等のものを私が作っていくとしたら、30年は掛かるでしょう。でもアルゴリズムの説明もありますし、簡単で、必須のモジュールは自前にするかも知れません。Java3Dも表示だけでなく、ボクセルを作るツールとして利用したいのですが、私はJava3Dの開発者でないから、APIを参考にできるだけで、中身はオリジナルで作っていかねばなりません。なんかソフトウエア開発の障壁として大きなものはライブラリを使えるかどうかということにもあるかも知れませんね。ソフトウェア開発はできるだけライブラリ形式で作っていって、後輩がそれを流用できるような環境を構築していくということ、それが大きいと思います。JavaがCOBOLより未来があるのは機能とかライブラリが豊富であり成長しているからです。アイデアだけでは大きな力にはならない・・・。それがソフトウェア開発なわけです。
 
 前置きはそれくらいにいたしまして、画像認識の豊富を語っていきたいと思います。ロボットの生きる世界はイメージ、画像の世界です。一方で情報処理は記号の世界です。自然言語処理も記号の世界ですが、画像認識も自然言語処理ももっと基本的な記号の世界に情報を落としてそこで情報処理をしていくことになります。記号の世界は曖昧性の無い、推論のし易い世界であるでしょう。コンピュータ向きの世界なのです。そんな考え方で画像認識システムというものを考えるとどうなるでしょうか。どんな技術が必要になってくるでしょうか。この7年の考察をまとめていくと次のようになるようです。
(1)モデル画像データの作成
 人体とか、顔、木とか水とかの心的イメージの画像を構築すること。人体ですと、複数の方向から観た写真から人体のモデルを作っていくわけです。元となるモデルは球とかシリンダーとかの画像を組み合わせて、作ったイメージですが、特定の人物ですと、横からの写真から、胸が出ているとか、お尻が大きいとか、そんな微調整がなされるわけです。こんなところに、Java3Dを参考にするところがあるのです。
(2)画像解析
 頭と胴の関係とか、ある人物とある人物の位置関係とか、そんなものを解析して、記号化していくことです。これは、イメージのボクセルの各ピクセルの間の関係を解析していくことになります。画像解析で得る情報は、
・位置関係
・包含、接触・分離関係
・数
・形状(特徴)
 
(3)画像表示
 視点からの見え方を2次元で得ます。これもJava3Dです。
(4)画像情報の永続化
 
 これらの処理を行うには、「モデル」というものを設定することで見通しがよくなります。なんでもかでもモデルを設定して、現実はそれとどういう関係にあるか、特徴はなにかと同定していくことになります。記号のプリミティブもオントロジーもモデルの理論できれいに整理されます。これから、画像認識のAPIを設計していくことになりますが、このモデル指向の考え方で推し進めることで、柔軟なシステムが早期に実現すると感じます。もちろん、Java3DとOpenCVを大いに参考にします。これらも大きな力です。
 
 モデル構築のAPIとしてはJava3Dに習うのですが、CubeとかCylinderとかのジオメトリを基本にするのですが、凸多角形も実現していく。
 これらは基本的に位置(0,0,0)に作成され、上下も決まっています。向きとかジオミトリの関係とかはTransformGroupという接着部分で定義します。Java3Dは図形を表示するのが専門で、頭があって、手があってという人体をオブジェクトとして把握する機能はありません。ジオメトリの接続という概念はないのです。ここのところを拡張していくことになります。つまり接続情報を登録できる大きなクラスをもうけて、それでオブジェクトのTransformを自動計算して求めていく・・・というようにすることです。PositioningGroupというようなオブジェクトですね。
 

おわり