[Survey]Hypercolumns for Object Segmentation and Fine-grained Localization

# [Hypercolumn](http://arxiv.org/pdf/1411.5752v2.pdf)

認識処理などに使われる**CNN**の最終Layerの出力は、位置精度が必要なAlgorithmにとっては粗すぎるし、かといって最初のLayerは位置精度はいいけど、**Semantic**な情報がない。なのでPyramid Imageみたいに、**CNN**の各Layerの同じ位置の出力をまとめて一つのFeature(**Hypercolumn**)として使うというのが大まかな内容です。その時に各Layerの出力サイズが異なるので、入力サイズと合わせるように拡大します。


![範囲を選択_101.png](https://qiita-image-store.s3.amazonaws.com/0/100523/bebd27f7-05d0-cdda-934c-f505b48a1425.png)

この論文では**Hypercolumn**としてまとめるLayerは全Layerではなく、適当な層を選んでいます。

![範囲を選択_102.png](https://qiita-image-store.s3.amazonaws.com/0/100523/0fe8f0fd-131f-c51f-6116-da7cef101feb.png)

論文中では、fc7とconv4とpool2を使うと書いてあったのですが、上の図しかなくどこのことだかさっぱりわからないです。
著者の前の論文["Simultaneous detection and segmentation"](http://arxiv.org/pdf/1407.1808v1.pdf)を見ると下記の図があります。

![範囲を選択_103.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8fa91b14-a34d-49e6-a04e-0e7d0bd2cc20.png)

これと一致した場所のFeatureを取り出しているようです。そもそも実験の目的は、この前の論文の結果をRefinementしたいということなので。
ただし、馬の絵の図の最後のFeatureを抜き出している位置がfc6になっていて、論文中はfc7って書いてあるから、図が間違っているのか何なのかよくわからないです。細かいことは気にするなということかな？

やりたいことは、物体検出を**Bounding Box**ではなく、**Segmentation**でやりたいと言うことのようです。

以降は、実験結果が書いてあるのですが、あんまりおもしろくないので飛ばします。

ただ、Hypercolumnというのは面白いですし、違う著者の別の論文ですが[”Inside-Outside Net: Detecting Objects in Context with Skip Pooling and Recurrent Neural Networks”](http://qiita.com/supersaiakujin/items/bb07ccd92a70b130ba2e)の中でも各Layerの出力を一個にまとめて使ったりしています。Hypercolumnの論文とIONの論文の共著に同じ人（Ross Girshickさん）がいるので、そのへんの関係かもしれないです。

ただIONの論文では、各Layerの出力の大きさが異なるから、層ごとに正規化して結合するということをしているので、Hypercolumnでもしたほうがいいかもしれないです。試していないのでわかりませんが。

# Hypercolumn可視化
Hypercolumnに関しては、下記のサイトでVGG-16を使ったHypercolumnの可視化をされている方がいます。
http://blog.christianperone.com/2016/01/convolutional-hypercolumns-in-python/

# Automatic Colorization
Hypercolumnに興味を持ったのは、下記のサイトの**Automatic Colorization**でHypercolumnが使われていたからでした。
http://tinyclouds.org/colorize/

下記からYoutubeのColorization結果の動画が見られます。
[![AutomaticColorization](http://img.youtube.com/vi/_MJU8VK2PI4/0.jpg)](https://www.youtube.com/watch?v=_MJU8VK2PI4)

このサイトのAutomatic Colorizationは白黒の映像を手がかりを全く使わないで（Non Reference）でColor化するというものです。
Colorization自体は以前からあって、この手法のようにNon Referenceでやる方法とマニュアルで何箇所か色を指定してもらって、あとは自然になるように全体の色をつけるというものがあります。

このサイトの著者が最初にやりたかったことは、
まず下記のような感じでHypercolumnを作成します。このときのネットワークはVGG-16です。
![BlockDiagram1](http://tinyclouds.org/colorize/hypercolumns.png)

出来上がったHypercolumnをoperation?でUV Channelにして、入力のYと結合してColor画像を作ります。
![BlockDiagram2](http://tinyclouds.org/colorize/hypercolumn-classification.png)

Operation?は、９６３次元が２次元になるようなWeightとBiasで出てきた結果をSigmoidを通してユークリッド距離が小さくなるように学習します。

その他にこの著者は、 "residual encoder" も試したようです。これはHypercolumnではなくてMicrosoftがILSVRC 2015で1位になった時の手法[Deep Residual Learning for Image Recognition](http://qiita.com/supersaiakujin/items/935bbc9610d0f87607e8)からヒントを得たと書いてあります。

Microsoftのresidual connectionは、入力からの差分を学習するようにしたものです。
このColorizationの場合は、入力というのがVGG-16のFeatureの出力で、差分というのがColor情報に対応しているという感じでしょうか？

ネットワークは以下のとおりです。
![BlockDiagram3](http://tinyclouds.org/colorize/residual_encoder.png)

HypercolumnとResidual encoderの比較は下記の通りです。
Residual encoderの方が良さそうです。
![Performance](http://tinyclouds.org/colorize/hypercolumns_vs_residual_encoder.png)

結果はこんなかんじです。
右から白黒画像、auto colorization、manual colorization from Redditです。
![Result](http://tinyclouds.org/colorize/reddit1/full.jpg)
![Result](http://tinyclouds.org/colorize/reddit2/full.jpg)
![Result](http://tinyclouds.org/colorize/reddit3/full2.jpg)
![Result](http://tinyclouds.org/colorize/reddit4/full.png)
![Result](http://tinyclouds.org/colorize/reddit5/full.png)