Xamarin Android上的TensorFlow对象检测失败并出现重塑问题

问题描述 投票:4回答:1

我正在关注这篇博文和GitHub:

Blog

Github

但是当我跑步时,拍一张照片并拨打这一行:

var outputs = new float[tfLabels.Count];
tfInterface.Feed("Placeholder", floatValues, 1, 227, 227, 3);
tfInterface.Run(new[] { "loss" });
tfInterface.Fetch("loss", outputs);

该应用程序实际崩溃并在.Run行上生成下面的错误。

我在输出窗口中收到此错误(并且应用程序崩溃):

04-04 17:39:12.575 E / TensorFlowInferenceInterface(8017):无法使用输入运行TensorFlow推理:[占位符],输出:[丢失]未处理的异常:

Java.Lang.IllegalArgumentException:重塑的输入是一个具有97556个值的张量,但请求的形状需要90944的倍数 [[节点:block0_0_reshape0 =重塑[T = DT_FLOAT,Tshape = DT_INT32,_device =“/ job:localhost / replica:0 / task:0 / device:CPU:0”](block0_0_concat,block0_0_reshape0 / shape)]]

根据我正在从这个错误的搜索中读到的帖子,我有点理解这是由于图像不完全符合预期的大小,但在我关注的示例中,每次调整大小以适应227x227并进行转换像这些行一样浮动:

var resizedBitmap = Bitmap.CreateScaledBitmap(bitmap, 227, 227, false).Copy(Bitmap.Config.Argb8888, false);

var floatValues = new float[227 * 227 * 3];
var intValues = new int[227 * 227];

resizedBitmap.GetPixels(intValues, 0, 227, 0, 0, 227, 227);

for(int i = 0; i < intValues.Length; i++)
{
     var val = intValues[i];
     floatValues[i * 3 + 0] = ((val & 0xFF) - 104);
     floatValues[i * 3 + 1] = (((val >> 8) & 0xFF) - 117);
     floatValues[i * 3 + 2] = (((val >> 16) & 0xFF) - 123);
}

所以,我不明白是什么导致了这个或如何解决它。请帮忙!

更新:我发现问题出在我的模型或我的标签上。我通过简单地交换上面的示例/ github中的模型和标签文件,同时保留我的所有代码,我发现了这一点。当我这样做时,我不再收到错误。但是,这仍然没有告诉我太多。这个错误不是很明确,我指的是我的模型可能出错的方向。我假设它是模型,因为标签文件只是一个文本文件,每行都有标签。我在Azure上使用Custom Vision Service来创建我的模型。它训练得很好,并在门户网站上测试得很好。然后我将其导出为TensorFlow。所以,我不确定我可能做错了什么或如何解决它。

谢谢!

android tensorflow xamarin xamarin.android
1个回答
4
投票

在这里没有答案和几天的搜索和反复试验后,我发现了这个问题。一般情况下,我猜这个重塑错误,如果您正在为模型提供其预期或设置接收的图像大小,则可以获得该重塑错误。

问题是,我读到的所有内容都表明,通常您必须使用227 x 227 x 3图像为模型提供信息。然后,我开始注意到某些帖子的大小不同。有人说225 x 225 x 3,其他人说250 x 250 x 3等等。我也尝试过这些尺寸而没有运气。

正如你在问题的编辑中看到的那样,我确实有一个线索。当使用其他人的预训练模型时,我的代码工作正常。但是,当我使用我在Microsoft Azure CustomVision.ai站点上创建的自定义模型时,我收到此错误。

所以,我决定尝试检查模型,看看有什么不同。我跟着这篇文章:Inspect a pre trained model

当我检查使用TensorBoard工作的模型时,我看到输入是227 x 227 x 3,这是我的预期。但是,当我查看我的模型时,我注意到它是224 x 224 x 3!我更改了我的代码以将图像大小调整为该大小并且它可以工作!问题消失了。

因此,总结一下,由于某些原因,Microsoft Custom Vision服务模型生成了一个模型,期望图像大小为224 x 224 x 3.我没有看到任何文档或设置。我也不知道这个数字是否随每个型号而变化。如果你得到一个类似的形状误差,我要检查的第一个地方是你正在为模型提供的图像的大小以及它作为输入的期望。好消息是你可以使用TensorBoard和我上面链接的帖子检查你的模型,即使是经过预先训练的模型。看看输入部分,看起来应该是这样的:Model Inspection size input

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.