インターンで画像の分類をしているのですが、最近はFCNのようなセグメンテーションをタスクに使っているので代表的な手法をいくつかまとめようと思います。
Fully Convolutional Networks for Semantic Segmentation
AlexNetやVGGの全結合層をConvolution層に置き換えることで画像を
ピクセル単位で推定する(Semantic Segmentationする)手法を提案しました。非常に読み応えのある論文で、今までに10回くらい読んでいますが新しい発見が毎回あります。
ポイントはいくつがあるので、一つ一つまとめていきます
この論文の手法の最も重要な提案手法は、CNNの最後の全結合層をConvolutionに置き換えるということです。例えば、AlexNetのConv5の次の全結合層は6x6のConvolution層と見なすことができます。このようにCNNの全結合層をConvolution層に置き換えることで出力を分類クラスではなく二次元マップに変えることができます。
この手法によって二次元画像から二次元のPredictionマップを出力することの利点は何でしょうか?論文では以下の利点があると述べられています。
一つ目は「任意のサイズの画像の入力が可能になる」ことです。全結合層に入力するマップのサイズは決まっていますが、Convolution層に変えることでその制限はなくなります。(小さすぎるマップは入力できませんがパディングを入れることで解決できます。)
二つ目は「Conv層の被りがなくなる」ことです。例えば大きいサイズの画像から224x224の画像を少しずつずらして切り出し一つ一つクラスを推定することでpredictionマップを生成することができます。しかし、そのような手法ではconv層などのフィルターは画像の同じ場所に何回も適用されるようになります。つまり、同じ計算を何度も繰り返していて効率が悪くなってしまうのです。FCNを適用しネットワークに大きいサイズの画像を入力することでこの問題は解決することができます。
二つの利点を述べましたが、一つこの手法には問題点があります。
ストライドが2以上のフィルターによって解像度が落ちてしまうということです。例えばAlexNetやVGGでは解像度が1/32まで落ちてしまいます。論文では幾つか対策が述べられていますが、結局Deconvolution層を追加する案が提案されています。Deconvolution層では特徴マップの1
ピクセルを任意の大きさに拡大します。そして、その重みも学習することができます。
最後に、スキップ
アーキテクチャーという手法を紹介します。CNNは畳み込みを繰り返すに連れて画像の高次な特徴を抽出します。一方でローカルな特徴はPoolingを繰り返すに連れて失われていきます。つまり下位のレイヤーはローカルな情報を持ち、上位のレイヤーは高次な特徴を持っているということです。このいいところを両取りしたのがスキップ
アーキテクチャーです。下位のレイヤーの特徴マップを上位の特徴マップと合流させます。これにより精度の向上が確認されました。
SegNet
SegNetは2016年に
IEEEで発表されました。風景画像のセグメンテーションを
高速、省メモリで行う、というのが研究のモチベーションとなっています。では、高速化、省メモリ化の工夫とは一体どのようなものでしょうか。
一つはネットワーク構造にあります。FCNのネットワークの、全結合層を畳み込み層に置き換えた部分は計算量が多くなっていて学習に時間がかかったりメモリを多くとる原因となっていました。SegNetでは全結合層だった部分を削除したEncoder-Decoder構造を採用しています。これによって高速化、省メモリ化を達成できたようです。
SegNetの工夫は右半分のDecoder部分にもあります。Decoder部分のMaxPoolingで採用した値の場所を記録し、upsampling時にその場所を使って特徴マップを拡大します。これにより位置情報を正確化させているのです。
追記
先日さらにSegNetの論文を読み直したところ、実験上の工夫を発見しました。
セグメンテーションの課題ではどうしてもクラスごとにピクセル数の偏りが出てしまいます。そこで、採用されたのがClass balancing と言う手法です。クロスエントロピー誤差を取る時に各クラスのピクセル数に応じてその大きさを重み付けします。SegNetの論文では各クラスのピクセル数とその中央値の割合を使って行っています。これを行わないと各クラスのピクセル数の割合が事前確率のようになってしまい結果が引っ張られてしまいます。
U-net
U-netは医療画像のセグメンテーションのために提案されました 。セグメンテーションのタスクにおいて現時点でのstate-of-the-artと言われていてKaggleコンテストの優勝者が使っていたりします。
U-netではSegNetのようなEncoder-Decoder構造をしていて、Encoder部分とDecoder部分の対応した解像度の特徴マップをつないでいます。論文では図がU型に配置されていてこれがU-netの名前の由来だそうです。
その他の工夫としては、重み付けロスの採用があります。
医療画像のセグメンテーションにおいてオブジェクト同士の境界をはっきり出すことは重要です。そのため、境界部分のロスを大きくし、はっきりと判読できるよう工夫しています。つまり、タスクの目的にあった画像の前処理が必要ということです。かなり骨の折れる(辛い)作業になりそうですが、ディープラーニングの課題において前処理は重要なんですね。