c ++ leer modelo mnn

Escribí un artículo antes, entrené un modelo y lo convertí en un modelo mnn, y usé Python para llamar

Pero no usó c ++ para llamar

El modelo todavía usa el modelo de ese artículo, y el código de llamada es el siguiente:

#include <iostream>
#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<MNN/Interpreter.hpp>
#include<MNN/ImageProcess.hpp>

using namespace std;
using namespace cv;
using namespace MNN;
int main()
{   auto net = std::shared_ptr<MNN::Interpreter>(MNN::Interpreter::createFromFile("E:\\vs2019\\first\\first\\model-flow.mnn"));//创建解释器
	cout << "Interpreter created" << endl;
	ScheduleConfig config;
	config.numThread = 8;
	config.type = MNN_FORWARD_CPU;
	auto session = net->createSession(config);//创建session
	cout << "session created" << endl;
	//读取图片
	cv::Mat image = cv::imread("C:\\Users\\Administrator\\Pictures\\397.jpg");
	cv::Mat img_resized;
	cv::resize(image, img_resized, cv::Size(180,180));

	auto inTensor = net->getSessionInput(session, NULL);
	auto outTensor = net->getSessionInput(session, NULL);
	auto _Tensor = MNN::Tensor::create<float>(inTensor->shape(), NULL, MNN::Tensor::TENSORFLOW);
	//cout << _Tensor->elementSize() << endl;
	for (int i = 0; i < _Tensor->elementSize(); i++) {
		_Tensor->host<float>()[i] = image.data[i];
	}
	inTensor->copyFromHostTensor(_Tensor);
	inTensor->printShape();
	//cout << *(inTensor->host<float>()+1) << endl;
	//_Tensor->print();
	_Tensor->printShape();
	//推理
	net->runSession(session);
    auto output= net->getSessionOutput(session, NULL);
	MNN::Tensor feat_tensor(output, output->getDimensionType());
	output->copyToHostTensor(&feat_tensor);
	feat_tensor.print();
	waitKey(0);
	return 0;
}

Los resultados de la operación son los siguientes:

Tenga en cuenta que el resultado de los datos no es coherente con el resultado de la llamada de Python anterior. Debería ser que el orden de rgb se invierta al asignar datos.

La razón por la que no uso muchos artículos para leer el tensor de entrada usando memcpy, porque esta copia de memcpy no ha tenido éxito en mi máquina. Los datos son el valor inicializado automáticamente por el sistema, lo que hará que los resultados sean inconsistentes cada vez. , que es un número aleatorio.

 

Supongo que te gusta

Origin blog.csdn.net/zhou_438/article/details/111869497
Recomendado
Clasificación