論文紹介ーpaddingによって死角が生まれるー

### どんな論文？
論文中では信号機の誤検出がなぜ起きているかが示されている。
[論文](https://openreview.net/pdf?id=m1CD7tPubNy)

### まとめ
paddingがfoveationを発生させる⇒foveationが発生した状態で学習すると非対称なfilterが生成される⇒非対称なfilterで畳み込むと特徴マップに空間バイアスが発生し、死角などが発生する⇒小さいワークなどの見落としにつながる。

画像の入力サイズが不均一なpaddingの適用、foveationを発生させる為、式(1)を考慮する必要がある。
paddingの種類によってもfoveationの発生の仕方が異なるため、求められる検出精度によってはpaddhing方法を検討する必要がある。
paddingのfoveationへの影響をfoveation mapを使うことで把握することができる。

### 課題 / 問題
赤丸で囲った信号機の検出率が位置が微妙に異なるだけで異なることが課題とされてる。（下記図はSSDで信号を検出した場合）
左の画像（少し上に移動された画像）は44％、真ん中の画像（基本位置）は7％と非常に低く、右の画像（少し下に移動された画像）だと82％も検出できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/30f1118e-c780-7095-74bc-743a7ea9a090.png)

検出率のスコアをプロットしてみるとpaddingがない場合は上部のほうに検出率が非常に低い横線が現れている。mirror paddingにするとこのような死角は現れない。paddingが死角の出現に関係しており、

誤検出につながっている模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/eeb2f7c3-18dd-fcb9-cdd3-0b3831613ee7.png)

特徴マップにも黒い死角が出現している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/61840e16-c46a-281c-51e2-0cb66d069fca.png)


また、SSDは各バウンディングボックスに対して、背景らしさと信号らしさのスコアを出している為、visualize化すると下記のようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/9fb63b7c-49fe-87e8-0933-e7ec4ab06e31.png)

### 空間バイアスの発生
フィルタの非対称性が特徴マップの空間バイアスを生み出している様子を紹介。

まずは、特徴マップ上の空間バイアスをvisualize化してみた。
0paddingされた画像（初期値0）を入力して各層の特徴マップを見てみると、最初は画素が0ですべての画素がバイアス分増加している為偏りはないが、2番目の特徴マップでは左側の境界だけが他よりも値が低く、他の境界は値が高くなっている。初回でバイアス分増加してした画素が入力になっており、filterの重みの影響で出力に偏りが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/0b898db5-329c-02ce-e10c-9fe8bfda727a.png)

では、次にfilterを見てみる。
Figure3は各層のカーネルを平均したものである。L1の平均3*3フィルタは左側がnegativeな重みで下側がpositiveな重みになっている。
これはRELU1の現象と一致している。フィルタの非対称性が特徴マップの空間バイアスを生み出していると考えられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/fd666657-9b90-2532-0390-0637b222caa9.png)

また、RELU8ぐらいから、偏りが内側にprppagateしてきている。これは図1に似ている。

では、なぜfilterの非対称性は生まれるのか？

### なぜpaddingが必要か？
なぜfilterの非対称性は生まれるのか？の答えはこの後出てくるが、先に言っておくとpaddingが影響している。
その前にpaddhingがなぜ必要かをおさらい。

①特徴マップのサイズ維持
②境界の特徴も畳み込まれるようにする
パディングがない状態だと境界の画素は周りの画素に比べて畳み込まれる回数が少ない。
以下の図のof conv ops each pixel is involved in(a~iがそれぞれ何回利用されるか)を見ても境界付近は畳み込まれる回数が少ないのが分かる。
パディングをつけることで畳み込まれる回数の偏りが解消されている。

VALIDパディング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/cbb1d194-671b-58dd-7d90-90dbd7ecaae8.png)

SAMEパディング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/6804e6f1-bdfb-df79-d2b1-fbd40e01b897.png)

### パッディングの不均一な適用の排除
ダウンサンプリングにpaddingを使うことで境界に対するバイアスを減少させることができるが、CNN内部で非対称を引き起こすことにつながる可能性がある。

図6(a)では3ｘ3stride2のフィルタでダウンサンプリングした場合に左側のpaddingは含まれるが、右側のpaddingは含まれなくなってしまう。
この現象により、Input Sizeが224*224の場合は非対称なフィルタが生成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/57bdea29-abf9-b797-ab4b-ea18e6d9b100.png)

このような非対称なフィルタを生まないためには下記式を満たす必要がある。
(hi,wi)はi番目の層の出力形状、
khi×kwiはカーネルサイズ、
(shi,swi)はストライド、
(phi,pwi)はパディング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/50084e85-6603-fbfc-4865-737444f4886e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/58af1407-8a14-4acc-0ead-dd5a93f5bd73.png)

結局、入力画像の縦h0と横w0が下記式を満たせばよく、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/74ccf6df-cacc-bab5-258b-474a155bbb58.png)
ResNetの場合、5回のダウンサンプリングがあるのでd=5,w5:畳み込み5回目の画像サイズは8*8の64であるため、w0=2^5(8-1)+1=255となり、入力画像サイズが255*255の時は非対称なフィルタが生成されない。実際、図6(b)で入力サイズが255*255の時は非対称なフィルタが生成されていない。

また、画像サイズを255*255にすることで精度の向上も見られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/40f3ba47-14b2-d235-fc4b-31653c16b025.png)


### パディング機構とfoveation
foveationとは、畳み込み中の入力画素の不均等な関与のことを意味している。
最終出力特徴マップに与える影響が画素の位置によって異なるということ。

論文中ではpaddingがfoveationにどのように影響を与えているかを示している。
foveation mapというものでpaddingの影響をvisualize化して説明しいる。
foveation mapは畳み込み中に何回その画素が使用されたか（最終層に伝播したか）をカウントして、使用回数が多いと黄色、少ないと青として表示している。入力画像の画素をすべて１に割り当て、最終的な畳み込み層の特徴マップの各画素の値を表示している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/66ca83f4-7fcc-11b1-e9ee-17f53f068e7a.png)
図7(a)ではpaddingがない場合ではfoveationが大規模に発生していることが分かる。
これは、画像が縮小しているために周辺の情報は最終出力まであまり伝播されていないことを意味する。

VALIDパディング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/cbb1d194-671b-58dd-7d90-90dbd7ecaae8.png)


FULL2px 0パディングではfoveationは発生していないが、畳み込みのたびに出力サイズが拡大してしまう。

SAME1px 0パッディングではfoveationは比較的抑えられている。画像サイズが大きいほど黄色いエリアの割合は増加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/6804e6f1-bdfb-df79-d2b1-fbd40e01b897.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/014f1a5a-4e46-0f64-843b-5d5ff89c13e8.png)

(b)のMirrorパディングはパディング領域を境界のピクセルをミラーリングすることで埋める為、すべての入力画素が平等に畳み込まれるため均一なMapになっている。

Mirror(SYMMETRIC)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/8d6321b4-c011-19d0-4cea-e607c2074058.png)
aの箇所も他の箇所と同じく9回利用されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/ed487dd2-277e-f26c-9ea1-8eba92915368.png)


Mirror padding(REFLECT)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/0e08a3c6-98cf-803e-8351-132406c7ad65.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/d446b23b-3302-0e5b-79c3-9efdcc5d1e50.png)

Replication Padding
内側の使用回数が少なくなる。paddingを境界の値を複製して埋めるためこのようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/90956046-7b99-e74f-b7a8-ca4d36642fed.png)

Circular Padding
foveationは発生していない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/d52260fd-0570-ff63-c0c8-7c6817ffc2df.png)

Partial Convolution
畳み込み領域における、0でない領域の割合を重みとして適用する手法。
画像の欠損の修復などに使われているらしい。 [参考①](https://woodyzootopia.github.io/2018/12/%E8%AB%96%E6%96%87%E8%A7%A3%E8%AA%ACpartial-convolution/) [参考②](https://qiita.com/saneatsu/items/da06e8632c7f5ba65279)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/dd70b9bb-612f-3e31-b8f8-b02404bc327c.png)

padding領域は欠損しているとして0として扱う。
結果はMirror(REFLECT)の場合に似ている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/571fcaaa-987c-3927-c8e9-ae84b479ab7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/20ff1661-214f-e3f8-3e97-32d07c4cacaa.png)

#### 入力画像サイズの影響
図7(e)は式（1）に反しているため、下側と右側に偏りが生じている。

ResNet50で257*257時は左右上下対称な0paddingをして左右上下対称なfoveation mapができているが、256*256（式（1)に反した画像サイズ）では上と左にしか0paddingしていない場合では右側と下側の情報がうまく伝播されていないために、右側と下側に偏りが生じたfoveation mapができている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/606a6884-88c5-94d8-3d15-cc431f452d42.png)

#### dilationの影響
図7(c)dilation factorを2にした場合、foveationの範囲は2倍に拡大する。
5*5filterの9か所を参照することと同じであるため、境界は3*3のときよりも使われにくくなる為、foveationは拡大する。

#### strideの影響
図7(d)のようにkernelサイズがstrideより大きいときはチェック模様が出現してしまう。
strideでかぶってしまう箇所だけ多くカウントされてしまうため。

### まとめ
paddingがfoveationを発生させる⇒foveationが発生した状態で学習すると非対称なfilterが生成される⇒非対称なfilterで畳み込むと特徴マップに空間バイアスが発生し、死角などが発生する⇒小さいワークなどの見落としにつながる。

画像の入力サイズが不均一なpaddingの適用、foveationを発生させる為、式(1)を考慮する必要がある。
paddingの種類によってもfoveationの発生の仕方が異なるため、求められる検出精度によってはpaddhing方法を検討する必要がある。
paddingのfoveationへの影響をfoveation mapを使うことで把握することができる。


### 参考
[参考](https://ai-scholar.tech/articles/image-recognition/BLIND_SPOTS)