opencv caffe模型加载 c++ 一个用来降维叫做DimensionalityReduction的层

读入参数

参数order1,order2,order3,order4

将需要保留的维度的参数赋值为1,将需要删除的维度的参数赋值为1

DimensionalityReductionLayer(const cv::dnn::LayerParams &params) : Layer(params)
	{
		order1 = params.get<int>("order1", -1);
		order2 = params.get<int>("order2", -1);
		order3 = params.get<int>("order3", -1);
		order4 = params.get<int>("order4", -1);
	}

确定输出参数格式

virtual bool getMemoryShapes(const std::vector<std::vector<int> > &inputs,
		const int requiredOutputs,
		std::vector<std::vector<int> > &outputs,
		std::vector<std::vector<int> > &internals) const CV_OVERRIDE
	{
		CV_UNUSED(requiredOutputs); CV_UNUSED(internals);
		cout << "start DimensionalityReductionLayer getMemoryShapes" << endl;
		std::vector<int> order(4);
		order[0] = order1;
		order[1] = order2;
		order[2] = order3;
		order[3] = order4;

		int dim = 0;
		for (int i = 0; i < 4; i++) {
			if (order[i] <0) {
				break;
			}
			else {
				dim++;
			}
		}

		std::vector<int> newShape;
		for (int i = 0; i < dim; i++) {
			newShape.push_back(inputs[0][i]);
		}

		std::vector<int> outShape; //创建一个不定长数组
		int count = 0;
		for (int i = 0; i < dim; i++) {
			if (order[i] == 1) {
				continue;
			}
			outShape.push_back(newShape[i]);			
		}
		outputs.assign(1, outShape);
		for (int i = 0; i < outShape.size(); i++) {
			cout << outShape[i] << "   ";
		}
		return false;
	}

计算过程

virtual void forward(std::vector<cv::Mat*> &inputs, std::vector<cv::Mat> &outputs, std::vector<cv::Mat> &internals) CV_OVERRIDE
	{
		CV_UNUSED(internals);
		cout << "start DimensionalityReductionLayer forward1" << endl;
		cv::Mat& inp = *inputs[0];
		cv::Mat& out = outputs[0];
		std::vector<int> order(4);
		order[0] = order1;
		order[1] = order2;
		order[2] = order3;
		order[3] = order4;
		//断言 至少剩下两个维度,去掉的维度都是1
		int dim = 0;
		std::vector<int> dimind(4);
		for (int i = 0; i < 4; i++) {
			if (order[i] <0) {
				break;
			}
			else {
				dim++;
			}
			if (order[i] == 0) {
				dimind.push_back(i);
			}
		}
		if (dim == 4) {
			int B = inp.size[0];
			int C = inp.size[1];
			int H = inp.size[2];
			int W = inp.size[3];
			std::vector<int> sq;
			for (int b = 0; b < B; b++) {
				sq.push_back(b);
				for (int c = 0; c < C; c++) {
					sq.push_back(c);
					for (int h = 0; h < H; h++) {
						sq.push_back(h);
						for (int w = 0; w < W; w++) {
							sq.push_back(w);

							if (dimind.size() == 3) {
								out.ptr<float>(sq[dimind[0]], sq[dimind[1]])[sq[dimind[2]]] = inp.ptr<float>(sq[0], sq[1],sq[2])[sq[3]];
							}
							if (dimind.size() == 2) {
								out.ptr<float>(sq[dimind[0]])[sq[dimind[1]]] = inp.ptr<float>(sq[0], sq[1], sq[2])[sq[3]];
							}

							sq.pop_back();
						}
						sq.pop_back();
					}
					sq.pop_back();
				}
				sq.pop_back();
			}
			sq.pop_back();
		}

		if (dim == 4) {
			int B = inp.size[0];
			int H = inp.size[1];
			int W = inp.size[2];
			std::vector<int> sq;
			for (int b = 0; b < B; b++) {
				sq.push_back(b);
				for (int h = 0; h < H; h++) {
					sq.push_back(h);
					for (int w = 0; w < W; w++) {
						sq.push_back(w);

						if (dimind.size() == 2) {
							out.ptr<float>(sq[dimind[0]])[sq[dimind[1]]] = inp.ptr<float>(sq[0], sq[1])[sq[2]];
						}

						sq.pop_back();
					}
					sq.pop_back();
				}
				sq.pop_back();
			}
			sq.pop_back();
		}
		
	}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值