Настройка слоя свертки в caffe windows cpp

У меня есть эта сеть 'RGB2GRAY.prototxt':

name: "RGB2GRAY"layer {
name: "data"type: "Input"top: "data"input_param { shape: { dim: 1 dim: 3 dim: 512 dim: 512 } }
}

layer {
name: "conv1"bottom: "data"top: "conv1"type: "Convolution"convolution_param {
num_output: 1
kernel_size: 1
pad: 0
stride: 1
bias_term: false
weight_filler {
type: "constant"value: 1
}
}
}

Я пробую свою собственную сеть, которая преобразует RGB в серый, используя эту формулу

x = 0.299r + 0.587g + 0.114b.

так что в основном я могу сделать свертку с размером ядра 1 с настроенными весами (0.299, 0.587, 0.114). но я не понимаю, как изменить слой свертки. Я установил вес и смещение, но не смог изменить значение фильтра.
Я попробовал подход ниже, но он не обновляет фильтр свертки.

shared_ptr<Net<float> > net_;
net_.reset(new Net<float>("path of model file", TEST));

const shared_ptr<Blob<float> >& conv_blob = net_->blob_by_name("conv1");
float* conv_weight = conv_blob->mutable_cpu_data();
conv_weight[0] =  0.299;
conv_weight[1] =  0.587;
conv_weight[2] =  0.114;

net_->Forward();

//for dumping the output
const shared_ptr<Blob<float> >& probs = net_->blob_by_name("conv1");
const float* probs_out = probs->cpu_data();

cv::Mat matout(height, width, CV_32F);

for (size_t i = 0; i < height; i++)
{
for (size_t j = 0; j < width; j++)
{
matout.at<float>(i, j) = probs_out[i* width + j];
}

}
matout.convertTo(matout, CV_8UC1);
cv::imwrite("gray.bmp", matout);

В python мне было проще настроить фильтр свертки, но мне нужно решение на C ++.

5

Решение

Просто в вашем коде c ++ внесите небольшое изменение:

// access the convolution layer by its name
const shared_ptr<Layer<float> >& conv_layer = net_->layer_by_name("conv1");
// access the layer's blob that stores weights
shared_ptr<Blob<float> >& weight = conv_layer->blobs()[0];
float* conv_weight = weight->mutable_cpu_data();
conv_weight[0] =  0.299;
conv_weight[1] =  0.587;
conv_weight[2] =  0.114;

По факту, «conv1«относится к выводу слоя свертки blob в вашем коде, а не blob содержащие веса и Net<Dtype>::blob_by_name(const string& blob_name)функция состоит в том, чтобы вернуть blob который хранит промежуточные результаты между слоями в сети.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]