2016-11-11 7 views
0

私がしたいのは、単純なピクセル単位の分類または回帰タスクを実行することです。したがって、私は入力画像とground_truthを持っています。私がしたいことは、私が円と矩形を持つ簡単なセグメンテーションタスクを行うことです。そして私は訓練したいと思います。どこに円があるのか​​、どこに長方形があるのですか?つまり、円があるすべての位置に値「1」を持ち、長方形があるすべての位置で値「2」を持つground_truth画像があります。それから私は画像とground_truth画像を.png画像の形で入力しています。caffeピクセル単位の分類/回帰

layer { 
    name: "upscore" 
    type: "Deconvolution" 
    bottom: "score_fr" 
    top: "upscore" 
    param { 
    lr_mult: 0 
    } 
    convolution_param { 
    num_output: 3 ## <<---- 0 = backgrund 1 = circle 2 = rectangle 
    bias_term: false 
    kernel_size: 63 
    stride: 32 
    } 
} 
layer { 
    name: "score" 
    type: "Crop" 
    bottom: "upscore" 
    bottom: "data" 
    top: "score" 
    crop_param { 
    axis: 2 
    offset: 18 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" ## <<---- 
    bottom: "score" 
    bottom: "ground_truth" 
    top: "loss" 
    loss_param { 
    ignore_label: 0 
    } 
} 
:私は fcn alexnet

分類から完全に畳み込みAlexNetを使用している:enter image description here

circleは、それから私は、私はどちらか私の損失層に応じて、回帰または分類タスクにすることができると思います

回帰:

layer { 
    name: "upscore" 
    type: "Deconvolution" 
    bottom: "score_fr" 
    top: "upscore" 
    param { 
    lr_mult: 0 
    } 
    convolution_param { 
    num_output: 1 ## <<---- 1 x height x width 
    bias_term: false 
    kernel_size: 63 
    stride: 32 
    } 
} 
layer { 
    name: "score" 
    type: "Crop" 
    bottom: "upscore" 
    bottom: "data" 
    top: "score" 
    crop_param { 
    axis: 2 
    offset: 18 
    } 
} 
layer { 
    name: "loss" 
    type: "EuclideanLoss" ## <<---- 
    bottom: "score" 
    bottom: "ground_truth" 
    top: "loss" 
} 

しかし、これは私が望む結果さえももたらさない。私は、ピクセル単位の分類/回帰の私の理解には何か問題があると思う。私の間違いがどこにあるのか教えてください。出力の検索は次のようになり、回帰について

EDIT 1

output_blob = pred['result'].data 

predicated_image_array = np.array(output_blob) 
predicated_image_array = predicated_image_array.squeeze() 
print predicated_image_array.shape 
#print predicated_image_array.shape 

#print mean_array 
range_value = np.ptp(predicated_image_array) 
min_value = predicated_image_array.min() 
max_value = predicated_image_array.max() 

# make positive 
predicated_image_array[:] -= min_value 

if not range_value == 0: 
    predicated_image_array /= range_value 

predicated_image_array *= 255 
predicated_image_array = predicated_image_array.astype(np.int64) 
print predicated_image_array.shape 

cv2.imwrite('predicted_output.jpg', predicated_image_array) 

出力が1×高さ×幅であり、値が実際に出力されるので、これは容易です値。しかし、出力が3(ラベル数)×高さ×幅であるため、分類/ SotMaxLayerの出力をどのように取得するのでしょうか。しかし、私はこの形の内容の意味を知らない。

答えて

0

まず、あなたの問題はregressionではなく、classificationです!

ネットに、円と長方形を認識させるには、画像とラベルの別のデータセットを作成する必要があります(例:circle - 0 and rectangle - 1)。イメージパスとイメージラベルを含むテキストファイルを作成します(例:/path/circle1.png 0 /path/circle2.png 0 /path/rectangle1.png 1 /path/rectangle1.png 1)。あなたのような問題のためにここにいいtutorialがあります。がんばろう。

+0

いいえいいえ!私は、ピクセル単位の分類または回帰タスクを実行したい。ただ簡単なもの。私はあなたが通常の分類作業でそれを行うことができることを知っていますが、私はピクセル単位の分類を行いたいと思います。私の考えは、セグメンテーション/分類を行うことでした。分かりますか? – thigi

+0

あなたも考えることができます:私は1つの画像で円と長方形を持っており、私は分割をしたい!標準分類を行う方法はわかっているので、実際に簡単にピクセル単位の予測タスクを実行できるようにしたいだけですが、後でピクセル単位の予測を行い、さらに難しいタスクを実行する必要があります。 – thigi

+0

だから、あなたは 'segmentation'でそれを行うことができます。各画像(円/矩形)に対して、GT画像(0-255)を作成する必要があります。各画像のクラス数は2(背景と幾何学的形状)であるので、 'num_output:2'です。背景を0に設定し、形状1.幸運を設定します。 –

関連する問題