繁体   English   中英

MLModel 与 MultiArray output 一起使用,但无法成功将 output 更改为图像

[英]MLModel works with MultiArray output but cannot successfully change the output to an image

我已使用 coremltools 4.0 将 Keras model 转换为 MLModel,但成功有限。

它有效,但前提是我为 output 使用 MLMultiArray 并转换为图像。 转换为图像比推理需要更长的时间; 使其无法使用。

如果我尝试更改 MLModel 规范以使用 output 的图像,我会收到此错误运行预测:

无法将 output 身份转换为图像:

NSUnderlyingError=0x2809bad00 {Error Domain=com.apple.CoreML Code=0 "无效的数组形状 (2048, 2048, 3) 用于转换为灰度图像"

即使我为 output 颜色指定了RGB

output { 名称:“身份”类型 { imageType { 宽度:2048 高度:2048 颜色空间: RGB } } }

如果我使用 MultiArray (有效) Xcode 报告:

output:Float32 1 x 2048 x 2048 x 3 阵列

我怀疑问题出在第一个维度,即批号,但没有显示任何维度,所以我无法删除批次维度:

output { 名称:“身份”类型 { multiArrayType { dataType: FLOAT32 } } }

我不认为我可以将 output 形状添加到 Keras Conv2D output 层,因为它有多个不同形状的入站节点。 以下是 output 形状:

>>> print(outputLayer.get_output_shape_at(0))
(None, None, None, 3)
>>> print(outputLayer.get_output_shape_at(1))
(1, 512, 512, 3)
>>> print(outputLayer.get_output_shape_at(2))
(1, 2048, 2048, 3)

>>> print(outputLayer.output)
Tensor("SR/Identity:0", shape=(None, None, None, 3), dtype=float32)

我认为 coremltools 混淆了通道的批次,这就是为什么即使我指定 RGB 也尝试创建灰度图像的原因。

知道如何解决吗?

我有原始的 Keras model,但我看不到如何在没有批次尺寸的情况下指定形状。 这里是Keras model层描述的开始和结束

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
LR_input (InputLayer)           [(None, None, None,  0                                            
__________________________________________________________________________________________________
Pre_blocks_conv (Conv2D)        multiple             896         LR_input[0][0]                   
__________________________________________________________________________________________________
F_1_1_1 (Conv2D)                multiple             9248        Pre_blocks_conv[0][0]            

...                             multiple
...                             multiple

SR (Conv2D)                     multiple             84          PixelShuffle[0][0]               
==================================================================================================

在 Core ML 中,尺寸的顺序是(通道、高度、宽度),因此它期望看到 3 x 2048 x 2048 output 而不是 2048 x 2048 x 3。

请注意,您还需要确保 output 像素在 [0, 255] 而不是 [0, 1] 范围内,这可能是您的 Keras Z20F35E630DAF44DBFA4C3F68F5399DC8 给您的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM