输入层类型:图像数据在窗口咖啡cpp中给出空白输出
Input Layer type: ImageData in windows caffe cpp giving Blank Output
我正在使用cpp在窗口中使用caffe解决图像分割问题。我正在使用"图像数据"输入类型来训练网络,但在测试时我得到了空白输出。谁能帮我分析这个问题。
********** solver.prototxt ***************
test_initialization: false
base_lr: 0.01
display: 51
max_iter: 50000
lr_policy: "step"
gamma: 0.1
momentum: 0.9
weight_decay: 0.0001
stepsize: 4069
snapshot: 10000
snapshot_prefix: "snapshot"
solver_mode: GPU
net: "train.prototxt"
solver_type: SGD
File_Triangle.txt和File_label_triangle.txt具有图像位置的绝对路径和虚拟标签。例如 D:\00000032.png 0
**************** train.prototxt ********************
layer {
name: "data"
type: "ImageData"
top: "data"
top: "xx"
include {
phase: TRAIN
}
image_data_param {
source: "File_triangle.txt"
batch_size: 1
new_height: 32
new_width: 32
is_color: False
}
}
layer {
name: "label"
type: "ImageData"
top: "label"
top: "yy"
image_data_param {
source: "File_label_triangle.txt"
batch_size: 1
new_height: 32
new_width: 32
is_color: False
}
include {
phase: TRAIN
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1.0
}
param {
lr_mult: 0.10000000149
}
convolution_param {
num_output: 32
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "gaussian"
std: 0.0010000000475
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "conv2"
type: "Convolution"
bottom: "conv1"
top: "conv2"
param {
lr_mult: 1.0
}
param {
lr_mult: 0.10000000149
}
convolution_param {
num_output: 1024
pad: 0
kernel_size: 16
stride: 16
weight_filler {
type: "gaussian"
std: 0.0010000000475
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "upsample"
type: "Deconvolution"
bottom: "conv2"
top: "upsample"
param {
lr_mult: 1.0
}
convolution_param {
num_output: 1
pad: 0
kernel_size: 16
stride: 16
bias_filler {
type: "constant"
value: 128.0
}
}
}
layer {
name: "lossL1"
type: "SmoothL1Loss"
bottom: "upsample"
bottom: "label"
top: "lossL1"
loss_weight: 1.0
}
用于在 cpp 中训练的代码片段
shared_ptr<Net<float> > net_;
net_.reset(new Net<float>("train.prototxt", caffe::Phase::TRAIN));
Caffe::set_mode(Caffe::GPU);
caffe::SolverParameter solver_param;
caffe::ReadSolverParamsFromTextFileOrDie("solver.prototxt", &solver_param);
boost::shared_ptr<caffe::Solver<float> > solver(caffe::SolverRegistry<float>::CreateSolver(solver_param));
solver->Solve();
训练后,我正在使用.caffemodel来测试网络。
******************** test.prototxt **********************
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 1 dim: 32 dim: 32 } }
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1.0
}
param {
lr_mult: 0.10000000149
}
convolution_param {
num_output: 32
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "gaussian"
std: 0.0010000000475
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "conv2"
type: "Convolution"
bottom: "conv1"
top: "conv2"
param {
lr_mult: 1.0
}
param {
lr_mult: 0.10000000149
}
convolution_param {
num_output: 1024
pad: 0
kernel_size: 16
stride: 16
weight_filler {
type: "gaussian"
std: 0.0010000000475
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "upsample"
type: "Deconvolution"
bottom: "conv2"
top: "upsample"
param {
lr_mult: 1.0
}
convolution_param {
num_output: 1
pad: 0
kernel_size: 16
stride: 16
bias_filler {
type: "constant"
value: 128.0
}
}
}
用于测试的代码段。
Caffe::set_mode(Caffe::GPU);
boost::shared_ptr<caffe::Net<float> > net_;
net_.reset(new Net<float>("test.prototxt", caffe::TEST));
net_->CopyTrainedLayersFrom("snapshot_iter_50000.caffemodel");
cv::Mat matInput = cv::imread("input image path");
matInput.convertTo(matInput, CV_32F);
int height = matInput.rows;
int width = matInput.cols;
Blob<float>* input_layer = net_->input_blobs()[0];
float* input_data = input_layer->mutable_cpu_data();
int layer_index = height * width;
for (size_t i = 0; i < height; i++)
{
for (size_t j = 0; j < width; j++)
{
input_data[i*width + j] = matInput.at<float>(i, j);
}
}
net_->Forward();
const shared_ptr<Blob<float> >& concat_blob = net_->blob_by_name("upsample");
const float* concat_out = concat_blob->cpu_data();
cv::Mat matout(height, width, CV_8UC1);
for (size_t i = 0; i < height*width; i++)
{
matout.data[i] = concat_out[i];
}
cv::imwrite(output_str, matout);
我遇到了这个问题。网络正在提供适当的输出,但错误在于转储它。网络以浮点数(即上采样层)给出输出,并且不是归一化形式。下面的修改给出了正确的输出。
const shared_ptr<Blob<float> >& concat_blob = net_->blob_by_name("upsample");
const float* concat_out = concat_blob->cpu_data();
cv::Mat matout(height, width, CV_32FC1);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
matout.at<float>(i, j) = (float)(concat_out[i*width + j]);
}
}
cv::normalize(matout, matout, 0, 255, CV_MINMAX);
cv::imwrite("output image path", matout);
相关文章:
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 有没有办法简单地从 GPU 调用多个 cpp 输出文件?
- 输出错误,问题是找到总和5000位数字cpp
- cpp 返回具有相同输入的不同输出
- 在 CPP 中使用 cout 的重复输出
- CPP - strlen 不会输出多个单词的整个长度 [仅限 C 字符串]
- CPP和Java提供不同的输出
- svcutil /l:CPP /out: output_Folder_Path wsdl_folder_path 的输出
- 终端命令输出到 CPP 中的数组
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 如何比较cpp和python输出
- 输入层类型:图像数据在窗口咖啡cpp中给出空白输出
- Cpp 切换语句不会输出条件集
- 无法在 cpp 文件中通过可视化标准输出构建 yuvlib 库函数
- 如何在 CPP 中反转重定向输出操作
- 在CPP中,将输出文件作为输入文件作为输入文件
- 我有一个构造函数,但我需要将输出返回到 main.cpp.我无法使用获取字符串功能!!任何想法如何实现这一目标?
- 从不同的 CPP 文件写入输出文件
- CPP 函数无法获得正确的输出
- 将字符串映射到整型CPP -输出在执行期间挂起