c++ - learning - caffe tutorial
Personalizar la capa de convolución en caffe windows cpp (1)
Tengo esta red ''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
}
}
}
Estoy probando mi propia red que convierte RGB en gris usando esta fórmula
x = 0.299r + 0.587g + 0.114b.
así que, básicamente, puedo hacer convolución con un tamaño de kernel de 1 con pesos personalizados de (0.299, 0.587, 0.114). pero no entiendo cómo modificar la capa de convolución. He establecido los pesos y el sesgo pero no he podido modificar el valor del filtro. He intentado el siguiente enfoque pero no actualiza el filtro de convolución.
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);
En Python, me pareció más fácil personalizar el filtro de convolución, pero necesito la solución en C ++.
Solo en su código c ++ haga un pequeño cambio:
// 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;
De hecho, " conv1
" se refiere al blob
salida de la capa de convolución en tu código, no al blob
contiene pesas y la función de Net<Dtype>::blob_by_name(const string& blob_name)
es devolver el blob
que almacena los resultados intermedios entre las capas dentro de una red