运行TensorFlow C++遇参数类型错误:期望uint8却传入float求解决
解决TensorFlow C++程序中“Expects arg[0] to be uint8 but float is provided”错误
嘿,这个错误其实很好定位——你的TensorFlow模型输入节点明确期望接收uint8类型的数据,但你现在传进去的是float类型的Tensor,类型不匹配直接触发了这个报错。结合你贴的代码片段,我给你两种靠谱的解决思路:
思路1:按模型预期传入uint8类型数据(推荐)
从代码看,你把加载的图像转换成了32位浮点数格式(IPL_DEPTH_32F),然后构建了DT_FLOAT类型的Tensor,但模型根本不吃这一套。直接按模型要求的uint8来准备数据就行:
- 不需要做
cvConvert转float的操作,直接用加载后的pImg(默认是uint8格式,对应IPL_DEPTH_8U) - 把Tensor的类型改成
DT_UINT8,再拷贝图像数据进去
修改后的核心代码大概是这样:
// 直接加载图像,默认是uint8格式(IPL_DEPTH_8U) IplImage *pImg = cvLoadImage("img.bmp", 1); // 创建DT_UINT8类型的Tensor,匹配模型输入要求 tensorflow::Tensor input_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({ 1, input_height, input_width, 3 })); auto input_tensor_mapped = input_tensor.tensor<uint8_t, 4>(); // 拷贝uint8类型的图像数据到Tensor uint8_t *pSourceRow = (uint8_t *)pImg->imageData; int depth = 3; for (int y = 0; y < input_height; ++y) { const uint8_t* source_row = pSourceRow; for (int x = 0; x < input_width; ++x) { for (int c = 0; c < depth; ++c) { input_tensor_mapped(0, y, x, c) = source_row[x * depth + c]; } } pSourceRow += pImg->widthStep; }
思路2:修改模型输入层为float类型(按需选择)
如果你确实需要用float类型的输入,那得调整模型本身——把输入节点的dtype改成float32。不过这个前提是你有权限修改或重新导出模型,而且要注意:模型内部如果有基于uint8的预处理逻辑(比如归一化计算),也得同步调整适配float输入,不然推理结果会出问题。
额外小提醒
- 要确保
input_height和input_width和图像的实际尺寸完全一致,不然还会触发维度不匹配的新错误 - 另外,OpenCV的
IplImage是比较老旧的API了,建议换成cv::Mat来处理图像,代码会更简洁也更容易维护
内容的提问来源于stack exchange,提问作者david ye
相关产品推荐
相关产品推荐

