茨城エンジニアのPython開発日記

茨城のITベンチャー企業ではたらく2年目エンジニア。Pythonで色々なものを作成中。

論文読んでAIつくるぞ会(第10回) ~DeepLab v3+を読んでみた~


ブログから記事を見つけたい場合はこちら

ブログ地図 - 茨城エンジニアのPython開発日記

こんにちは。

開発メンバーのKです。
忌まわしい花粉症の症状がやっと収まってきました。
もし自分が転生するなら、花粉耐性のスキルは持っておきたいですね。


さて、今回は、DeepLab v3+の論文を読んでみました。
実装はしていないですが、得た知識をまとめておこうと思います。


以下、目次です。

1. 論文の概要

読んだ論文 DeepLab v3+はgoogleの人たちが書いた論文です。
タイトル: Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
URL: https://openaccess.thecvf.com/content_ECCV_2018/papers/Liang-Chieh_Chen_Encoder-Decoder_with_Atrous_ECCV_2018_paper.pdf

タイトルにはDeepLab v3+とは書いてありませんが、論文内には書いてあります。
"v3+"とついていることからわかるようにこれはDeepLab v3を拡張したものです。
v1やv2もあります。(これらは読んでいませんが。。)
また、タイトルにあるようにこれはSemantic Segmentationについての論文です。

このネットワークではSpatial Pyramid Pooling導入してみたり、Encoder-decoderの構造にしてみたりしています。また、Atrous convolution (Dilated convolution) を使っています。(図の(c)参照)

f:id:tottorisnow33:20210327134855p:plain
Encoder-DecoderでSPPの入った構造

Encoder-decoderの構造、SPP、Atrous convは重要なポイントだと思うので次の節で触れていきます。

2. Encoder-decoder

これはいわゆるU-Net(https://arxiv.org/pdf/1505.04597.pdf,)の構造をしています。
図にすると下のようなものです。

f:id:tottorisnow33:20210327135332p:plain
U-Netの構造

この構造は、まず入力に対してconvとpoolingで特徴を抽出していきます。
図でいえば、input image tileをconvして(青矢印)、poolingして(赤矢印)、またconvしてpoolingして....
と続いて画像サイズは小さいがしっかり特徴を抽出した状態にします。これがDeepLabで言っているEncoder部分です。
それから、up-conv(緑矢印)とconv(青矢印)で元の解像度に戻していきます。これがDecoder部分です。

ここのポイントはEncoderのレイヤからDecoderのレイヤに対して、対応する画像サイズごとにskipしてconcatenationしていることです(グレー矢印)。
Encoder部分では特徴量は不十分ですが、convをあまりかけていないので細かい(あまりぼけていない)情報が入っています。一方でDecoder側は特徴量は十分抽出していますが、convをたくさん書けたのであらい(ボケている)情報が入っているはずです。
そのため、Encoderのボケてない情報とDecoderの特徴量が十分に抽出できている情報を合わせることで、画像的にくっきりとしつつ特徴もしっかりとれているような特徴マップを得られます。
特徴量を抽出することだけでなく、ボケていないことが、ピクセルごとに推定をするSemantic Segmentationタスクに対してとても重要なことなのでしょう。

3. Spatial Pyramid Pooling(SPP)

SPPを使ったネットワークしてPSPNet(https://openaccess.thecvf.com/content_cvpr_2017/papers/Zhao_Pyramid_Scene_Parsing_CVPR_2017_paper.pdf)が有名かと思います。

これは、下図のように、特徴マップに対して複数のpoolingを並列に適用して、複数の解像度のレイヤを作ります。
PSPNetの論文では図のように、1 x 1、2 x 2、3 x 3、6 x 6の解像度に分けています。

f:id:tottorisnow33:20210327140757p:plain
PSPNetのPyramidモジュール

1 x 1にpoolingすれば画像全体のcontextを得られます。一方で2 x 2にpoolingすると、左上のcontext、右上のcontext、それから、左下と右下のcontextともう少し細かい領域でのcontextを得られます。3 x 3、6 x 6ならさらに細かくなります。このように画像全体のcontextが何か、細かい部分のcotextが何か、といった情報を抜き取るわけです。
それから、図のように入力特徴マップと同じ解像度までUpsamplingして、入力特徴マップとConcatしてPyramid Poolingで得た情報を付け加えます。
マルチスケールでcontextを得ることができるので、特徴抽出するのに有効な手段といえるでしょう。

4. Atrous convolution

普通、3 x 3 のカーネルでconvoutionした場合、出力特徴マップの1点の情報は、入力特徴マップの3x3の情報を含んでいます。しかし、Atrous convolutionでは、3 x 3のカーネルが下図のrate 6やrate 24のように広がって特徴を抽出します。(ちなみにrate 1は普通のconvolutionのこと)

f:id:tottorisnow33:20210327141744p:plain
Atrous convのイメージ

なので、例えばrate 6 の場合、出力特徴マップの1点の情報は、入力特徴マップの13x13の広さの情報を含むことができます。また使ているのは3x3カーネルなのでパラメータの数は普通のconvと一緒です。
ただ、3x3カーネルを広げているだけなので、飛び飛びの情報を使っていることになります。
とはいえ、convのパラメータ数を変えずに、局所受容野を大きくすることができるのはとても良い点でしょう。
さらにpoolingと比較すると、poolingは受容野を大きくする代わりに解像度を小さくしてまうのに対して、Atrous convは受容野を大きくしつつ解像度は変えないことも大きなポイントです。

Atrous convについては、下記のリンクでアニメーションでイメージを掴めるので、参考にしてみるとよいかと思います。
towardsdatascience.com

5. Deeplab v3+の構造

Deeplab v3+は、Encoder-Decoderの中にSPPモジュールを入れつつ、Atrous convも入れているようなネットワークです。
SPPは、Atrous spatial pyramid pooling(ASPP)というものにしているようですが、すいませんがそこまでは調べていません。

f:id:tottorisnow33:20210327143954p:plain
Atrous convのイメージ

6. カードゲームのごとく手札を増やしたい

今回実装はしていないですが、U-Netという構造やSPPモジュール、Atrous convというものを知ったことはとても大切なことだと思います。
DeepLab v3+のように有効な手段を組み合わせるということは性能を上げるために必要なことだと思うからです。
カードゲームでいえば手札が増えたことになります。手札を増やして、各手札の効果を理解しておけば、どこでどんなカードを切ればよいかわかるようになります。
DeepLab v3+は、良いカードをうまく組み合わせて活用できた良い例なのかなと思います。

これからもカードの効果をよく理解しながら手札を増やして、自分の中で最強のデッキを構築していきたいです。
(これからも勉強していろんな知識を得たいですの意)

7. 次回

次回からは、AIを応用したアプリ開発のほうを進めていきたいなと思います。
どうせならかっこいいものを作りたいと思ってます。