2016-12-22 16 views
0

MPSImageまたは2Dメタルテクスチャを手動で値で埋めて、それを渡して畳み込みネットワーク操作を実行しようとしています。 CNN(メタルパフォーマンスシェーダ)のための入力は、通常は(このhttps://developer.apple.com/library/content/samplecode/MPSCNNHelloWorld/Introduction/Intro.html#//apple_ref/doc/uid/TP40017482-Intro-DontLinkElementID_2のような)画像である、私はCGContextUnsafePointerを渡すことができます理由ですが、今回は私が入力として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テクスチャとの契約は私のためのハックのように感じた。」と言います)、それは十分な答えがないようです。今私はこれにどのように対処するアイデアがありません。アイデアがあれば教えてください。

ありがとうございます。

+0

私はあなたがすでに解決策に近いと思っていますが、ここでは仲介者としてNSDataを使用する必要はありません。不要なコピーを作成するだけです。重要なことは、配列内のデータが予想された順序で連続して配置されていることです。これは、イメージデータの行を含む配列(配列の配列ではありません)を作成し、「終わりから終わりまで」レイアウトし、その配列をバイトパラメータとして直接渡す必要があることを意味しています(Swift配列は暗黙的に適切な安全でない生のポインタ型にキャストされます)。 – warrenm

+0

ありがとうございます。配列の配列を配列に変換しました。テクスチャが正しい数値をロードできるかどうかをチェックする方法はありますか? – kangaroo

+0

バイトをプログラムで読み込んで検証したり、レンダリングループを作成したり、Xcode内でGPUフレームキャプチャを実行して既存のすべてのリソースを表示することができます。 – warrenm

答えて

0

あなたのテンソルが< = 4機能チャネルを持っている場合は、あなただけのRGBAテクスチャにあるであろう場所を0-3で座っ機能チャネルとそれらをコピーします。テンソルがそれよりも大きい場合、代わりにMTLTexture2DArrayを使用します。最初の4つを超える追加のフィーチャチャンネルは、アレイの後の画像で同じ座標に連続的に移動します。

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} 
関連する問題