MTLTexture
に基づくNチャネルMPSImage
またはテクスチャ配列があります。金属のテクスチャ配列の切り抜き/サイズ変更方法
どのようにNチャンネルをすべてコピーし、「ピクセルサイズ」を変更すると、リージョンをトリミングするのですか?
MTLTexture
に基づくNチャネルMPSImage
またはテクスチャ配列があります。金属のテクスチャ配列の切り抜き/サイズ変更方法
どのようにNチャンネルをすべてコピーし、「ピクセルサイズ」を変更すると、リージョンをトリミングするのですか?
サイズ変更のケースではリサンプリングが必要となり、少し複雑になるので、私は作物のケースについて説明します。あなたが本当にそれを必要とするかどうか教えてください。
あなたのソースMPSImage
は、128x128ピクセルである12個の機能チャンネル(3スライス)画像であり、宛先画像は64x64ピクセルである8個の機能チャンネル画像(2スライス)であり、ソースの最後の2つのスライスのうち、ボトム・右の64x64領域を宛先に追加します。
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()
私はなぜあなたがトリミングしたいのか分かりませんが、MPSCNNレイヤーはMPSImageのより小さい部分で動作することができます。 offset
とclipRect
プロパティを設定するだけで、レイヤーはソースイメージのその領域でのみ機能します。
実際には、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()
が、私は両方の答えをupvoted:これは、それが小さな誤差がある場合がございますので、メモリから入力されたが、これは一般的な考え方です:あなたは、ニューラルネットワークを実行したときに続いて、以下の追加
@ warrenmの方がより適しているようです。あなたのアイデアも好きです。 – s1ddok
'NeuronLinear'を使って' MPSImage'をトリミングする方法についても簡単なコードを提供できますか?私は 'a'を' 1'に、 'b'を' 0'にする必要があるが、次に何をすべきかはわからない。 – s1ddok
'yourImage'が3チャンネルの画像(RGBなど)で、 'tempImg'が1チャンネルの画像の場合:linearNeuronを使用してそのチャンネルの変更をどのように達成できますか? dest-regionには、「R」またはそれ以上のグレー表現が含まれている必要があります。 (,, 3)と(1)を使ってImageDescriptorsを指定すると、すべてがクラッシュします。 – Chris