caffe像素分类/回归

时间:2016-11-11 13:45:54

标签: deep-learning caffe

我想要做的是做一个简单的像素分类或回归任务。因此我有一个输入图像和一个ground_truth。我想做的是做一个简单的分割任务,我有一个圆圈和一个矩形。我想训练,圆圈或矩形的位置。这意味着我有一个ground_truth图像有价值" 1"在圈子所在的所有位置和值#34; 2"在矩形所在的所有位置。然后我将我的图像和ground_truth图像作为.png图像形式的输入。

circle enter image description here

然后我想我可以根据我的损失层进行回归或分类任务:我一直在使用来自fcn alexnet的完全卷积AlexNet

分类

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
  }
}

回归:

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"
}

然而,这甚至不会产生我想要的结果。我认为我对像素分类/回归的理解有问题。你能告诉我我的错误在哪里吗?

编辑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 x高x宽,值是实际输出值。但是如何检索分类/ SotMaxLayer的输出,因为输出是3(num标签)x height x width。但我不知道这种形状内容的含义。

1 个答案:

答案 0 :(得分:1)

首先,您的问题不是regression,而是classification

如果您想教网识别圆和矩形,您必须制作不同的数据集 - 图像和标签,例如:circle - 0 and rectangle - 1。您可以通过制作包含图像路径和图像标签的文本文件来完成此操作,例如:/path/circle1.png 0 /path/circle2.png 0 /path/rectangle1.png 1 /path/rectangle1.png 1。对于像你这样的问题,这里有一个很好的tutorial。祝你好运。