CNNでJPEGノイズ除去〜AR-CNN〜

### 参考文献

本記事は以下のページ、論文を参考にしています。

- http://mmlab.ie.cuhk.edu.hk/projects/ARCNN.html
- Ke Yu, Chao Dong, Chen Change Loy, Xiaoou Tang, "Deep Convolution Networks for Compression Artifacts Reduction," *arXiv: 1608.02778*


## 概要
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373722/4229c91d-64b5-e000-d200-1c3027813ac0.png" width=500>
> 左：JPEG圧縮画像、右：AR-CNNによる処理画像
> 論文より引用

#### 背景
- 非可逆圧縮（Lossy compression）によってブロックノイズやリンギングノイズなどの複雑なノイズが発生する
- 既存の圧縮ノイズ除去手法は以下のどちらかであった
    - ブロックノイズは除去するが画像がボケる
    - シャープな画像を生成するがリンギングノイズが残る


#### 内容
- 超解像の分野で成功を収めた<font color="blue">Super-Resolution Convolutional Neural Network（SRCNN）</font>という手法をもとに<br>圧縮ノイズ除去手法、<font color=red>Artifacts Reduction Convolutional Neural Network（AR-CNN）</font>を提案する
- 実応用の際には処理速度が求められるため、2点の工夫によりAR-CNNを高速化する<font color=Green>（Fast AR-CNN)</font>
    - Layer decomposition
    - `stride > 1`のconv層とdeconv層を組み合わせて使用
- <font color=Green>Fast AR-CNN</font>は<font color=red>AR-CNN</font>と比較して画質の劣化なしに7.5倍の速度向上を達成
- さらに実験では以下のことを示す
    - 深いモデルを学習する場合は浅いモデルで学習した特徴を使用することでより効率が上がる
    - ”easy to hard"という考えはモデルの`浅い -> 深い`の転移に限らず、有効である



## AR-CNN
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373722/04332e4f-1397-1ee7-33a9-cda970e5fc22.png">
> AR-CNNの概観

#### 構造
| layer | name | in ch | out ch | kernel size | stride | activ fn |
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|Feature extraction| 1|64|9|1|PReLU|
|2|Feature enhancement| 64|32|7|1|PReLU|
|3|Mapping|32|16|1|1|PReLU|
|4|Reconstruction|16|1|5|1|-|

## Fast AR-CNN
#### AR-CNNの各layerにおけるパラメータ数
| layer | name | in ch | out ch | kernel size | stride | activ fn |Number of Parameters|Percentage|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|Feature extraction| 1|64|9|1|PReLU|5184|4.87%|
|**2**|**Feature enhancement**|**64**|**32**|**7**|**1**|**PReLU**|**100,352**|**94.27%**|
|3|Mapping|32|16|1|1|PReLU|512|0.48%|
|4|Reconstruction|16|1|5|1|-|400|0.38%|
|total|-|-|-|-|-|-|106,448|100%|

<font color=red>Feature enhancement layerがパラメータ全体の95%を占めている</font>
⇒<font color=blue>Feature enhancement layerのパラメータ数を減らせば良い</font>

<font color=red>特徴マップの大きさ（縦×横）も計算コストに影響が大きい</font>
超解像など従来のlow-level visionタスクでは、中間特徴マップの空間的なサイズは入力画像と同じに保つ必要があった
一方で、認識などhigh-level visionタスクではその必要がない
一般的に、理にかなったサイズの大きなストライドは多少精度は劣化するが畳み込み演算を顕著に速くできる
⇒<font color=blue>ストライドのサイズが計算速度を向上させる上で重要な要因である</font>

#### 対策①：Layer decomposition (直訳：層の分解）
Feature enhancement layerは2つの役割を担っている

- 大きなフィルタで入力特徴マップのノイズを除去
- 高次元特徴を比較的低次元特徴への変換

⇒<font color=blue>それぞれの役割を担う連結した2つのlayerに置き換える</font>

| layer | name | in ch | out ch | kernel size | stride | activ fn |Number of Parameters|Percentage|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|2|Feature enhancement|64|32|7|1|PReLU|<font color=red>100,352</font>|94.27%|
↓

| layer | name | in ch | out ch | kernel size | stride | activ fn |Number of Parameters|Percentage|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|2-1|shrinking|64|32|1|1|PReLU|2048|-|
|2-2|enhancement|32|32|7|1|PReLU|50176|-|
|total|-|-|-|-|-|-|<font color=blue>52224</font>|-|

- Layer decompositionによりFeature enhancement layerのパラメータ数は半減
- モデル全体で見ても約46%規模を削減

#### 対策②：`stride > 1`のconv層とdeconv層
1st layerのストライドを`stride > 1`にすることで高速化を図る
AR-CNNの1st layerは特徴抽出を担う
認識などhigh-level visionにおける1st layerも同様の役割を担うため、strideを1から2に変更してみる価値はある

ただし、<font color=red>`stride > 1`により特徴マップが小さくなるため、end-to-endの学習ができなくなる</font>
⇒<font color=blue>last layerをdeconv層にすることで対応する</font>
　`stride > 1`の場合、conv層はsub-sampling、deconv層はup-samplingを行う。

また、<font color=red>処理時間は短縮されるが、復元後の画質が劣化する可能性がある</font>
⇒<font color=blue>mapping layerを追加する、deconv層のフィルタサイズを大きくして対応する

### 完成形Fast AR-CNN
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373722/5c0bf53c-f54d-b2e0-e92f-ffa718b0f2ee.png">
Fast AR-CNN の概観

| layer | name | in ch | out ch | kernel size | stride | activ fn |Number of Parameters|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|Feature extraction|1|64|9|2|PReLU|5184|
|2|Shrinking|64|32|1|1|PReLU|2048|
|3|Enhancement|32|32|7|1|PReLU|50176|
|4|Mapping|32|64|1|1|PReLU|2048|
|5|Reconstruction|64|1|9|2|-|5184|
|total|-|-|-|-|-|-|64640|

モデルの層パラメータ数$N$の計算は以下の式で求める。
$d$：層
$n$：特徴マップ数（フィルタ枚数）
$f$：フィルタサイズ

```math
N=\sum_{i=1}^{d} n_{i-1} \cdot n_i \cdot f_i^2
```



論文ではFast AR-CNNの総パラメータ数は56496という記載があるため、
どこか計算を間違えているかもしれない点はご容赦ください。

以上