カメラと推論アクセラレータの共進化

## 被子植物と昆虫の共進化 
生物の進化についての最近の理解を読む。

- おおむかしの話だ。植物は裸子植物で、目立たない花を咲かせ、花粉を風まかせで受粉をしていた。昆虫は既に空を飛んでいたが、花に蜜はなく、チョウやハチが花の蜜を吸うこともなかった。裸子植物の花なので、花弁がなく、地味で目立たないし、蜜もない。
- ある時点で、昆虫が花を訪れ、花粉が昆虫の体につく、それが同じ種の別の花に訪れた際に、受粉に成功する。
- そうすると、昆虫が訪れる花の方が、風媒花よりも、受粉に成功しやすくなっていくという現象が始まっていく。
- 受粉に成功しやすい形質は、遺伝を通じて次の世代に伝わっていく。
- そうすると、昆虫が訪れやすい花、蜜を出す花の方が、蜜を出さない花よりも、昆虫による受粉が成立しやすくなる。
- さらには、昆虫の視覚で見つけやすい花ほど、受粉が成功しやすくなる。
    - 昆虫は、視覚系が花を見つけやすく、蜜にたどり着くことに優位な形質をもった個体が残りやすくなっていく。
- 受粉の成功率をあげるには、同じ種類の花を積極的に選んで昆虫に訪れてほしい。
- チョウのストローのような口でないと吸えない花の作りは、特定の種類の昆虫だけをおびき寄せるようになる。
- また、ストローのような口になったチョウは、食べられるもの、蜜を吸える花の種類が特定の花に偏っていく。
    - ストローのような口になっていく変化は、花の形状の変化とチョウの口の形状の変化が同時に進行していったと予想される。
- 特定の花と特定の昆虫とは、相互に依存しあっていく状況になっていく。

（いけない。目的論的な表現が残ってしまっている。書き直さなくちゃ。）

被子植物（花の咲く植物）と昆虫とは、共進化してきたということだ。
### 昆虫側の利点:
- 植物は、花を咲かせ蜜を出す。その糖分に富んだ蜜を得ることで、昆虫は効率的に栄養を摂取できる。
- 花は、昆虫の視覚でも区別の付きやすい色をしている。
- 花には香りがあることで、同一の種類の花を遠方から探索しやすい。
### 被子植物側の利点：
- 昆虫は、蜜を求めて花を訪れ、結果として花粉を雌しべにつけて、植物の受粉を助ける。
- 植物の側は、同じ種類の花を選択的に、昆虫が訪れてくれたほうが、受粉の成功率があがる。
### 共進化がもたらしたもの
そのため、花は、同じ種類の花を見つけやすくなるように、色や形状や香りの多様性を**結果として**増やしてきた。
昆虫の側は、花の色や形状や香りを区別できるように**結果として**進化してきた。
僕たちが、美しい花を見て、おいしい果物を食べられるようになったのは、被子植物と昆虫との共進化のおかげなのだ。


----

## この文章で述べたいこと
- カメラと推論のアクセラレータにも共進化があると考えていること。
- あなたのビジネスが、別の組織と共進化するようでありますように。

## OpenCV のステレオライブラリ以前
そのむかし、まだOpenCVはなく、ステレオ計測は研究室ごとの秘伝のような状況だった。
デジタルカメラやUSBカメラの普及は、ステレオ計測を加速させていった。
大学で提供されていたステレオ平行化済みの左カメラ画像・右カメラ画像では、そこそこの結果を与えてくれた。
しかし、自前カメラで画像を撮影し、自前のステレオ平行化で、よい結果を出すのは簡単ではなかった。

## OpenCV のステレオライブラリの充実
（OpenCV(ver 1.0) の公開は2006年）
- OpenCVのステレオライブラリの凄さは、ステレオキャリブレーション（＝ステレオ平行化のためのパラメータの算出）の手法が提供されたことだ。
- ステレオカメラの画角の全域にわたって、0.1 pixel 程度の精度で特徴点の対応付けを成功させる方法が標準化された。
- これによってOpenCVのライブラリでのステレオ計測が普及していく。
- 適切なカメラを用意できれば、だれでもが、ステレオ計測をできるようになった。
(ただし、実行速度は別に残る。)

## GPGPUの登場とOpenCVでのCudaへの対応
[CUDA 1.0の提供開始は2007年7月](https://ja.wikipedia.org/wiki/CUDA)

従来ゲームなどのグラフィックの強化だけに使われていたGPUが、
行列演算を多用する分野に使えることが広い層で認識されて、cuda言語が作られ、
OpenCVもCuda対応をしていく。
これによって、ステレオ計測の実時間での運用が、誰にでも可能な世界に突入した。

## キャリブレーション済みのステレオカメラモジュールの登場
（[StereoLabs 創業　2008年](https://www.stereolabs.com/about)）
- キャリブレーション済みのステレオカメラモジュールが提供される状況となった。
- OpenCVのステレオライブラリをNVIDIAのGPUを前提としてリアルタイム動作する。

## エッジデバイスの登場
- [Nvidia Jetson TK1の発売 2014年](https://ja.wikipedia.org/wiki/NVIDIA_Jetson)

## 移動ロボットを前提とした機能の追加
- ドローンも含め各種移動ロボットが増えていく。
- そのような中で、ステレオカメラにあると便利な機能が明確になっていく。
- カメラの姿勢情報がわかるように加速度計などが加わっていく。

## 物体検出の変革 YOLOの登場(2016年)
- [AlexNet 2012年](https://ja.wikipedia.org/wiki/AlexNet)
- [You Only Look Once: Unified, Real-Time Object Detection](https://arxiv.org/abs/1506.02640)

## StereoLabs ZEDへの対応が画像認識ソフトウェアにも進む。
- 物体検出ソフトウェアをステレオカメラと組合せて利用したいことは誰もが思うことだろう。
- 物体検出ソフトウェアを書く側では、何かしらのステレオカメラを想定して、そのカメラでの性能を検証したい。
- どのステレオカメラでもうまくいくなんてことは、できればいいに越したことはないが。
- そんな無謀な期待はしないことだ。
- だから、いまの時点で、品質が安定していて、入手性がいいステレオカメラを選んで、それを使う想定で、物体検出側のソフトウェアを書く。
- cmakeの設定の中で、zedへの対応をするのかどうかという設定が追加になっていた。

## StereoLabs はNVIDIAのGPUに特化することで得た利益
- ステレオ計算のロジックをOpenCVに任せたことで、開発のリソースをステレオカメラのハードウェアに集中できるようになった。
- 計算のアクセラレータをNVIDIAのGPUに任せたことで、計算リソースの問題を考えなくてよくなった。
- NVIDIAのGPUが利用できる環境だけをサポート対象としたことで、それ以外のユーザーへの対応の必要性をなくした。
## NVIDIA側が得た利益
- すぐに使えるステレオカメラモジュールがありますと、そのプラットフォームの魅力を伝えることができる。
- ドローンに使えるカメラとボードの組合せとなっている。Jetsonの開発キットのボードでは、wifi接続が購入直後からできるようにまでなっている。
- そのことで、自律移動ロボットが格段に使いやすくなった。
- StereoLabs のステレオカメラを使ったものは、製品版の実装をボードを起こすときでもJetsonのチップを用いるだろう。

## StereoLabs とNVIDIAとが作り上げた成果を利用するユーザーの視点
 - NVIDIAのデバイス上で、StereoLabsのカメラを使うということで、接続性・利用勝手が検証されたカメラを使うことができる。
- そのため、自分たちが開発したい部分にすぐに着手できる。
- カメラが**電気的に接続できることとカメラが認識・制御できることとは別物**。
- カメラパラメータが安定しているということもうれしい。
- もし、自作のカメラモジュールで、熱変形や経年変化の影響を減らそうとしたら、機構系エンジニアの協力を得たうえで設計することになるだろう。
- ステレオ計測を実施したい。視野角も広くしたい。それをするためには、イメージセンサ・レンズモジュール・固定方法・キャリブレーションの実行方法、それら全てを自前で実行しなければならなくなる。
- カメラのタイムスタンプは重要で、そのときの姿勢情報とカメラの点群との対応付けが、移動体ロボットでは重要であることが分かるだろう。
- それらの情報は、3Dカメラの撮像時点で取得しなければ対処方法がないのだ。
- だから、エンジニアは、そういった3Dカメラを選ぶ。


## カメラモジュールと推論エンジンの共進化
- このようにカメラモジュールと推論エンジンとは共進化の関係にある。
- 共進化の関係にあるので、相手が進化したことの利点を自分の利点とすることができる。

### ステレオカメラモジュール開発側の利点：
- 深度の計算や、その他の画像認識の計算にGPUを使っている。
- 計算のための環境をGPUと固定できる分だけ、コードのメンテナンスが簡単になる。
- GPUデバイスは、GNUのメーカーが演算性能を上げてくれるので、それにのっかればいい。
- カメラのSDKを作る場合にも、依存するライブラリを固定できる分だけ開発が楽になる。
- （OpenMP とCudaとOpenVinoの全てに対して最適化したライブラリを開発したいですか）

### GPUデバイスメーカー側の利点：
- 自社のGPU環境での動作を検証してくれているステレオカメラモジュールが提供される。
- そのステレオカメラモジュールの購入者は、そのGPUメーカーのボードを必ず購入してくれる。
- 自社のプラットフォームに特化したステレオカメラ開発者は、ちょうど、特定の花と特定の昆虫とが共進化をしているのと同じような関係になる。

### ステレオカメラモジュール開発側のさらなる利点：
- GPUという特定のアクセラレータを選んでいる時点で、そのGPUという特定のアクセラレータ上にある各種ライブラリ群は、使える前提で、自社のライブラリ上のサンプルアプリケーションを作れる。
- そのため、用意できるサンプルアプリケーションの数は格段に増える。
    - 例 : [Stereolabs Docs: API Reference, Tutorials, and Integration](https://www.stereolabs.com/docs)
    - 
- ユーザーからの問い合わせも、前提とする環境だけに限られるので、ユーザーサポートも大幅に単純化される。
- Raspberry Piを使ってステレオ計測できますかというのに対してサポートしなくて済む。


### エンドユーザー側の利点
- 安定した品質の3D計測カメラが入手でき、利用するCPU/GPUボードが予め用意されている。
- 特定の花と特定の昆虫が共進化した結果生み出された果物に、ありつくことになる。

## それ以外のステレオカメラメーカーの目指す道
- StereoLasの品揃えでカバーされていない領域でのステレオカメラを目指すこと。
- 奥行きを計測可能な範囲、またその精度。
- 車載などの屋外を目指すのか、工場での作業を目指すのか。
- 3D計測までで勝負するのか、さらにその上のアプリケーションで勝負するのか。
- タイムスタンプ・IMUは不可欠。
- どういった最終ユーザーがどういった目的のために、どのくらいの数量を利用するのかを想像しよう。
- ステレオカメラメーカー自体が、推論アクセラレータを自作するのは非現実的だ。
- 推論アクセラレータとの関係を作ろう。
- そのなかでビジネスを構築しよう。

# まとめ
- 3Dカメラと推論アクセラレータ、画像認識のアルゴリズムも、共進化が期待される。
- 3Dカメラは、安定した品質の画像と3D計測結果を提供する。
- 成功した推論アクセラレータは改良が継続する。
- 画像認識アルゴリズムは、安定した品質で供給をされているカメラ・推論アクセラレータの組合せに対して、その実装が進む。
- さらにそれらをベースとしたアルゴリズム・利用方法が拡大していく。