2017-02-28 37 views

回答

4

我只想解決農作物的情況,因爲調整大小的情況涉及到重採樣,並且稍微複雜一些。讓我知道你是否真的需要這個。

讓我們假設您的源MPSImage是128x128像素的12個特徵通道(3切片)圖像,您的目標圖像是64x64像素的8個特徵通道圖像(2個切片),並且您要複製源的最後兩個片的右下64x64區域放入目的地。

沒有API,我所知道的,它允許你從/一次複製到一個數組質感的多個片,所以你需要發出多個blit的命令,以覆蓋所有的切片:

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編碼器更快或更慢,但它確實更簡單。

編輯:增加了一個代碼示例。這是從內存類型,因此它可能有小的誤差,但這是總體思路:

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

然後,當你運行你的神經網絡,添加以下內容:

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這兩個問題的答案,但@ warrenm似乎更適合。我也喜歡你的想法。 – s1ddok

+0

你還可以提供一個簡單的代碼,介紹如何用'NeuronLinear'裁剪'MPSImage'?我發現我需要將'a'設置爲'1',將'b'設爲'0',但不知道下一步該怎麼做。 – s1ddok

+0

如果'yourImage'是3通道圖像(例如RGB),'tempImg'是1通道圖像:如何使用linearNeuron實現通道更改? dest-region應該包含'R'或更好的灰色表示。當我用(,, 3)和(,, 1)指定ImageDescriptors時,整個事件都會崩潰。 – Chris