2017-02-28 12 views

答えて

4

サイズ変更のケースではリサンプリングが必要となり、少し複雑になるので、私は作物のケースについて説明します。あなたが本当にそれを必要とするかどうか教えてください。

あなたのソースMPSImageは、128x128ピクセルである12個の機能チャンネル(3スライス)画像であり、宛先画像は64x64ピクセルである8個の機能チャンネル画像(2スライス)であり、ソースの最後の2つのスライスのうち、ボトム・右の64x64領域を宛先に追加します。

:それはあなたが複数のブリットは、すべてのスライスをカバーするためにコマンドを発行する必要がありますので、あなたは、一度配列テクスチャの複数のスライスに/からコピーできるようにするの私は承知している何のAPIはありません

let sourceRegion = MTLRegionMake3D(64, 64, 0, 64, 64, 1) 
let destOrigin = MTLOrigin(x: 0, y: 0, z: 0) 
let firstSlice = 1 
let lastSlice = 2 // inclusive 

let commandBuffer = commandQueue.makeCommandBuffer() 
let blitEncoder = commandBuffer.makeBlitCommandEncoder() 

for slice in firstSlice...lastSlice { 
    blitEncoder.copy(from: sourceImage.texture, 
        sourceSlice: slice, 
        sourceLevel: 0, 
        sourceOrigin: sourceRegion.origin, 
        sourceSize: sourceRegion.size, 
        to: destImage.texture, 
        destinationSlice: slice - firstSlice, 
        destinationLevel: 0, 
        destinationOrigin: destOrigin) 
} 

blitEncoder.endEncoding() 
commandBuffer.commit() 
2

私はなぜあなたがトリミングしたいのか分かりませんが、MPSCNNレイヤーはMPSImageのより小さい部分で動作することができます。 offsetclipRectプロパティを設定するだけで、レイヤーはソースイメージのその領域でのみ機能します。

実際には、MPSCNNNeuronLinearを使用して作物をこのようにすることができます。 blitエンコーダを使用するよりも速いか遅いかはわかりませんが、確かに簡単です。

編集:にコード例が追加されました。 、

let yourImage: MPSImage = ... 
let commandBuffer = ... 

// This describes the size of the cropped image. 
let imgDesc = MPSImageDescriptor(...) 

// If you're going to use the cropped image in other layers 
// then it's a good idea to make it a temporary image. 
let tempImg = MPSTemporaryImage(commandBuffer: commandBuffer, imageDescriptor: imgDesc) 

// Set the cropping offset: 
linearNeuron.offset = MPSOffset(x: ..., y: ..., z: 0) 

// The clip rect is the size of the output image. 
linearNeuron.clipRect = MTLRegionMake(0, 0, imgDesc.width, imgDesc.height) 

linearNeuron.encode(commandBuffer: commandBuffer, sourceImage: yourImage, destinationImage: tempImg) 

// Here do your other layers, taking tempImg as input. 
. . . 

commandBuffer.commit() 
+0

が、私は両方の答えをupvoted:これは、それが小さな誤差がある場合がございますので、メモリから入力されたが、これは一般的な考え方です:あなたは、ニューラルネットワークを実行したときに続いて、以下の追加

// Declare this somewhere: let linearNeuron = MPSCNNNeuronLinear(a: 1, b: 0) 

@ warrenmの方がより適しているようです。あなたのアイデアも好きです。 – s1ddok

+0

'NeuronLinear'を使って' MPSImage'をトリミングする方法についても簡単なコードを提供できますか?私は 'a'を' 1'に、 'b'を' 0'にする必要があるが、次に何をすべきかはわからない。 – s1ddok

+0

'yourImage'が3チャンネルの画像(RGBなど)で、 'tempImg'が1チャンネルの画像の場合:linearNeuronを使用してそのチャンネルの変更をどのように達成できますか? dest-regionには、「R」またはそれ以上のグレー表現が含まれている必要があります。 (,, 3)と(1)を使ってImageDescriptorsを指定すると、すべてがクラッシュします。 – Chris

関連する問題