Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c+中为tensorflow lite设置图像输入+;? 我试图将我们的TySoFLO模型从Python + KRAS版本移到Tensorflow Lite上,在嵌入式平台上使用C++。_C++_Embedded Linux_Tensor_Tensorflow Lite - Fatal编程技术网

如何在c+中为tensorflow lite设置图像输入+;? 我试图将我们的TySoFLO模型从Python + KRAS版本移到Tensorflow Lite上,在嵌入式平台上使用C++。

如何在c+中为tensorflow lite设置图像输入+;? 我试图将我们的TySoFLO模型从Python + KRAS版本移到Tensorflow Lite上,在嵌入式平台上使用C++。,c++,embedded-linux,tensor,tensorflow-lite,C++,Embedded Linux,Tensor,Tensorflow Lite,看起来我不知道如何为解释器正确设置输入 输入形状应为(1224224,3) 作为输入,我使用openCV拍摄图像,将其转换为CV_BGR2RGB std::唯一\u ptr模型\u阶段1= tflite::FlatBufferModel::BuildFromFile(“model1.tflite”); TFLITE_最小检查(模型阶段1!=nullptr); //构建解释器 tflite::ops::builtin::BuiltinOpResolver解析器第1阶段; std::唯一的ptr解

看起来我不知道如何为解释器正确设置输入

输入形状应为(1224224,3)

作为输入,我使用openCV拍摄图像,将其转换为CV_BGR2RGB


std::唯一\u ptr模型\u阶段1=
tflite::FlatBufferModel::BuildFromFile(“model1.tflite”);
TFLITE_最小检查(模型阶段1!=nullptr);
//构建解释器
tflite::ops::builtin::BuiltinOpResolver解析器第1阶段;
std::唯一的ptr解释器阶段1;
tflite::解释器构建器(*model_stage1,resolver_stage1)(&解释器_stage1);
TFLITE_最小_检查(解释器_stage1!=nullptr);
cv::Mat cvimg=cv::imread(图像文件);
if(cvimg.data==NULL){
printf(“==图像读取错误===\n”);
返回0;
}
cv::cvtColor(cvimg,cvimg,cv_BGR2RGB);
uchar*input\u 1=解释器\u stage1->类型化\u输入\u张量(0);
memcpy(…);
我对这种uchar类型的memcpy的正确设置有疑问

当我这样做时,我在工作期间出现seg故障:

memcpy(input_1, cvimg.data, cvimg.total() * cvimg.elemSize());

在这种情况下,我应该如何正确填写输入?

要将我的评论转换为答案: Memcpy可能不是正确的方法。OpenCV将图像保存为每像素RGB有序(或BGR或其他颜色组合)颜色值的一维数组。可以通过以下方式迭代这些RGB块:

for(const auto&rgb:cvimg){
//现在,rgb[0]为红色值,rgb[1]为绿色,rgb[2]为蓝色。
}
将值写入Tensorflow Lite类型的输入tensor应该这样做;其中i是索引(迭代器),x是赋值:

解释器->键入的输入张量(0)[i]=x;
因此,循环可以如下所示:

for(size_t i=0;size_t类型化输入张量(0)[3*i+0]=rgb[0];
解释器->类型化输入张量(0)[3*i+1]=rgb[1];
解释器->类型化输入张量(0)[3*i+2]=rgb[2];
}

至少在单通道情况下,您可以这样做。这假设opencv缓冲区是连续的。所以,在这种情况下,张量DIM是(1,x,y,1)

float*out=解释器->输入张量(输入);
输入类型=解释器->张量(输入)->类型;
img.convertTo(img,CV_32F,255.f/input_std);
cv::减法(img,cv::标量(输入平均值/输入标准值),img);
浮点数*in=img.ptr(0);
memcpy(out、in、img.rows*img.cols*sizeof(float));
OpenCV版本-4.3.0 TF Lite版本-2.0.0


nada的方法也是正确的。选择适合您的编程风格的,但是memcpy版本会相对更快。

为什么不在
cvimg
中循环所有值,并将它们设置为
解释器阶段1->键入的输入张量(0)[i]=x,其中i是索引,x是值?好的,但RGB像素应该如何放置在内存中?{0,0R 0,0G 0,0B 0,1R 0,1G 0,1B…n,mR n,mG n,mB}?答案在你的问题中:因为你使用了
cv::cvtColor(cvimg,cvimg,cv_BGR2RGB)您的cvimg以RGB顺序包含它们,就像您之前的评论一样。谢谢。这种方法可以正确地将数据放入输入_1数组,但我不确定它是否正确。无论我在那里加载什么数据,我都会得到相同的答案。我认为将图像放入这样的一维数组实际上可能很常见。OpenCV可以做到,FLTK是我知道的另一个库,可以做到。好的,目前我不能为解释器->输入张量(0)[i]分配任何内容。每一次尝试都给我一个错误
float* out = interpreter->typed_tensor<float>(input);
input_type = interpreter->tensor(input)->type;
img.convertTo(img, CV_32F, 255.f/input_std);
cv::subtract(img, cv::Scalar(input_mean/input_std), img);
float* in = img.ptr<float>(0);
memcpy(out, in, img.rows * img.cols * sizeof(float));