[論文概要] Layer CAM

こんにちはぺいぺいです。Layer CAM に関する論文読みをまとめたものです。概要なので、もと論文から情報が省かれていたり、直訳になっていなかったりするため、ご了承ください。

# Abstract
* 2021, IEEE Transactions on Image Processing
* 著者：Peng-Tao Jiang*, Chang-Bin Zhang*, Qibin Hou, Ming-Ming Cheng, and Yunchao Wei
* Deep Learning モデルを理解するためのXAIの手法として、CNNの最終層の特徴マップを可視化するCAMやGrad-CAMといった手法が存在
* しかし、CNNは特徴量の空間次元を徐々に縮小していくため、可視化された activation map が「荒く」なる。例えば、画像の馬を分類した際に可視化すると、足などの細かい部分に対してヒートマップがずれたりする
* 提案手法LayerCAMは、より正確な activation map を作成するための手法

# イントロ - Introduction
## 2020年あたりの activation map の動向
* CNNを使用した画像分類問題において、activation map を作成することが提案されている
* Activation map とは、モデルの途中過程を可視化したマップ（画像）であり、ヒートマップで表現されることが多い
* 画像分類問題で activation map を使用することで、弱教師ありセグメンテーションタスクのように扱うことができる。例えば、犬猫分類問題があるとして、CNNの最終層を可視化すると、犬の位置や猫の位置の値が大きくなっており、これらはまるでセグメンテーションの結果のようになっている

## Activation mapの問題点
* Activation map のコンセプトはCAMで提案されたが、CAMは最終層にGloobal average pooling を備えなければならないという制約を持っていた
* その後Grad CAMが提案され、どんなCNNベースの画像分類器に対しても activation map を作成可能になった。Grad CAMは、特徴マップの勾配平均をターゲットクラスの重要度として、activation map を作成する手法である
* しかし、Grad CAM では、Activation map を作る元となるCNNの層を最終層にだけ頼っていたため、activation map と入力画像の空間解像度を合わせるためには、activation map を upsampling しなければならず、「荒く」なってしまう。これにより、画像のクラスの情報だけから、セグメンテーションをするなどの、weakly-supervised tasksの性能に限界がある
* つまり、もっと解像度の高いactivation map を取得する手法が望まれる。例えば以下の画像は、VGG16のactivation map を畳み込み層ごとに可視化したものである。Conv3_3 のような手前の畳み込み層では、画像の細かい特徴量を取得しているが、Conv5_3 のような出力層付近だと解像度が荒くなってしまう
* Grad CAM はグローバルな情報のみを各特徴マップで収集する傾向があり、詳しい位置情報が失われがちであると分析されている。（画像の中央上でピクセル値が高い領域が散らばっていることを指している）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/0d180371-7582-de42-7055-127d5b658745.png)

## Layer CAMの目的と貢献
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/9b03a4b2-e02c-0b29-31d2-5d5a3ffb968f.png)

Layer cam の目的は、解像度が高い浅い層の出力から、位置情報が荒くない精度の高いactivation map を取得することである。Layer CAM の利点は以下の通り。
* Layer CAMは従来手法と異なり、CNNの深い層と浅い層から、荒い位置情報（どこらへんに馬がいるか）と精度の高い詳細（馬の特徴はどんなか）の両方を取得可能
* 異なる層出身のactivation mapは、相互補完的であることが多い。つまり、これらをうまく混ぜ合わせることができれば、画像ラベルアノテーションのみを持ってしてセグメンテーションを行うweakly-supervised tasks に有用であると考えられる
* Layer CAMを使用する際、CNNに特別な変更を施す必要がないので、既存のCNNに適用可能

# 関連研究 - Related work
## Attention methods
CNNを用いて興味のあるクラスごとに画像ないの位置を特定するために様々なアテンション機構が使用されている。

### Class Activation Mapping
CAM、Grad-CAM、Grad-CAM++、Score-CAMなどのいくつかの手法では、クラスごとの activation maps をCNNの最終層から生成する。以下の図のように、class activation maps はそれぞれの特徴マップとそれらの重みの加算によりせ性される。最終的にReLUに入力され、負の値を取り除くようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/f98fd210-9cd2-d090-018b-114ddf010908.png)

以下の先行研究は、CNNの特徴量マップの最終層の重み付き加算によってactivation maps を作成するということが共通しているが、重み（weights）の決め方で差別化される。

* CAM：重みを最終層のGlobal Average Pooling によって決定（最終層に制限が生じる）
* Grad-CAM、Grad-CAM++：重みを勾配情報を使用して決定（CAMの制限が取れる、畳み込み層の制限のみ）
* Score-CAM：勾配への依存を取り除き、順伝播の値から重みを決定

以下の記事がうまくまとめられていてわかりやすい。
https://tech-blog.abeja.asia/entry/cam-202203

### Winner-take-all Scheme

* c-MWPのような学習時において、ネットワークの各層で最も活性化されたニューロンだけが学習の参加できる手法をWinner-take-all scheme と呼び、c-MWPはこれを確率的に行なっているらしい
* 本論文曰く、Grad-CAMよりも時間がかかるが、Grad-CAMよりも信頼性は低いとのこと
* 信頼性は低いものの、強く発火したニューロンだけが保持されるというWinner-take-all scheme の性質上、小さなオブジェクトの場所情報をうまく保持できることが多い

NormGrad という手法も説明されている。
* NormGrad はidentity layers を使用してclass activation maps を異なる層に対して作成
* 小さく、区別に寄与する領域のみをキャプチャする性質がある

これらに比べLayer CAMはオブジェクトの全体をしっかりカバーする性質を持つ。

### Hierachical semantics
* Object detection や Semantic segmentation んどのタスクにおいては、階層的な特徴量を使用することで精度を上げてきた
* Class activation maps に関しても浅い層では細かい特徴を習得し、深い層ではオブジェクトを荒く習得する傾向がある
* Layer CAMでは、上記の特徴を共に使用することで、正確かつ全体を認識できるマップを作成

### Weakly-supervised object localization
* Weakly-supervised object localization（WSOL）は、画像レベルのラベルのみを使用して対象オブジェクトのモックスを認識するタスク
* CAMやGrad-CAMなどの手法はXAIとしての役割の他にこのようなタスクを解くことも可能

### Weakly-supervised semantic segmentation（WSSS)
* Weakly-supervised semantic segmentation（WSSS)は、セマンティックセグメンテーションタスクを画像レベルのラベルで解くタスク
* 画像ラベルは空間情報を提供しないんでかなり難解なタスクである
* Layer CAMはその正確性からWSSSにも寄与すると主張

### Surface Defect Localization
* 画像認識ツールを産業製品に適用するケースがよく見られる。例えば Semantic segmentaion を使用してコンクリートのひび割れを探すなどが挙げられる
* しかしこれらの手法はアノテーションがめんどくさいケースが多い（特にセグメンテーションタスク）
* weakly-supervisedな手法は、それらの手間を軽減することができる。Layer-CAMの浅い層のactivation maps を使用することで、以下の画像のように弱教師あり学習によって、めんどくさいセグメンテーションタスクが解けることが確認されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/4cab1dbc-ba4d-cd0a-5ec4-ed6e77a982da.png)

# 手法 - Methodology
## Revisit Grad-CAM and Grad-CAM++
Grad-CAMとGrad-CAM++のアルゴリズムについておさらい。基本的な文字の定義は以下の通り。
* $y^c = f(I, \theta)^C$：分類機$f$, 入力画像$I$, パラメータ$\theta$, クラス$C$に足しするスコア$y^C$
* $A_k$：CNNの最後の畳み込み層の$k$番目の出力特徴量マップ

Grad-CAMの基本思想は、以下の通り。
* $A_k$を変化させた際に出力 $y^c$が大きくなる場合 → $A_k$は重要な特徴量
* $A_k$を変化させた際に出力 $y^c$が小さくもしくは変わらない場合 → $A_k$はどうでも良い特徴量

$A_k$を変化させた時、$y^C$がどのくらい変化するのかを求めるには、特徴マップ$A$の空間座標$i,j$それぞれについて、以下のように勾配を求めたら良い。
$$g_{ij}^{kc} = \frac{\partial y^C}{\partial A_{ij}^k}$$

特徴量$A_k$のクラスCに対する重要度をスカラーで求めたいが、特徴量マップ$A_k$は行列である。これをスカラーにしてあげるために、平均を取って、特徴量$A_k$の重要度すなわち重み$w_k^c$を求める。
$$w_k^c = \frac{1}{N}\sum_i\sum_jg_{ij}^{kc}$$

ここで、$N$は$A_k$の空間サイズ数（ピクセル数）である。これを使用して最終的なクラス$c$のactivation map $M^c$を以下のように重み付き和で求める。
$$M^c = \text{ReLU}(\sum_k w_k^c \cdot A_k)$$

これが、Grad-CAMのアルゴリズムである。
一方でGrad-CAM++は、$w_k^c$の求め方がGrad-CAMと異なる。Grad-CAMでは、勾配を特徴量マップの次元ごとにただ単純平均していたが、この平均の方法を工夫しているのがGrad-CAM++である。Grad-CAM++では、重み$w_k^c$を以下のように求める。
$$w_k^c = 
\sum_i\sum_j a_{ij}^{kc} \cdot \text{ReLU}(g_{ij}^{kc})$$

$$a_{ij}^{kc} 
= \frac{(g_{ij}^{kc})^2}
{2(g_{ij}^{kc})^2 + \sum_a \sum_b A_{ab}^k(g_{ij}^{kc})^3}$$

$(a,b)$は$A_k$の空間位置を表している。Grad-CAM++の方がオブジェクトの位置を精度よく認識することができる。

* これらの手法の共通点 → 最後の畳み込み層の出力とその勾配から計算された重みを使用しているということであるが、この手法だと、activation map の空間解像度が荒すぎる
* 高解像度のマップを手にいれるにはGrad-CAMやGrad-CAM++を浅い層に適用するというのが自然な考えである → 実際にやってみると、false positive が多すぎるらしい（下図の真ん中に該当）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/0e275430-2814-1b87-a4ae-15473b6415aa.png)

### 分析 - analyze
CNNで画像分類を行う際、浅い層では粒度の高いactivation mapが得られ、深い層では、荒いがクラスごとに位置情報をキャプチャしているmapが得られる。また、序盤のマップでは、クラスごとの区別のようなものがない。例えば$A_k^{鳥}$を調べたとしても、下図のconv1_2では、背景も光っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/06cdcb0a-e147-9e55-b8eb-4c06a26e34d5.png)


Grad-CAM、Grad-CAM++は共に、特徴量マップ$A_k^c$に対してグローバルな重み$w_k^c$を適用する。グローバルな重みというのは、「特徴量マップの座標に依存しない重み」ということである。
クラスごとの区別の概念が薄い浅い層のマップに対してグローバルな重みをかけてしまうと、関係のない背景情報まで強調されてしまう。その結果、False Positive が増えてしまう。

また、数値解析も行なっている。以下のグラフは、横軸が特徴マップのチャネル、縦軸がチャネルごとに計算した勾配の分散を表している。ここで確かめたい命題は、「グローバルな重み$w_k^c$は特徴マップ$A_c^k$の重要度として機能してくれているか」ということである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/e4265b05-7ddd-eadd-3b1a-e75dbf776361.png)

上図から以下のことがわかる。
* 深い層（stage5)：ほとんどのチャネルにおいて分散が0に近い → Grad-CAMで言うところの $w_k^c = \sum_i\sum_j a_{ij}^{kc} \cdot \text{ReLU}(g_{ij}^{kc})$ という重要度の算出方法により、特徴量マップごとの重要度を代表することができている
* 浅い層（Stage1）：ほとんどのチャネルにおいて分散がバラバラ → 同じチャネル内でも空間位置によって値が大きかったり小さかったりする → Grad-CAMで言うところの $w_k^c = \sum_i\sum_j a_{ij}^{kc} \cdot \text{ReLU}(g_{ij}^{kc})$ という重要度の算出方法では、チャネルごとの重要度を決定することができない

## LayerCAM
LayerCAMは上記で解説された「浅い層では、既存手法の重み作成方法では空間位置によって値がバラバラすぎて、重要度としての役割を果たせない問題」を解決するための手法である。
メインアイディアは「Grad-CAMみたいにチャネルごとに重み$w_k^c$を計算するんじゃ荒すぎるからチャネルと空間位置ごとの重み$w_{ij}^{kc}$を丁寧に用意すればいいじゃん」というシンプルなものである。
LayerCAMでは、とある畳み込み層の出力特徴量マップの$k$チャネル目のクラス$c$への空間位置$(i,j)$に対する重みを以下のように計算する。
$$w_{ij}^{kc} = relu(g_{ij}^{kc})$$

$k$チャネル目のactivation mapは上記の重みを使用して以下のように計算される。
$$\hat{A_{ij}^k} = w_{ij}^{kc} \cdot A_{ij}^k$$

これを全てのチャネル分足し合わせれば、activation maps を得ることができる。
$$M^c = \text{ReLU}(\sum_k \hat{A^k})$$

このようにしてactivation mapを計算することによって、浅い層のクラス分類に寄与しない特徴を重みで弱め、逆に寄与する特徴を強調することができる。

# 実験 - Experiments
本セクションでは、以下の4種の方法でLayer CAMの有効性を検証する。
* Weakly-supervised object localization（弱教師あり物体位置推定）
* Image occlusion（画像遮断）
* Surface defect detection（表面欠陥検出）
* Weakly-supervised semantic segmentation（弱教師ありセマンティックセグメンテーション）

## Weakly-supervised Object Localization
* データセット：ILSVRC、50000枚の画像
* 評価指標：予測BboxとGroud Truth BboxのIoUが0.5以上かつ予測された上位1つのクラスが正しい場合正解、それ以外の場合は不正解（= loc1）とIoU > 0.5 以上かつ予測された上位5つのクラスの中に正しいものが入っている場合正解、それ以外を不正解（= loc5）
* Activation mapからBboxを作る方法：マップの最大強度の上位15%を1、それ以外を0とするマスクを作成し、最も多く連結している領域をピッタリくくる長方形をBboxと定義
* VGG16の異なるステージの最終畳み込み層からマップを生成
* conv1_2とconv2_2層では、マップの強度が高い位置が散らばりがちだったので、GraphCutという手法で連結したセグメントを作成
* 異なる層のactivation mapを結合する際、最初の3ステージに関しては、以下の式によってスケールを調整。tanhによって、 -1 から 1 に正規化されるが、もともと$M^c$はReLUの効果で0以上の値しかとらないので、実質 0 から 1 の範囲になる
$$ M^c = \text{tanh}(\frac{\gamma * M^c}{\text{max}(M^c)}) $$

比較をしたところ以下のような結果になった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/14722451-b339-6cf2-78cd-92bc2ea02332.png)

全ての層において既存手法を上回っているが、特に浅い層で顕著にその差が見られる。
また、実際に浅い層を可視化してみると以下の画像のようにGrad-CAMやGrad-CAM++はクラスに無関係なノイズも可視化されているが、LayerCAMでは対象オブジェクトのみ強度が上がっていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/077ec2cd-f5a1-0820-7404-437959f658ff.png)

さらに、複数のステージのactivation maps を組み合わせて1つのマップを作成することも試みた。その場合、浅い層の出力値は小さくなりがちなので、そのような場合は浅い層のマップに下駄を履かせてあげる必要がある。下駄の履かせ方は以下の通り。（再掲）
$$ M^c = \text{tanh}(\frac{\gamma * M^c}{\text{max}(M^c)}) $$

$\gamma$ はスケールファクターであり、実験的に2が良く、tanhが良いらしい。その後、ステージごとのマップの空間位置ごとに比較し、最大値をとる位置とその値を結合後の代表とする。

このように複数の層を使用してマップを作成し、Bboxを作成した結果以下のようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/7db6553f-5ecf-a5ed-bb17-4bf05d23141a.png)

これをみると複数ステージを使用することはただの手間のように感じる。しかし、これは物体検出というタスクそのものが位置推定にそこまで厳しくないタスクであるためである。一方Semantic Segmentationでは、Stageを追加するほど精度が良く向上する現象が確認されている。

Layer CAMを他の手法と比べた結果、精度が向上しているということが主張されている。画像出力例、結果の比較表は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/a3581c98-95af-0f6d-7b79-50b505fefbbd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/e8e58985-0db6-a813-b37c-349ed444db66.png)

## Image occlusion
Image occlusion は、画像の一部を妨害する（画素値を0）にすることで、分類精度にどのような影響が出るかを検証する手法である。複数の手法で生成されたactivation mapの値が高いところを隠して、分類精度がより下がった手法が最も良いactivation mapを作成できていることを意味する。実験条件は以下の通り。

* データセット：ILSVRCのうち、VGG16が正しく分類した画像
* Occlusion方法：閾値を0.7とし、それ以上の値を持つactivation map位置を調べ、入力画像と対応するピクセルを隠す
* 元の分類精度から低下していれば低下しているほど、activation mapの精度が良い

結果は以下のようになり、LayerCAMが最も良かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/8ac06979-7d76-d697-cf02-9c69dfa75229.png)

## Industry Surface Defect Localization
産業用物質の欠陥セグメンテーションにLayerCAMを使用する実験である。さまざまな物質が存在し、またそれぞれの欠陥はとても細かいので、粒度の高い特徴認識ができているかどうかを検証する。これを弱教師あり2値セグメンテーションタスクとして解く。つまり、画像ごとに欠陥あり or なしのラベルしかついていないデータを使用して欠陥部位セグメンテーションを試みる。

* データセット：DAGM-2007 defect dataset, (train, test)=(3550, 400), さまざまなテクスチャの表面が存在
* Model：ResNet50
* 学習条件：SGD, 15epochs, batch size 32
* 比較対象：Semantic Segmentationタスクとして学習しているSegNetとRefineNet、弱教師ありセグメンテーションタスクとして学習しているGrad-CAM、Grad-CAM++
* 評価指標：mIoU、FPS

結果は以下のようになった。弱教師あり学習の既存手法に勝つのはもちろんのこと、ピクセルレベルでアノテーションされたデータで学習しているSegNetにも勝利している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/82c2b68f-a8e4-914e-119e-d0fbe9ebe03b.png)

Stage ごとのactivation mapは以下のようになった。layer2だと、領域が小さく、ノイズが乗りすぎており、layer3がもっともちょうどよく、layer4はマップが荒くなりすぎている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/4cb349db-4a66-3049-2e20-37cc995eb389.png)

また、どのlayerを使用すれば最も精度よくセグメンテーションできるか検証した結果、以下のようになった。つまり、なんでも間でも全てのレイヤーを使えば良いのではなく、認識してほしい特徴の粒度によって、どこのレイヤーを使用するか判断する必要があるということである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/c825c30b-00e0-304c-9dd3-bc350d72b35c.png)

## Weakly-supervised segmentation
画像単位のラベルを使った弱教師あり学習によりセグメンテーションを行うタスクである。

* データセット：PASCAL VOC 2012、20クラス、（train, validation, test=(1464, 1449, 1456)、セグメンテーション用データ
* モデル：VGG16
* 学習条件：ImageNetで事前学習

結果は以下のようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/0735bcc2-a46c-a6f2-427d-98eedaeec6d0.png)

また、どの層のactivation mapを使用すべきかを比較した結果、以下の結果が得られた。今回の実験では、S2 - S5 のactivation map を考慮し、空間位置ごとに最大値を取るものを代表値とすると最もセグメンテーションの精度が向上した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/8d5fc77f-f99f-16b0-77b0-ef224826aa51.png)

この傾向は定性評価においても得られている。下図をみると、浅い層を考慮して作成したマスクの方が、より細かい特徴を捉えられていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/8a772a7c-91b3-ff9b-7233-c08122a986d2.png)

# 結論 - Conclusion
* LayerCAM はCNNにおける信頼できる activation map を生成できる
* 浅い層のマップは粒度の細かい情報を獲得し、深い層のマップは荒いが全体的に位置情報を獲得できる
* 異なる層のマップを組み合わせることで、弱教師ありセグメンテーションタスクのような細かい位置情報が必要なタスクに置いては精度向上が確認された