「いまの物体認識には何が足りないのか」への追記

[いまの物体検出には何が足りないか
](https://qiita.com/nonbiri15/items/40267740b647b0465ba7) を先に書いた。

その記事への追記を書く。

まず、インスタンスセグメンテーションの検出プログラムをベースに考えるべきこと

インスタンス セグメンテーションの Mask R-CNN 入門
https://jp.mathworks.com/help/vision/ug/getting-started-with-mask-r-cnn-for-instance-segmentation.html

https://github.com/matterport/Mask_RCNN#mask-r-cnn-for-object-detection-and-segmentation

https://gilberttanner.com/blog/getting-started-with-mask-rcnn-in-keras

[Building a Mask R-CNN from scratch in TensorFlow and Keras](https://towardsdatascience.com/building-a-mask-r-cnn-from-scratch-in-tensorflow-and-keras-c49c72acc272)


pdf [Deep Learning for Generic Object Detection: A Survey](https://shinya7y.github.io/note/detection/ObjectDetectionSurvey_jp.pdf)

### Pose推定というのは、人について有効。
Pose推定の場合には、人のボーンの位置がわかるので、単なる人検出よりも得られる情報が多い。
インスタンスセグメンテーションで人検出ができても、どこが頭部で、どこが手足かをインスタンスセグメンテーションだけではえることができない。
人の姿勢の情報を得ようとしたら、Pose推定というのが有効だ。
Pose 推定も、各種プラットフォームで利用可能になっているので、人の状態を理解したいならば、利用したい機能だ。

## 単眼画像でdepthが得られるということ
- 単眼画像でdepthが得られるということは次の意味でもある。
- Depthの勾配がわかるということは、表面の法線ベクトルの向きがわかるということ。
- 物体の形状がわかるということ。
- 画像の輝度値の要因、物体形状・物体表面のテクスチャー・照明条件のうち、物体形状の成分を解釈できているこということ。
- 物体表面のテクスチャ・照明条件についての知見が、Depthが得られる以前に比べて改善している。



## インスタンスセグメンテーションはdepthで改善する。

- 画素値からオブジェクトを直接検出するよりは、depthの推定結果を用いるとobjectのインスタンスセグメンテーションが改善する。
- 物体の検出は、物体のdepthがわかれば、凸物体の領域が抽出されやすくなる。そういう条件では、物体表面でのテクスチャの種類や、照明条件による影響を受けにくくなる。




## 単眼画像からのdepth推定、Optical flow からのdepth推定でも奥行きはわかる。

## ステレオ計測の原理で、人はdepthを推定していない（ように思う）。

## 両眼視をしない哺乳動物も多い。
とすれば、両眼視をしない哺乳動物でもしているはずのDepth推定の仕組みの方が、脳の仕組みに組み込まれている可能性が高い。

### 両眼視の視差＝右目画像と左目画像とを切り替えたときのOptical flow

Optical flow に基づく空間の把握を使って、両眼の視差に基づく奥行きの認識をしているのではなかろうか。

なぜならば、両眼視をしない哺乳類で出来上がっている奥行きの認識メカニズムがあるのに、両眼視をする哺乳類用で新たな認識メカニズムの脳内のネットワークを新たに別個に作っているとは考えにくい。


ステレオ計測の技術を用いて、奥行きの推定を実施した際に、人はこのような流儀をしていないだろうと思った。
#### 人はステレオ計測の原理では奥行き認識をしてないと思った理由：
- 網膜上の視細胞の分布は均一ではない。イメージングセンサーのような一様な分布をしていない。
- ステレオ計測の場合には、右カメラと左カメラのpixelの対応点を水平方向に何pixelをずらしたら一致するかという手法を用いる。しかし、人の網膜の場合だと、水平方向への移動量を網膜ベースでは比較できない。
    - 人の眼球は絶えず微妙に動いている。
    - 人の網膜の中で、水平方向への移動量などという量を持ち得ない。
    - 網膜上の画像には、「ステレオ平行化」されていない。
    - 眼球は絶えず移動しているので、「ステレオカメラ」の両眼の向きを固定していない。

- ステレオ計測の場合には、「ステレオ平行化」された左画像と右画像で、視差を得るのが一番の基本の処理である。
    - このためには、左画像と右画像との対応点のマッチングで計算量が多い。
- 脳の仕組みでは、左画像と右画像は別々の脳半球で処理されている。
    - そのため、それぞれの半球をまたぐ情報のやり取りは脳の仕組みでは高い演算コストがかかる。
    - 視差画像をpixel 単位で計算するステレオ計測の仕組みは、脳の構成では考えにくい。

- そのような演算量の多い処理が、脳のネットワークで新たに生じるとはかんがえにくい。
- 生物の進化は、新たな機能を持つ新たな器官が生じることはない。
    - 既存の器官を新たな用途で使い出すことで進化がおきている。
    - 羽毛は、飛翔のために発生したのではなく、保温のために発生したものが、飛翔のために転用されている。
    - 骨の軽量化は、飛翔のために必要ではあるが、それ以前に、恐竜がその体を維持するために、強度的に十分な部分では、軽量化する必要を生じている。その軽量化が、鳥類への進化につながっている。
    - 体重を支える部分は後足に任せる体のバランスをとる仕組みは、恐竜の状況で既に実現している。

- ステレオ計測の仕組みの神経回路が、人の脳内にあるようには思えない。
    - 交差法・平行法という視野と目との対応関係の違うステレオ視の仕方がある。
    - もし、ステレオ計測のように、視差の算出において固定の回路があるとしたら、交差法・平行法などのような異なる流儀に対して柔軟に対応できるとはおもえない。

## Optical flowベースならば可能だとする理由
- 網膜に生じる画像は、眼球の動きで絶えず動いている。
- それから眼球の動きを意識しなくてよい階層で画像認識するレイヤーがある。
- 網膜の分布は、一様な分布ではない。そのため、網膜上の画像は歪んでいる。直線が直線とは見ていないはず。
- しかし、人の認識機能では、直線が直線として認識できている。
- その階層では、Optical Flowの認識ができている。
- Optical Flow の認識をしている階層では、直線的な動きは、直線として認識される。
- Optical Flow の認識では時刻の異なる画像の理解の際に、対応点マッチングをしているだろうと推測される。その対応点の移動量でOptical flow の向きと大きさを算出しているはずだ。
- Optical Flow の認識でならば、「ステレオ計測」で必要とする仕組みが既に準備されている。
    - 眼球の動きを無視できる。
    - 直線を直線として認識できる。
    - 対応点マッチングの仕組みがある。
    - 自らの動きによって生じるoptical flow の大きさを、空間の奥行き情報に解釈する仕組みが既にある。

- Optical flow での空間認識と、両眼視からの空間認識との違い。

Optical flow ベースでは、一方の眼球由来の対応点の時系列の変化で見つける。
両眼視の場合だと、時系列の変化に、左画像と右画像とを入れ替えれば、Optical Flow を計算する仕組みで、視差を算出できる。

生物での進化が、新しい機能の実現は既存の仕組みへの新しい使い方によって生じているという経験則にも合致する。

## 単眼でのOptical flow での空間認識では不十分な理由
単眼でのOptical flowの算出は可能で、それによって空間の理解は可能ではある。
しかし、単眼でのOptical Flow での理解では残ってしまう課題が、その動いているものは、すれ違う物体の動きなのか、自分にぶつかりうる動きなのかを単眼でのOptical flow では区別できない。
単眼でのOptical　flowの世界には、寸法が存在しない。
そのため、寸法を与える仕組みが必要になる。

## 左右の異なる視野は、寸法のない世界に寸法を与える。

- 左右の目の視野の重なりの少ない動物は多い。
- そうであっても、左右の目の視野には必ず重なりを持っている。
- そのことで両眼視が可能な領域は少ないにせよある。
- 両眼の目間距離は、ステレオ計測の基線長として、寸法を与える基準になる。
- Optical flow だけの世界では、距離の概念がない。
- それが左右の目によって両眼視ができる範囲については、寸法の基準がある。
- そのことで、両眼視ができる範囲については、Depth推定（奥行き推定）を検証するデータが得られる。
    - つまり、両眼の視野が重なっている部分を目的の対象物に向ければ、奥行きの推定の精度を上げることができる。
    - シマウマがライオンを見つけためには、視野が広いことで見つけること有利になる。
    - しかし、ライオンがどれくらいの距離にいて、急いで逃げなきゃいけないのか、急いで逃げるほどの距離ではないのかを見定める必要がある。
    - その判定は、まさに生死にかかわる問題だ。
    - ライオンの方に顔を向ければ、両眼視できる範囲で見ることで、距離の見積もりができる。
    - でも、それで大丈夫だろうか？
    - ライオンが見えたら常に顔をそちらに向けないといけないとしたら、落ち着いて草をはむこともできないだろう。
    - 両眼視できない範囲であっても、ライオンへの距離の概算がしたいはずだ。

### 寸法を与える他の要因
- 人の腕を前に伸ばしたときの指先までの距離
- 床からの視線の高さ
この２つも、人の空間理解で寸法の基準を与えるだろう。


## 単眼の画像でのDepth推定が深層学習によって可能になってきている。
- 単眼の画像で奥行きが推定が深層学習で可能になってきている。
- それと同等なことを動物が行うためには、奥行きを推定するための教師データが必要になる。
    - 両眼視可能な領域から推定される視差（とそれから見積もられる奥行き）が、単眼での奥行き推定の教師データになる。
    - 両眼視可能な領域について、深層学習での推定した奥行き（＝奥行きの予測値）と視差に基づく奥行きとを比較し、その推定誤差が小さくなるように学習をしていくことが可能になる。
    - Optical flow で空間認識をする状況では、直線を直線として認識できる空間認識を作り上げているだろう。
    - そうすると、頭部の向きを変えて視界を移動させたときに、空間の理解が整合性がある仕組みが作られているはずである。
    - そうすると、両眼視できていない視野の範囲についても、奥行きの予測値をもつことができるようになっているはずである。
    - （ヒトの場合でも、眼帯を片目にした状況でも、通りを歩く人物への距離を両眼視している状況と同じように見積もることができる。）
    - おそらくは、シマウマにとっても、両眼視できない範囲の視野についてもライオンまでの距離を見積もれるはずであり、見積もっているに違いないと推測する。）



## インスタンスセグメンテーションにしても、静止画で理解するのはどこか違う。

- 生き物が物体を認識する際には、だれも「正解枠」や「カテゴリ」を教えてくれない。
- 生き物が物体を認識するのに、機械学習の一般物体認識の枠組みは、正解データを与えてくれることを前提とする。
- 生き物は、勝手に学習するし、忘却もする。
    - [助けて！　チンアナゴが人の存在を忘れそう　すみだ水族館で初の試み](https://www.itmedia.co.jp/news/articles/2004/28/news100.html)
    - 野生のチンアナゴは、人の顔を見ることはない。
    - 勝手に学習して覚える仕組みが、既に魚類の時点で持ち合わせている。
- 一方、AIを称する一般物体認識は、多数のアノテーション済みの学習データを必要とし、勝手に覚えることができない。
- 一般物体検出が、矩形の検出枠ではなく、pixel単位のインスタンスセグメンテーションで与えられて学習し予測するすることはできる。
- しかし、その正解データを人がアノテーションをしている限りにおいては、チンアナゴの知能にさえ及ばない。

## なにが不自然なのか

- 生き物が物体を認識するのは、静止画という時間のない空間ではなくて、時間的な変化をともなう視覚情報の中である。
- そのため、その視覚情報は、絶えず時間的に変化するものである。
- 変化は基本、optical flow を生じる。
- optical flow の変化は、Optical flow の大小関係や向きとかを生じる。
- そうするとOptical flow の変化によって、画像上の領域は、領域分割されるようになる。

### 対象物が移動する場合
- 対象物の移動にともなうOptical flow が顕著な領域が生じる。
- それが対象物の領域だ。
- 相手が捕食者の場合だと、その領域は自分に襲いかかるものだから、早く逃げないと行けない。
- Optical flow で領域抽出された領域は、その対象物のシルエットだ。
- 自分に襲いかかる捕食者のシルエットがわかったら、そのシルエットを繰り返し見ることで、捕食者のシルエットとエサのシルエットをとを区別できるようになる。
- インスタンスセグメンテーションの正解領域は、optical flowでの顕著な領域だ。



![dance.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/ff8ca393-ecce-2a89-6b8c-1f4e265b98ce.gif)


密なOptical　flowの計算結果の例（次のgithub から引用 
https://github.com/ppliuboy/SelFlow
 )
### 自分が移動している場合
- 自分が移動している場合でも、optical flow の動きは有効な情報を含む。
- 近距離の物体は、optical flow の大きさが大きい。
- 自分の近くに物がある場合、自分が動くことで近距離の物体がoptical flow が大きい領域として領域抽出される。
- つまり、近距離の物体が物体として意味のある範囲を、領域抽出される。
- ここでも、optical flow がインスタンスセグメンテーションをする際のヒントとなる。

- この場合でも、近距離のものとして領域抽出されるとともに、自分の左右への移動によって生じるoptical flowの大きさの違いで、Optical flow の大きい側と小さい側への順序が生じる。
- この順序が、近距離側と遠距離側への正解データとなる。
- これによって、物体の領域抽出がされるとともに、その物体の奥行き情報がoptical flowによって得られる。
### optical flow ベースの検出
- このような領域抽出の結果を分類することができれば、未知の物体についての検出が可能になる。
- 視覚が静止画ではなく、上記のような、対象物の移動によるoptical flow もしくは自分が動くことによるoptical flowをベースとして領域検出がされれば、領域抽出された領域に対する検出さえすればよい。
- 一般物体検出にある候補領域の選択は、optical flow ベースの認識においては省略できるのではないか。

### 画像を取得した時点の状況ではなく、"今"の状況を知りたい。

- optical flow を計算する利点は、時間変化を含んでいるということだ。
- 時間変化を元に、微小な時間を経過した状況を外挿できる。
- 微小時間経過した状況での推定値の検出位置を、"今"の状況とみなすことができる。
- もちろん、単純な外挿がそのまま役に立つとは限らないが、微小時間経過後の"今"の状況については、あとで、実際の検出位置が入ってくる。
- その２つを比較することで、推論の妥当性を検証することができる。

### 深層学習で、微小時間経過後の状況を予測する枠組みは実際に作られだしている。

[深層学習機に予測符号化仮説を組み込み、自然な景色を学習させただけで深層学習機が『蛇の回転錯視（北岡明佳博士考案）』の回転知覚の再現することを発見した](https://www.nibb.ac.jp/sections/neurobiology/watanabe_e/)

[予測符号化 (predictive coding) とは何か]
(https://omedstu.jimdofree.com/2018/08/17/%E4%BA%88%E6%B8%AC%E7%AC%A6%E5%8F%B7%E5%8C%96-predictive-coding-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B/)


github [Deep Predictive Coding for Multimodal Representation Learning]
(https://github.com/thefonseca/predictive-coding#deep-predictive-coding-for-multimodal-representation-learning)

予測符号化のコードがgithub 上に存在する。

## 生成モデルは必須。
- 不十分な視覚情報から、つじつまのあう解釈にそった生成モデルの結果を見ている。
- 人の網膜の視細胞の分布は偏っていて、着目している部分以外は、分解能が高くない。

関連記事
[予測符号化モデルについて調査中](
https://qiita.com/nonbiri15/items/b4e041c99572b5ddf5c3)