MPSImage
または2Dメタルテクスチャを手動で値で埋めて、それを渡して畳み込みネットワーク操作を実行しようとしています。 CNN(メタルパフォーマンスシェーダ)のための入力は、通常は(このhttps://developer.apple.com/library/content/samplecode/MPSCNNHelloWorld/Introduction/Intro.html#//apple_ref/doc/uid/TP40017482-Intro-DontLinkElementID_2のような)画像である、私はCGContext
のUnsafePointer
を渡すことができます理由ですが、今回は私が入力としてfloat配列を使用したいと思います。iOS:2D Floatデータを手動でMTLTextureまたはMPSImageに設定するにはどうすればよいですか?
以下は私が試みたものです。入力配列をNSData
に変換しましたが、動作しませんでした。
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)
Manually set a 1D Texture in Metal
は私の質問に関連することができる(FYI:それは「生のバイトデータにロードUIImage
を変換するが、ダミー
UIImage
を作成することによって、テクスチャをロードする2Dテクスチャとの契約は私のためのハックのように感じた。」と言います)、それは十分な答えがないようです。今私はこれにどのように対処するアイデアがありません。アイデアがあれば教えてください。
ありがとうございます。
私はあなたがすでに解決策に近いと思っていますが、ここでは仲介者としてNSDataを使用する必要はありません。不要なコピーを作成するだけです。重要なことは、配列内のデータが予想された順序で連続して配置されていることです。これは、イメージデータの行を含む配列(配列の配列ではありません)を作成し、「終わりから終わりまで」レイアウトし、その配列をバイトパラメータとして直接渡す必要があることを意味しています(Swift配列は暗黙的に適切な安全でない生のポインタ型にキャストされます)。 – warrenm
ありがとうございます。配列の配列を配列に変換しました。テクスチャが正しい数値をロードできるかどうかをチェックする方法はありますか? – kangaroo
バイトをプログラムで読み込んで検証したり、レンダリングループを作成したり、Xcode内でGPUフレームキャプチャを実行して既存のすべてのリソースを表示することができます。 – warrenm