iOS:如何手动将2D Float数据设置为MTLTexture或MPSImage?

时间:2016-12-22 08:45:47

标签: ios swift convolution metal

我尝试手动填充MPSImage或2D Metal纹理并传递它以进行卷积网络操作。 CNN(金属表现着色器)的输入通常是图像(如https://developer.apple.com/library/content/samplecode/MPSCNNHelloWorld/Introduction/Intro.html#//apple_ref/doc/uid/TP40017482-Intro-DontLinkElementID_2),这就是为什么我可以通过UnsafePointer的{​​{1}},但这次我&#39} ; d喜欢使用Float数组作为输入。

以下是我的尝试。我将输入数组转换为CGContext,但它没有工作。

NSData

Manually set a 1D Texture in Metal可能与我的问题有关(仅供参考:它说&#34;处理2D纹理,通过将加载的var inputData = NSData(bytes: inputFloatArrayOfArray, length: inputFloatArrayOfArray.count * inputFloatArrayOfArray[0].count * MemoryLayout<Float>.size) // The type of inputFloatArrayOfArray is [[Float]] network.srcImage.texture.replace(region: MTLRegion( origin: MTLOrigin(x: 0, y: 0, z: 0), size: MTLSize(width: inputWidth, height: inputHeight, depth: 1)), mipmapLevel: 0, slice: 0, withBytes: &inputData, bytesPerRow: inputWidth * MemoryLayout<Float>.size, bytesPerImage: 0) 转换为原始字节数据来加载纹理,但创建一个虚拟{{ 1}}对我来说感觉像是一个黑客。&#34;),但似乎没有足够的答案。现在我不知道如何解决这个问题。如果您有任何想法,请告诉我任何事情。

非常感谢您提前。

1 个答案:

答案 0 :(得分:0)

如果您的张量具有&lt; = 4个特征通道,那么您只需将其复制到功能通道0-3,其中RGBA将位于纹理中。如果你的张量超过那个,那么你使用MTLTexture2DArray。超出前四个的附加特征通道在阵列中的后续图像中连续进入相同的坐标。

Image[0]: // a.k.a. slice 0
  pix[0][0] = {feature channel 0, feature channel 1, feature channel 2, feature channel 3}

Image[1]:  // a.k.a. slice 1
  pix[0][0] = {feature channel 4, feature channel 5, feature channel 6, feature channel 7}

Image[2]:  // a.k.a. slice 2
  pix[0][0] = {feature channel 8, feature channel 9, feature channel 10, feature channel 11}