U-Net:ディープラーニングによるSemantic Segmentation手法

FCN, SegNetに引き続きディープラーニングによるSemantic Segmentation手法のお勉強。



次はU-Netについて。

U-Net

U-Netは、MICCAI (Medical Image Computing and Computer-Assisted Intervention) 2015で発表されたU-Net: Convolutional Networks for Biomedical Image Segmentationで提案されたSemantic Segmentation手法。(学会に採択されたタイミングで言うとSegNetよりも先ということか?)

学会名や論文タイトルからも分かる通り、医用画像のSegmentationを目的とした研究です。(例にHeLa細胞の画像とかが出てくる)
U-Net2015年の ISBI (IEEE International Symposium on Biomedical Imaging)Dental X-Ray Image Segmentation ChallengeCell Tracking Challengeの2部門で優勝している。


スポンサーリンク


著者による概要動画も公開されている↓

5 Minute Teaser Presentation of the U-net: Convolutional Networks for Biomedical Image Segmentation

U-Netのネットワーク構造

以下がU-Netのネットワーク図。ネットワーク構造がU字に見えるからU-Netと呼ぶらしい↓

青ボックス:画像、特徴マップ
白ボックス:コピーされた特徴マップ
ボックスの上の数字:チャンネル数
ボックスの左下の数字:縦横のサイズ
青矢印:kernel size 3×3, padding0の畳み込み、ReLU
グレー矢印:特徴マップのコピーをクロップ
赤矢印:kernel size 2×2のmax-pooling
緑矢印:kernel size 2×2、stride2の逆畳み込み
青緑矢印:kernel size 1×1の畳み込み

※このネットワーク図では具体例として入力画像と特徴マップのサイズも記載されているが、U-Netは全結合層を持たないため、入力画像サイズを固定する必要はない。
この論文では細胞と背景のセグメンテーションが目的なので出力は2チャンネル(2クラス分類)。


スポンサーリンク

Encoder-Decoder構造

U-NetFCNSegNetと同様に全結合層を持たず、畳み込み層で構成されている。U-NetSegNetのようにほぼ左右対称のEncoderDecoder構造で、Encoderのpoolingを経てダウンサンプリングされた特徴マップをDecoderでアップサンプリングしていく。

U-NetSegNetとの大きな違いは、Encoderの各層で出力される特徴マップをDecoderの対応する各層の特徴マップに連結(concatenation)するアプローチを導入した点。このアプローチはスキップ接続と呼ばれているみたいですね。

Encoderの構造はVGGの特徴抽出層とほぼ同様だが、畳み込み時のpaddingが0なため、畳み込み後は特徴マップのサイズは少しだけ小さくなる。(実装ではpaddingしているU-Netも見かけるけど…)

スキップ接続

SegNetでは、EncoderDecoderが直列に接続されていたため、特徴が伝搬する過程でpixelディティールが失われてしまい、元の画像に対してSegmentation結果が粗くなりやすい欠点があった。

U-Netでは、Encoderの各層で出力される特徴マップを、Decoderの対応する層の特徴マップに直接連結することでpixelのディティールを補っている。

前の層の特徴マップと統合するという点ではFCNのアプローチにも似ているが、FCNでは違う層の特徴マップ同士をチャンネルごとの値の足し算で統合しているのに対し、U-NetではEncoderで出力された特徴マップを別チャンネルとしてDecoderの特徴マップに追加する形で連結している。

Encoderではpadding=0の畳み込みを行って特徴マップが少しずつ小さくなっているため、Decoderで2倍にアップサンプリング(逆畳み込み)してもEncoderの特徴マップとサイズが合わない。
そのため、Encoderの特徴マップの中央部分を切り出し(crop)してDecoderの特徴マップとサイズを一致させて連結している。

Encoderでpaddingを行えばEncoderDecoderの特徴マップのサイズが一致するのでそのまま連結することができる。(そういう実装例もある)

論文では電子顕微鏡で撮影された細胞の画像を細胞と背景に分割する2クラスの分類が行われている。また、少ないデータセットで学習するためのData Augmentation方法についても記載されていた。

以前線画の自動着色で話題になったPreferred NetworksPaintsChainerGeneratorネットワークに使用されているのもU-Netだ。
https://qiita.com/taizan/items/cf77fd37ec3a0bef5d9d
https://qiita.com/taizan/items/7119e16064cc11500f32

U-Netはその後改良版のU-Net++というのも発表された。
https://github.com/MrGiovanni/UNetPlusPlus

物体検出のネットワークだと矩形の出力とかで実装が複雑になりがちだけど、畳み込み層のみで構成されたネットワークはそのまま画像が出力される分構造がシンプルで理解しやすい気がする。(学習に委ねる範囲が多いということでもあるのか?)

サンプルコード

例のごとくPyTorchの実装を探す。やっぱりpaddingしてるよなぁ。
https://github.com/hszhao/PSPNet

前も言ったけど、U-Netに限らずSemantic Segmentation系のPyTorch実装をひとまとめにしたリポジトリもある↓
https://github.com/meetshah1995/pytorch-semseg

次はPSPNetについて勉強するかな。



スポンサーリンク

関連記事

画像処理を基礎から学べるキーエンスのサイト『画像道場』
Facebookの顔認証技術『DeepFace』
SegNet:ディープラーニングによるSemantic Segmentation手法
Deep Neural Networkによる顔の個人識別フレームワーク『OpenFace』
ディープラーニング
Adobeの手振れ補正機能『ワープスタビライザー』の秘密
オープンソースのロボットアプリケーションフレームワーク『ROS (Robot Operating S...
書籍『OpenCV 3 プログラミングブック』を購入
畳み込みニューラルネットワーク (CNN:Convolutional Neural Network)
BlenderのPython環境にPyTorchをインストールする
データサイエンティストって何だ?
Point Cloud Consortiumのセミナー「3D点群の未来」に行ってきたよ
今年もSSII
BlenderでPhotogrammetryできるアドオン
機械学習について理解するための可視化ツール『MLDemos』
iPadをハンディ3Dスキャナにするガジェット『iSense 3D Scanner』
Adobe MAX 2015
人間の顔をそっくりそのままCGで復元する『Digital Emily Project』
写真から3Dメッシュの生成・編集ができる無料ツール『Autodesk Memento』
ポイントクラウドコンソーシアム
コンピュータビジョンの技術マップ
オープンソースのStructure from Motionライブラリ『Theia』
3Dディープラーニング用のPyTorchライブラリ『Kaolin』
OpenCV 3.1から追加されたSfMモジュール
SSD (Single Shot Multibox Detector):ディープラーニングによる一般...
手を動かしながら学ぶデータマイニング
OpenCV 3.1のsfmモジュールのビルド再び
第1回 3D勉強会@関東『SLAMチュートリアル大会』
OpenCVで平均顔を作るチュートリアル
C#で使える機械学習ライブラリ『Accord.NET Framework』
写真に3Dオブジェクトを違和感無く合成する『3DPhotoMagic』
オープンソースの汎用レンダラ『Mitsuba 2』
機械学習に役立つPythonライブラリ一覧
オープンソースの顔認識フレームワーク『OpenBR』
AnacondaとTensorFlowをインストールしてVisual Studio 2015で使う
続・ディープラーニングの資料
fSpy:1枚の写真からカメラパラメーターを割り出すツール
オープンソースのSLAMライブラリ『Cartographer』
UnityユーザーがUnreal Engineの使い方を学ぶには?
FCN (Fully Convolutional Network):ディープラーニングによるSema...
「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか
OpenCVの三角測量関数『cv::triangulatepoints』

コメント