きっかけ
kaggleであるコンペに参加しようとしてkernelを見たところ、みんな「u-net」ってアルゴリズムの話をしていた。聞いたことがなかったし全然分からなかったので調べてみた。
論文の著者が5分で簡単に説明している動画があるので、その内容をまとめる。
5 Minute Teaser Presentation of the U-net: Convolutional Networks for Biomedical Image Segmentation - YouTube
5 Minute Teaser Presentation of the U-net: Convolutional Networks for Biomedical Image Segmentation
youtube動画に対して、私が英語の文字起こしをして、さらに日本語訳の字幕を追加した。しかし現時点ではどちらも表示されていなくて悲しい……(誰かが字幕の審査をしてOKを出さないと表示されない。どなたか文字起こし・字幕の審査にOKを出してくれるとありがたい)
※この記事を書くにあたり、u-netの論文は読んでいません。ご注意ください。
概要、何に使うのか
u-netは画像のセグメンテーションのためのアルゴリズム。2015年に発表された。
手法のキモはどこか
u-netのアーキテクチャ(構成図)はこちら。
これがU字型に見えるからu-netって名前なんですね、
3×3のkernelを用いて畳み込みをして、Max-poolingで縮小、という処理はCNNで一般的だ。その後、2×2のkernelを用いて拡大をして、元のサイズに戻す。
畳み込み→拡大という流れはAuto-Encoderと似ているのだが、縮小段階の途中の特徴量マップを、拡大段階の学習で再度使用するというのが最大の特徴である。
具体的に説明しよう。
図の上部に長い右向きの灰色矢印がある。矢印左側では、縮小段階の途中の568×568の特徴量マップが64枚ある。
矢印右側では、アップサンプリングしてきた392×392の特徴量マップが64枚ある(64という数字は直接登場しないが、結合結果が128枚であることから64枚と考えられる)。
縮小途中の64枚+アップサンプリングしてきた64枚 の合計128枚を結合(concatenate)したのちに入力として、次の特徴量マップ(390×390サイズ、64枚)を作る。
矢印の左右で画像サイズが異なるので、568×568から中央392×392だけを切り出して(crop)使用している。
通常のCNNは畳み込みでパディングをしているが、u-netの畳み込み時には、実行しない。
このため画像サイズが処理を経るごとに小さくなっていく。
(なんでパディングをしないのかは謎。kaggle上での実装を見てみると普通にパディングしてる例もある。)
先行研究と比べてどこがすごいか?
学習に使う画像の数が少なくても良いらしい。
あと学習および学習後の適用が高速である。(u-netは全結合の層が全く無いので、パラメータ数が小さい。それが速い理由だろうか?)
既存手法に比べて画像セグメンテーションの精度が良い。
参考
論文著者のサイト:U-Net: Convolutional Networks for Biomedical Image Segmentation
機械学習の論文を日本語でまとめているarXivTimes上での説明:
U-Net: Convolutional Networks for Biomedical Image Segmentation - Issue #294 - arXivTimes/arXivTimes - GitHub