MNN icon indicating copy to clipboard operation
MNN copied to clipboard

用OpenCL得到的输出不稳定

Open zhengshuo1 opened this issue 4 years ago • 4 comments

Github版本:version 1.1.4 编译及运行平台:x86 PC Win10 出现的问题:用OpenCL进行推理时,相同的输入、相同的模型,不同次的运行得到的输出不相同

zhengshuo1 avatar Apr 09 '21 01:04 zhengshuo1

你的代码、模型是?

jxt1234 avatar Apr 09 '21 02:04 jxt1234

你的代码、模型是?

模型是我们自己训练的,用于做背景分割的。 代码我贴一下推理部分的吧,您看一下? 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;

}

zhengshuo1 avatar Apr 15 '21 02:04 zhengshuo1

我们用opencl在windows上跑,视频某一帧偶尔会出现mask很怪异的情况,如下图: image

正常情况如下, image

但是cpu版本上没有出现这个问题。

请问这是什么原因

zhangyunming avatar Aug 13 '21 08:08 zhangyunming

我也遇到类似问题。本地测试分析,发现修改输入h的尺寸为32的偶数倍后问题解决。 即我原先输入为 384x224 ,修改模型为384x256就没有问题 怀疑应该是哪里up_div的逻辑有问题

wuhuangcangg avatar Aug 31 '22 03:08 wuhuangcangg

Please update lastest mnn code, retry again. If having any problem, please let me know.

bitxsw93 avatar Feb 17 '23 03:02 bitxsw93

Marking as stale. No activity in 60 days.

github-actions[bot] avatar Jan 29 '24 09:01 github-actions[bot]