2016-07-09 6 views
1

単純なセマンティック画像セグメンテーションタスク(つまり、画像の各ピクセルを2つのクラスのいずれかに属するものとして分類する)にCaffeを使用しようとしています。Caffe:セマンティックセグメンテーションの画像データの読み込み方法

私は2つの問題:1)データ準備、2)ネットワークレイヤーの定義がついています。

私はいくつかの例を読むことを試みました。

リンクは有用であるが、彼らは、特に2D画像とセマンティックセグメンテーションには適用されません。

Iは非常に滑らかパイプラインの次のために(も短い)コード例を理解するであろう:

  1. 正しい形式の画像ラベル(2Dアレイ)を調製します。 MemoryDataまたはHDF5を入力として使用する例は完璧です!
  2. ネットワークのprototxtを正しく定義し、データと上記のラベルを入力します。

ありがとう!

答えて

2

チュートリアルはまだありませんが、これについてのCaffeマスタースレッドにはがありますが、Caffeでセマンティックセグメンテーションを行うためのチュートリアルがかなりあります。まず、Fully Convolutional Networks masterのチュートリアルと、tutorial on using SegNet(別途GitHub here)のチュートリアルを参照するか、DeepLabを使用する必要があります。これらは、セマンティックセグメンテーションのためにCaffeを使用する最先端の方法です。

より直接あなたの質問に答えるために、

1)データ準備:より最近の深い学習アプローチに興味を示している誰かとして 、あなたはおそらく、データを行うには一つの方法が存在しないことを発見しただろう準備。それらは数学的に可能なもの(最終的に完全に接続されたレイヤーを持つネットワークでは、同じ比率、通常は同じサイズの画像が必要です)とパフォーマンス(平均減算)を向上させるものの両方に依存します。つまり、いくつかのテクニックがあります(この時点で、完全畳み込みネットワークのようにさまざまなスケールの画像を使用することが簡単にできると想定します)。クロップの仕組みを見たい場合は、 CaffeのImageNetチュートリアルのデータ準備についての説明)。 Transformerクラスを使用して、ほとんどの人は、次の操作を行います。セグメンテーションの文脈では

transformer.set_transpose('data', (2,0,1)) # move image channels to outermost dimension 
transformer.set_mean('data', mu)   # subtract the dataset-mean value in each channel 
transformer.set_raw_scale('data', 255)  # rescale from [0, 1] to [0, 255] 
transformer.set_channel_swap('data', (2,1,0)) # swap channels from RGB to BGR 

を、それはあなたがする必要があるすべてです。セマンティックラベルは、画像そのもの(通常)の形をしています。例えば、パスカルVOCカフェの例では、あなたが

n.data, n.label = L.Python(module = 'pascal_multilabel_datalayers', layer = datalayer, ntop = 2, param_str=str(data_layer_params)) 

としてラベルに読み** 2)ネットワーク層の定義**

ネットワーク層の定義については、ニューラル程度華麗なビットの1つを覚えています入力と出力のほかに、さまざまな種類のデータを扱うことができます。したがって、中間層のすべてが同じになり、実際には入力が同じになります。あなたが最後に必要とするのは、画像に対するクロスエントロピー損失を評価するためのものです。 DeepLabのために、彼らはこれを行う"Interp" layerを書いた。一方、SegNetは"Upsample" layer typeと書いています。これはsoftmaxの前に使って、ラベルと同じサイズのネットワーク出力を作成してから、simply use a Softmax

私はこのすべてに欠点がないと思いますこれをCaffeで正しく行うための明確な方法ですが、うまくいくのは成功例がたくさんあることです。これが役に立ったら