2022年時点リアルタイムセマンティックセグメンテーションモデルのまとめ

## 概要

前回の記事で、リアルタイムセマンティックセグメンテーションの学習やテストに使われるデータセットについてまとめました。

今回は、どのようなモデルが今存在しているのか、ということについてまとめていきたいと思います。


## モデルの性能の変遷

Paper with Code のそのままの転載となりますが、
まずはセマンティックセグメンテーションがどのように性能向上し、
リアルタイム性を持ってきたのか、ということについて理解します。

`Paper with code + real time semantic segmentation` へのリンクはこちら

https://paperswithcode.com/task/real-time-semantic-segmentation


### 精度

これを見ていただければわかるように、CityScapesのデータセットに対して、
モデルの持つmIoUの値は年々向上しており、
今現在のSoTAモデルは約８０のmIoU を持っていることがわかります。

![Screen Shot 2022-11-29 at 12.24.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/10cd6075-b6e1-f9f4-d814-f888625d84b4.png)



### 速度

次に、推論速度ですが、これも年々大きな改善が見られます。
もちろん計算環境が良くなっているという前提はありますが、モデル自体の改善も大きく、
現在では200~300を超えるFPSでの推論も可能な水準です。
リアルタイムセマンティックセグメンテーションという言葉が出てき始めたのは、２０１６年〜２０１７年頃からのようです。グラフを見ると、そのあたりでFPSが１００前後を達成しており、そのあたりから実際にリアルタイム性をもつセグメンテーションモデルで精度を出すことができるか、という研究が大きくなったようです。

現在の２００、３００くらいのFPSが出れば
リアルタイムでセグメンテーションをかけながら自動運転に応用したりなども余裕で考えられそうですね。

![Screen Shot 2022-11-29 at 12.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/aba3292b-5d69-4f54-1b28-c178f75f4160.png)


### 精度と速度のまとめ（後述のPIDNetの論文より）
![Screen Shot 2022-11-29 at 18.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/cb15da68-3c29-68da-7677-d302e9de23ef.png)

ここ数年で、セマンティックセグメンテーションのタスクは非常に早く、正確になっていることがみて取れます。


## アルゴリズムの変遷

さて、ここからセグメンテーションモデルのアルゴリズムについて言及します。

ここでは、アルゴリズムの構造に対して、系列分けしてみました。

- **UNet 系列**
- **DeepLab 系列**
- **畳み込み層改善 系列**
- **マルチパス系列**
- **YOLOからの派生系列**
- **コンピュータビジョンからの工夫を組み込んだ派生系列**


ここからは、各系列ごとにモデルのアルゴリズムを追っていこうと思います。

## モデル構造

## UNet 系列

まずは、セグメンテーション元祖UNetを踏襲したアルゴリズムです。
Unet として２０１５年に登場し、Unet＋＋などでより表現力が改善されたモデルになったあと、
2021年にはトレンドのSwin Transformer を応用したSwin Unetも発表されています。


- Unet(2015)
https://arxiv.org/pdf/1505.04597.pdf

- Unet++(2018)
https://arxiv.org/pdf/1807.10165v1.pdf

- Swin Unet(2021)
https://arxiv.org/pdf/2105.05537v1.pdf


### Unet

UNet は知っている方も多いと思いますが、エンコードとデコードをボトルネック層を挟んで実装したモデルで、
デコード部分にはエンコードからのスキップコネクションを使用することで、特徴量を抽出することを抑えた、細部のセグメンテーションに効く部分を残すことで、セグメンテーションタスクのスタンダードモデルとなりました。
モデルの形がU字に見えることから、UNetと呼ばれています。

![Screen Shot 2022-11-29 at 12.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/20f9843b-7d66-eabd-a460-22573c32377a.png)

### UNet＋＋

UNetのスキップコネクションを改善する形で発表されたUNet++ですが、元のUNetでは単純だったスキップコネクションを、もっと多層にして実行しています。
こうすることで、今までエンコーダとデコーダで乖離していた特徴マップの差を小さくすること、グラディエントマップを改善することなどをメリットとして挙げています。

![Screen Shot 2022-11-29 at 12.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/d9339502-afe9-76fd-d632-5d208ce973c2.png)


### Swin UNet

こちらは、Swin Transformer を用いてエンコーダとデコーダを実装しているモデルです。
畳み込み層はSwinTransformerの層に置き換わっています。

![Screen Shot 2022-11-29 at 12.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/df81751b-213d-19a2-6267-50192a774b7e.png)


## DeepLab 系列

- DeepLab (2014)
https://arxiv.org/pdf/1412.7062v4.pdf

- DeepLab v2 (2017)
https://arxiv.org/pdf/1606.00915v2.pdf

- DeepLab v3 (2018)
https://arxiv.org/pdf/1706.05587v3.pdf


### DeepLab

DeepLab もまた、畳み込み層を用いて特徴マップを作るところまでは同じなのですが、
そのあとに最終出力を行うところに、アップサンプリングの後にConditional Random Field (CRF) と呼ばれる前結合モデルを使って最終出力を生成しています。
この工夫により、モデルの課題だった、ディテールの情報が畳み込みによって失われてしまうことを克服した、という記述になっています。

![Screen Shot 2022-11-29 at 12.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/db07e945-f22b-3a90-af9d-17bc2cfeaf10.png)




### DeepLab v2

DeepLab v2 では、CNN層に対して、視野角を通常より大きく取る、Atrous Convolution を用いることによって、出力される画像が小さくなりすぎるのを防ぐ（結果として特徴マップのディテールが保たれる）ことを工夫しています。
![Screen Shot 2022-11-29 at 12.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/e2440641-91ef-3de7-e4f9-3bead7cbc592.png)

また、これらの視野角をいろいろな大きさで実行し、それらを合わせる、ピラミッド型を採用しており、
これらの手法でより精度を高めたという記述になっています。

![Screen Shot 2022-11-29 at 12.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/c7dabbb2-29a3-ea8d-f39d-a8f9c747cb4c.png)



### DeepLab v3

v3については、アーキテクチャは基本的にはv２のものを踏襲し、
モデルの細部の更新により精度の向上を図ったというような記述がなされていました。
細部については論文で確認していただければと思います。




## 畳み込み層改善 系列

- ENet(2016)
https://arxiv.org/pdf/1606.02147v1.pdf


### ENet

既存のセグメンテーションモデルの畳み込み層に対して、畳み込みブロックをより少量のパラメータによって実行し、速度を改善したという記述になっています。

![Screen Shot 2022-11-29 at 13.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/bfa52801-cce5-ad34-824c-4f41fb5150c8.png)


## マルチパス系列

- bisenet(2018)
https://arxiv.org/pdf/1808.00897v1.pdf


![Screen Shot 2022-11-29 at 13.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/ff1d7966-8281-f8ae-59e9-c8b2022035da.png)

![Screen Shot 2022-11-29 at 13.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/1111a885-5508-e38e-c085-80bb5eb544ff.png)

`ARM(Attention Refinement Module)` と　`FFM(Feature Fusion Module)`は
`MobileNetv3のBottleNeck`で登場した　
`Squeeze and Excitation` モジュール　に類似しています。

https://qiita.com/omiita/items/77dadd5a7b16a104df83#31-bottleneck%E3%81%B8%E3%81%AEsqueeze-and-excitation%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E5%B0%8E%E5%85%A5

このBisenetで書かれている `Context Path`と`Spatial Path`は
セマンティックセグメンテーションにおいて重要な、
`特徴量をより抽出した情報`と、`ディテールをもっている情報`をそれぞれ持っているパスであり、これらの兼ね合いやフュージョンの仕方が全てのモデルにおいて重要であり、それぞれの派生論文での工夫ポイントとなっています。


## YOLOからの派生系列

- YOLACT(2019)
https://arxiv.org/pdf/1904.02689v2.pdf

- YOLACT++(2019)
https://arxiv.org/pdf/1912.06218v2.pdf


#### YOLACT(2019)

YOLACT は、物体検出モデルとして知られているYOLOのモデルに、セグメンテーションのチャンネルを付け加えたものです。

![Screen Shot 2022-11-29 at 15.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/4ef7774c-8a4c-8b52-ec52-f4f908efdc1a.png)


`Prediction Head`には、YOLOの出力である、物体のクラスを識別するチャンネル、ボックスを出力するチャンネルがあります。
`Head Architecture`の`RetinaNet`を見ると、その二つのパスでモデルが構築されています。
YOLACTは、この`Class`と`Box`の出力に加えて、`Mask`の出力を持っています。

![Screen Shot 2022-11-29 at 15.25.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/39803c7d-9572-9d1b-6853-3183ac9a5c87.png)


この`Mask`は、`Protonet`からの出力と内積を取るような形で重みをつけた状態で足し合わされ、それが`Mask`（セグメンテーションを表す）となります。

![Screen Shot 2022-11-29 at 15.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/9163217f-0daf-9c47-2a77-1d397895625d.png)

その足し合わされた後の`Mask`は、`Head Architecture` の他の出力によってクロップされ、閾値によって切り分けられます。

また、これはYOLOを理解するキーワードではあるのですが、`NMS`というキーワードも出てくるため、知らない人がいたら下の解説記事をご覧ください。

また、YOLACTは`∼1500 MB of VRAM even with a ResNet-101 backbone` ということで、スペックの低いデバイスに対してもデプロイできるのでは、という記述があります。

https://meideru.com/archives/3538

一通りモデルを眺めてみると、とても面白いなと思いました。
`Head Architecture`をマルチパスにするのではなく、シングルパスにして、最後に３つの出力に分けるところなども、高速化という観点でメリットなのだろうなと思いました。
内積を取って重みの付いた和をとるというところは、なんとなくアテンションのようなニュアンスも感じますね。





#### YOLACT＋＋(2019)

根本的なモデル構造についてはYOLACTと同じなのですが、
`Fast Mask Re-Scoring` と呼ばれる層を追加で実装することで、精度を向上させています。
具体的な実装は単純で、`Mask`を追加の畳み込み層によってベクトル化します。
このベクトルは、教師データとのIoUを予測するように設計しておいて、
このベクトルと、予測されたクラシフィケーションコンフィデンスの積を使って、最後のマスクの結果を再度回帰することで精度向上を図っている、と記述されていました。

![Screen Shot 2022-11-29 at 15.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/7616025e-1e81-81bf-5258-15727c508998.png)



## コンピュータビジョンからの工夫を組み込んだ派生系列

- SFSeg(2020)
https://arxiv.org/pdf/2002.10120.pdf
- DDRNet(2021/01)
https://arxiv.org/pdf/2101.06085.pdf
- PIDNet(2022/07)
https://arxiv.org/pdf/2206.02066v2.pdf#page10

### SFSeg(2020)
なんと`Optical Flow`の機構を取り入れたモデルとのこと。
`Optical Flow`は、動画における隣のフレームの輝度勾配の流れを追って、特徴点がフレーム間でどのように移動したかを予測するものです。
詳しくはいろいろな解説記事をご覧いただければと思います。

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html#:~:text=%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%81%AF%E7%89%A9%E4%BD%93,%E5%A0%B4%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%EF%BC%8E


`SFSeg` では、`Flow Alignment Module`と呼ばれるモジュールを組み込みます。
このモジュールと、今までの`Feature Pyramid Fusion`を組み合わせることで、Backbone がとても小さくても精度が出るようになり、Backbone はResnet18でも精度が出たので、高速化が大きく達成できた、
という記述になっています。

![Screen Shot 2022-11-29 at 16.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/2adb5a0e-8d22-4575-0efb-9e5de1b02991.png)

![Screen Shot 2022-11-29 at 16.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/bc36d288-05de-1a44-890c-83fbaf3ad771.png)

![Screen Shot 2022-11-29 at 16.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/1c35a92b-4ce6-274d-23bb-b49aff092fad.png)




### DDRNet(2021/01)

![Screen Shot 2022-11-29 at 16.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/bdd24c10-9ec3-7684-384b-04d20c6a29a2.png)

![Screen Shot 2022-11-29 at 16.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/d1ff7d8b-ffe4-7e0d-e921-b0dcecdb22e0.png)

![Screen Shot 2022-11-29 at 16.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/8fbb5335-49fd-6a27-d657-e8a43626a6c9.png)



### PIDNet(2022/07)
ハイレゾリューションの情報が、セマンティックな意味合いの強いローレゾリューションの情報で上書きされてしまう問題(`Overshoot`)に着目。
`PID制御`にアナロジーを見出し、３つのブランチを持つネットワークを構築。

オーバーシュート問題とは、Detail branch (Spatial branch) がContext branch の８倍の大きさを持っており、フュージョンを行うときに物体の境界が周りのピクセル値によってぼやかされてしまい、小さなスケールの物体が圧倒されてしまい、うまくセグメンテーションできない現象のこと。


>  the output size for detailed branch is 8 times of
context branch in DDRNet (4 times in BiSeNet) and direct
fusion of them will inevitably leads to a phenomenon that
the object boundary are easily corroded by its surrounding
pixels and the small-scale object could be overwhelmed by
its adjacent large objects, namely overshoot in this paper


PID制御をまず理解することでPIDネットでどのような提案がされているか、ということについて理解できます。

https://www.rkcinst.co.jp/technical_commentary/13090/

Pは現時点と目標の差、Iは時間方向に足し上げた差の積分値、
Dは現時点での変化率を抑える方向の力、
という解釈になっているようです。

https://www.ni.com/ja-jp/innovations/white-papers/06/pid-theory-explained.html

> ​PID​コントローラ​の​ゲイ​ン​は​トライアル​&​エラー​メソッド​により​得​ら​れ​ます。​エンジニアが各ゲインパラメータの重要性を理解すれば、​この​メソッド​は​比較的​簡単​です。​この​メソッド​では、​まず​I​と​D​がゼロに設定され、​ループ​出力​が​変動​する​まで​比例​ゲイ​ン​が​向上​し​ます。​比例​ゲイ​ン​を​向上​させる​と​システム​は​高速​に​なり​ます​が、​システム​が​不安定​な​状態​に​なら​ない​よう​対策​が​必要​となり​ます。​P​が​希望​の​応答​速度​と​なる​よう​設定​さ​れる​と、​積分​項​が​増加​し​て​変動​は​停止​し​ます。​積分​項​により​定常​状態​と​の​誤差​は​減少​し​ます​が、​オーバー​シュート​は​増加​し​ます。​ある程度​の​オーバー​シュート​は​常に​高速​な​システム​に​必要​な​ため、​即座​に​変化​に​反応​する​可能性​が​あり​ます。​統合項は微調整され、​定常​状態​と​の​誤差​を​最小限​に​抑え​ら​れ​ます。​定常​状態​と​の​誤差​を​最小限​に​抑え​た​最適​な​高速​制御​システム​と​なる​よう​P​と​I​が​設定​さ​れる​と、​ループ​が​容認​できる​程度​の​高速​で​設定​点​に​戻る​まで​微分​パラメータ​が​増加​し​続​け​ます。​微分​パラメータ​が​増加​すると​オーバー​シュート​が​減少​し、​安定性​の​ある​高​ゲイ​ン​となり​ます​が、​システム​は​ノイズ​の​影響​を​非常​に​受け​や​すく​なり​ます


`Auxiliary Derivative Branch` という第3のブランチを提唱し、
それはバウンダリ（つまりピクセルのセマンティクスの変化、微分値）に特化して反応するようなブランチを形成しました。

PID制御を模倣したPIDNetは

- P: ハイレゾリューションの情報を保持したブランチ
- I: コンテキスト情報に特化したブランチ
- D: 高周波数な特徴によりバウンダリーを予測するブランチ

として構成されています。

![Screen Shot 2022-11-29 at 18.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/73e9eff0-a2ca-6ce1-24ed-679328ef36cb.png)



Pは`Pixel-attention-guided fusion module (Pag)`を通して、
Iブランチから必要なセマンティクスを選択的に学習できるようにしている。
ただしOverwelm されることなく。ここはセルフアテンションのような実装になっています。

![Screen Shot 2022-11-29 at 18.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/def12f4d-ce7b-5825-31aa-86a5c770e544.png)



`Boundary-attention-guided fusion module (Bag)` を使って、３つのブランチの情報を統合します。

![Screen Shot 2022-11-29 at 18.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/47b5c516-07ee-9212-4174-e315f28e7d0f.png)



## まとめと感想

今回は、セマンティックセグメンテーションタスクにおける近年のAIモデルについて、
いろいろと潮流を理解しながら追いかけてみようとしてみました。

全てを細部まで理解することは難しいですが、画像系AIの基礎知識があれば大体の流れは理解できるはずです。
また、いわゆるAIの知識のみならず、Computer Visonの知識もAIモデルに応用されている様子をみることができ、非常に興味深かったです。
Computer Vison やいろいろな周辺知識もモデル構築のアイディアとして活用され、それらがSoTAを作っているのは非常に素晴らしいことのように感じました。

これからもAIの知識のみならず、いろんな知識をインプットしていくことが大事ですね。



今回はこの辺で。


@kenmaro