論文まとめ：Learning a Discriminative Feature Network for Semantic Segmentation

#はじめに
来月開催されるCVPR2018のHP内、main conference
http://cvpr2018.thecvf.com/program/main_conference
の中にsegmentation関係の論文があったので、arXivで検索して読んでみた。

[1]C. Yuらの「Learning a Discriminative Feature Network for Semantic Segmentation」
https://arxiv.org/abs/1804.09337

#概要
semantic segmentationは以下２つの問題を抱えている。
### １）intra-class inconsistency
同じクラスの物体なのに違うクラスの物体と判断してしまう問題
<img width="818" alt="intra_class.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/ed0075a6-ead9-e949-3fa6-74513b34a0b8.png">
[1]のFigure 1より
この図の(b)において、左下の領域は同じ牛（緑）の一部にも関わらず、馬（ピンク）と認識されている。

### ２）inter-class indistinction
異なるクラス間の物体を同じクラスと判断してしまう問題
<img width="819" alt="inter_class.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/6c14aeaa-580c-9012-a4e3-c30093386d92.png">
[1]のFigure 1より
この図の(e)においてパソコンの本体がTV-monitorと認識されている。

###作成したモデル
上記２つの問題に対応するため Discriminative Feature Network というものを作った。具体的には以下の２つを含むモデル。

１）intra-class inconsistency の対応策として Smooth Network。

２）inter-class indistinction の対応策として Border Network。

# アーキテクチャ
### 全体像
全体像はこんな感じ。
<img width="543" alt="DFN_fig2_left.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/1ae89932-4d8e-322b-ee79-fad122197ed2.png">
[1]のFigure 2より
このうち、以下の青い矢印部分に注目すると、
<img width="570" alt="whole_net.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/486340b4-d5cb-4cb3-ab16-01ac94e5fde7.png">

encorde して decordeしてる。それに対してshort cutの経路があるので U-Net等の構造に似ている。

### RRB(Refinement Residual Block)ブロック
この中でRRBと書かれてるブロックは以下。
<img width="426" alt="DFN_fig2_RRB.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/8ae8113c-b509-3dc5-3e07-4953cfd62196.png">

はじめに1x1 convで畳み込む。それを二手に分け、下側の経路ではそのまま流し、上側の経路では3x3conv、BN、Relu、3x3 convで特徴量化。両者を足してReluする。

element wiseで足すのでResNetのResidual Blockのように上側の経路が残差となる。これがより高次の特徴量で、下側の経路は位置的な情報か？

### CAB(Channel Attention Block)ブロック
CABと書かれたブロックは以下。
<img width="422" alt="DFN_fig2_CAB.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/f3792c40-0084-8a09-c5d9-08798fbf7b07.png">

下からより高層から来た広範囲でより高次元なcontextを持ったfeature mapが上がってくる。それが２手に別れて、右側の経路は低層からの情報をelement wiseで足す。

この時に足されたいのは低層のcontextではなく、位置的な情報。よってcontexは崩さないように前の層の情報を変換したい。

その変換するためのユニットが中央のAttention経路。ここで低層と高層の情報をconcatenateしてglobal average poolingでベクトル化し、1x1 conv、relu、1x1 convして、最後はsigmoidをかけて[0,1]の値とする。

これを低層の情報にかけることで、低層のcontextを高層のようなcontextに変換する。

以下はCABの模式図。
<img width="489" alt="attention_block.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/57f608c8-294a-bf13-be8c-08f8bf4909e7.png">

### Smooth Network
上記全体図の右側。intra-class inconsistencyに対応。U-Net等との比較で述べるとCABにより低い層のcontextが変換されてるので、高い層のcontextが生かされる。

よってより高次でより広範囲な特徴を拾うことができる。

これにより「同じ牛なのに一部が馬」という状況が改善されると期待される。

### Boarder Network
上記全体図の左側。inter-class indistinctionに対応。ここの仕組みは次章のfocal lossを使用することでclassとclassとのboarder付近をより明確に判断できるようになる。

### Focal Loss
Boarder Networkからの出力に対して以下のlossで学習させる。

```math
FL(p_k) = -(1 - p_k)^\gamma \log{p_k}
```

$\gamma$が０の時は通常の交差エントロピーとなる。なので交差エントロピーをより一般化したものと考えることもできる。

このlossは以下の論文が元ネタのよう。
[2] T. Lin, et. al"Focal Loss for Dense Object Detection"
https://arxiv.org/abs/1708.02002

このloss関数がどのような形状かはわかりづらいが、論文[2]中のグラフを拝借すると以下のよう。

<img width="629" alt="focal_loss_graph.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/f90da93c-32f1-46dc-5742-1668d9726eb6.png">
[2]のFigure 1より

結局$(1-p_k)$より対数部分が効いてきて交差エントロピーのようにはなるが、漸近の仕方が異なる。

$\gamma = 0$の交差エントロピーから$\gamma$を増していけば、値が小さくなる。特に図中のwell-classified examplesと書かれた部分が顕著。

つまりこのfocal lossを使うことで、既に識別性能が得られたピクセル（つまり物体の中央付近？）に関しては効いてこず、識別性能が低いピクセル（つまりボーター付近）に対して効いてくる。

### Loss
Loss全体としては、上記のfocal lossに加えて通常の交差エントロピーとなる。

```math
\begin{eqnarray}
l_s &=& SoftmaxLoss(h;w) \\
l_b &=& FocalLoss(y;w) \\
L &=& l_s + \lambda l_b
\end{eqnarray}

```

focal lossに対する掛け率 $\lambda$ は 0.1 など使う。

#実験と結果

###使ったデータセット
定番のPascal VOCやCityscapesで実験している。

###ベースにしたアーキテクチャ
ImageNetで学習したResNet-101がベース。FCN4のフレームワークを使ってる。

###データ水増し
- subtraction
- horizontal flip
- randomly scaling ・・・(0.5倍、0.75倍、1倍、1.5倍、1.75倍）

GAP使ってるのでランダムスケーリングが可能。

##各要素の効果

### 1. random scaleの効果
<img width="402" alt="rondom_scale.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/4d226388-0d8e-c7bc-0d5d-e209a70da979.png">
[1]Table 1より
結構効いてる。これを可能とするGAPを含めて効果あり。

### 2. RRB、GP、CAB、DSの効果
以下４つ
- RRB:refinement residual block
- GP:global pooling branch
- CAB:channel attention block
- DS:deep supervision
の効果
<img width="354" alt="RRB_cab_gp.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/700fc3b8-9bf5-2aee-6325-fbfec3c9c293.png">
RRBの効果が大きい。CABの効果は１％くらい

### 3. border networkの効果
<img width="346" alt="bn_sn.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/2f283f1e-c567-567e-052e-49e56dfd964c.png">
border networkの効果は微妙w。

### 4. 各層（stage）からの出力画像
<img width="429" alt="figure_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/0a2c2bad-6a21-c037-d3ff-981e9d720b72.png">
[1]Figure 7より
一番左がground truth。その右が低層（stage 1）からの出力。右に行くほど高層を経た出力。

高層にいくほどより全体のcontextを捉えて精度が上がってる。boarderも低層では物体全体というよりは物体のパーツをborderと捉えているが、高層では１つの物体（class）のborderを鮮明に認識している。

##他のモデルとの比較
###pascal VOCでの比較
<img width="414" alt="compalicene_pascalvoc.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/e908220e-8bc0-875b-dfe2-71a8f17e080e.png">
DeepLabv3+にも勝ってる。へぇ〜、って感じ。

###Cityscapesでの比較
<img width="424" alt="compalicene_cityscape.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/a6482065-1ae3-90bd-1566-83cf7ded8895.png">
これも微妙にPSPNetを上回ってる。DeepLabv3+は？？

##出力画像例
<img width="416" alt="result_image.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/0e8e03d2-ba4e-afc1-306d-e3a8a622bea4.png">
いいとこ取りした可能性はあるが、かなり鮮明に細いところまでsegmentationできてる。

#結論
今回提案したDFN（Discriminative Feature Network）はSmooth NetworkとBorder Networkという２つを導入することでいい精度が出た。

#個人的感想
Smooth Networkは精度の向上に大いに貢献しているが、Border Networkは１％程度の精度上昇と、頑張った割には効果が低い。

ただ僅差のstate-of-the-artなので、１番取るための最後の１押しとしては絶大な効果、とも言えるね。

ただ半年後にDeepLabv4とか出たら駆逐されそうw。