Segmentationについて勉強する。Segmentationは「何が写っているか」で画像領域を分割するタスクのことを指す。Segmentationは画像をpixel単位でどのクラスに属するか分類する。そのためPixel-labelingとも呼ばれる。ディープラーニング以前から様々な手法が提案されている。Methodsスライドはこちら。Segmentationでは出力ユニット数は画像サイズ×分類クラス数となる。(入力ユニット数は同様に画像サイズ)pixelごとにラベル付けされた教師データを与えて学習することで、入力画像の各pixelがどのクラスに分類されるかの確率を出力できるようになる。Network)から勉強しよう。Segmentation手法。network公式でCaffeによる実装も公開されている↓https://github.com/shelhamer/fcn.berkeleyvision.orgFCNの大きな特長は、全結合層を持たず、ネットワークが畳み込み層のみで構成されていること。Segmentation用に改良するFCNでは、一般物体認識の畳み込みニューラルネットワーク(実装例ではVGG-16)の全結合層を1×1の畳み込み層に置き換えている。(実装例では、特徴抽出には一般物体認識向けにImageNetで学習したVGG-16の畳み込み層を流用してfine-tuningしている)全結合層では、全pixelに対して接続しているノードごとに重みをかける処理を行っていた。これはつまり、ノードの数だけ1×1の畳み込みを行う処理と同等である。全結合層を無くすことで、従来の畳み込みニューラルネットワークのように入力画像のサイズを固定する制約がなくなった。全結合層を畳み込み層に置き換えると、クラス分類の結果がヒートマップとして出力されるようになる。スポンサーリンク特徴マップのサイズはMaxプーリングを経て小さくなっているため、入力画像H×Wに対して特徴マップのサイズはH/32×W/32になっている。アップサンプリングそこで、小さくなった特徴マップを入力画像と同サイズにアップサンプリングしてpixel単位のクラス分類を行う。逆畳み込み(Deconvolution)アップサンプリングには逆畳み込み(Deconvolution)という処理を施す。逆畳み込みと呼ばれているが、畳み込み(convolution)の逆プロセスというわけではない。convolution(転置畳み込み?)などとも呼ばれる。strideにそれぞれpixel数を指定する。逆畳み込みで実際に行われるのは、以下のように特徴マップを拡大してから畳み込む処理。size-1だけ特徴マップの周囲に余白を取りpaddingで指定されたpixel数だけ余白を削り畳み込み処理を行うこちらのgifで具体的に見てみよう。segmentationの結果は物体の境界がぼやけたものとなる。そこで、特徴抽出の最終層だけでなく、途中のpooling層で出力される大きいサイズの特徴マップも活用する。特徴マップのサイズは各層で異なるので、最終層の特徴マップから順にアップサンプリングで前の層と同サイズに拡大し、チャンネルごとに足し算する。以下の図は、VGG-16に5つあるpooling層の内、3~5番目の特徴マップを利用する例。足し算後の特徴マップに対して1×1の畳み込み処理を行う。segmentationが可能となる。(なんかSSDにも似てるな)全体平均poolingFCNの出力層の直前には全体平均poolingが導入されている。これにより、特徴マップの各チャンネルが特定の物体クラスを表すようになる。サンプルコード簡単に試せるサンプルコードを探してみたんだけど、データセットの読み込み回りでエラーになるコードが多くてしんどかった。(FCNは入力画像サイズが固定じゃなくなったとはいえ、どんなpixel数の画像でもOKというわけではなく、縦横がアップサンプリング層での拡大率の倍数である必要はある)やっとシンプルなPyTorch実装のサンプルを見つけた↓(Readmeは中国語だけど)https://github.com/bat67/pytorch-FCN-easiest-demo次はSegNetを勉強しようか。Segmentation手法のお勉強。次はSegNetについて。コメントデータの処理方法の詳細はこちらをご覧ください。toProfileNegativeMind都内で働くソフトウェア系エンジニア・リサーチャー。大学・大学院では3DCGのレンダリングアルゴリズムを研究してた。Mayaを使って映像制作もできるようになった。特撮・模型趣味も再燃。最近はPhotogrammetryや機械学習について勉強中。