用OpenCL得到的输出不稳定
Github版本:version 1.1.4 编译及运行平台:x86 PC Win10 出现的问题:用OpenCL进行推理时,相同的输入、相同的模型,不同次的运行得到的输出不相同
你的代码、模型是?
你的代码、模型是?
模型是我们自己训练的,用于做背景分割的。 代码我贴一下推理部分的吧,您看一下? int SegmentBG::segmentBackground(const cv::Mat& srcBGRImg, cv::Mat& dstMask) { if (!initialized) { std::cout << "model uninitialized." << std::endl; return 10000; } if (srcBGRImg.empty()) { std::cout << "input empty." << std::endl; return 10001; }
//mImgBGRA(bgrImgSrc.size(), CV_8UC4);
int width = srcBGRImg.cols;
int height = srcBGRImg.rows;
int size_w = inputSize_.width;
int size_h = inputSize_.height;
float ratio = 1.0f * width / height;
int dst_w = int(my_min(size_h * ratio, size_w));
int dst_h = int(my_min(size_w / ratio, size_h));
int origin_x = (size_w - dst_w) / 2;
int origin_y = (size_h - dst_h);
cv::resize(srcBGRImg, mResizedImgBGR, cv::Size(dst_w, dst_h));
// pad
int top = origin_y;
int bottom = size_h - dst_h - top;
int left = origin_x;
int right = size_w - dst_w - left;
cv::copyMakeBorder(mResizedImgBGR, mPaddingImgBGR, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(128, 128, 128));
auto nhwc_data = nhwc_Tensor->host<float>();
auto nhwc_size = nhwc_Tensor->size();
for (int i = 0; i < MNN_BG_HEIGHT; i++)
for (int j = 0; j < MNN_BG_WIDTH; j++) {
for (int k = 0; k < 3; k++) {
mPreImage[i][j][k] = (mPaddingImgBGR.at<cv::Vec3b>(i, j)[k] - mean[k]) * normals[k];
}
if (frame_cnt == 0) {
mPreImage[i][j][3] = 0;
} else {
mPreImage[i][j][3] = 1 - mMaskData[i][j];
}
}
}
::memcpy(nhwc_data, mPreImage, nhwc_size);
input_tensor_->copyFromHostTensor(nhwc_Tensor);
// run inference
seg_interpreter_->runSession(seg_sess_);
if (USE_CPU) {
float* pred = output_tensor_->host<float>();
float sum = 0.0f;
for (int k = 0; k < MNN_BG_HEIGHT; k++) {
for (int l = 0; l < MNN_BG_WIDTH; l++) {
mMaskData[k][l] = expf(pred[(MNN_BG_WIDTH * k + l) * 4]) / (expf(pred[(MNN_BG_WIDTH * k + l) * 4]) + expf(pred[(MNN_BG_WIDTH * k + l) * 4 + 1]));
}
}
}
else {
MNN::Tensor host_output(output_tensor_, output_tensor_->getDimensionType());
output_tensor_->copyToHostTensor(host_output);
float* pred = host_output->host<float>();
//softmax
//float sum = 0.0f;
for (int k = 0; k < MNN_BG_HEIGHT; k++) {
for (int l = 0; l < MNN_BG_WIDTH; l++) {
mMaskData[k][l] = expf(pred[MNN_BG_WIDTH * k + l]) / (expf(pred[MNN_BG_WIDTH * k + l]) + expf(pred[MNN_BG_WIDTH * MNN_BG_HEIGHT + MNN_BG_WIDTH * k + l]));
//sum = sum + abs(pred[MNN_BG_WIDTH * k + l]) + abs(pred[MNN_BG_WIDTH * MNN_BG_HEIGHT + MNN_BG_WIDTH * k + l]);
}
}
}
cv::Mat ori_mask(size_h, size_w, CV_32FC1, mMaskData);
cv::Rect rect(origin_x, origin_y, dst_w, dst_h);
//后处理,抑制抖动
if (frame_cnt == 0) {
mPre = ori_mask(rect).clone();
cv::resize(mPre, dstMask, cv::Size(width, height));
}
else if (frame_cnt >= 1) {
int diffNum = 0;
cv::Mat nowFrame = ori_mask(rect).clone();
cv::Mat nowDoneFrame = nowFrame.clone();
for (int k = 0; k < dst_h; k++) {
for (int l = 0; l < dst_w; l++) {
nowDoneFrame.at<float>(k, l) = (mPre.at<float>(k, l) * mPreWeight + nowFrame.at<float>(k, l) * (1 - mPreWeight));
if (abs(mPre.at<float>(k, l) - nowFrame.at<float>(k, l)) > mMovingThreshold) {
diffNum++;
}
}
}
if (diffNum > mDetectMovingNum) {
mPre = nowFrame;
cv::resize(nowFrame, dstMask, cv::Size(width, height));
}
else {
mPre = nowDoneFrame;
cv::resize(nowDoneFrame, dstMask, cv::Size(width, height));
}
}
frame_cnt++;
return 0;
}
我们用opencl在windows上跑,视频某一帧偶尔会出现mask很怪异的情况,如下图:

正常情况如下,

但是cpu版本上没有出现这个问题。
请问这是什么原因
我也遇到类似问题。本地测试分析,发现修改输入h的尺寸为32的偶数倍后问题解决。 即我原先输入为 384x224 ,修改模型为384x256就没有问题 怀疑应该是哪里up_div的逻辑有问题
Please update lastest mnn code, retry again. If having any problem, please let me know.
Marking as stale. No activity in 60 days.