Как использовать два MPSImage на входе MPSNNGraph
Я пытаюсь ввести два изображения на MPSNNGraph.
Тем не менее, даже если я введу массив типа [input1, input2] для "withSourceImages", я могу только ввести "input1" в качестве входного изображения. В идеале, при создании графика, как показано ниже, я хочу сделать "inputImage1" как "input1" и "inputImage2" как "input2".
На самом деле, когда я запустил его таким образом и посмотрел на результат "concat", я смог увидеть, что "input1" было объединено, а не "input2".
График выглядит так:
let inputImage1 = MPSNNImageNode(handle: nil)
let inputImage2 = MPSNNImageNode(handle: nil)
let scale = MPSNNBilinearScaleNode(source: inputImage1,
outputSize: MTLSize(width:256,
height: 256,
depth: 3))
let scale2 = MPSNNBilinearScaleNode(source: inputImage1,
outputSize: MTLSize(width:64,
height: 64,
depth: 3))
...
let concat = MPSNNConcatenationNode(sources: [conv3.resultImage, scale2.resultImage])
...
if let graph = MPSNNGraph(device: commandQueue.device,
resultImage: tanh.resultImage,
resultImageIsNeeded: true){
self.graph = graph
}
и часть графика кодирования выглядит так:
let input1 = MPSImage(texture: texture, ...)
let input2 = MPSImage(texture: texture2, ...)
graph.executeAsync(withSourceImages: [input1, input2]) { outputImage, error in
...
}
Как мне ввести второй вход и получить его график?
Не могли бы вы дать мне совет?
1 ответ
Scale2 использует то же входное изображение, что и Scale1 в этом примере. Когда MPSNNGraph анализирует этот набор узлов, он никогда не встречает inputImage2, потому что он не используется графом. Поскольку его нет на графике, интерфейс графа не будет принимать второй ввод. Не знал бы, что с этим делать.
Мне кажется вероятным, что если вы измените инициализацию scale2 для использования inputImage2, то она будет работать так, как вы, вероятно, и предполагали.
Код, который вы предоставляете, на самом деле выглядит правильно. Ссылка на заголовок MPSNNGraph.h здесь:
* @param sourceImages A list of MPSImages to use as the source images for the graph.
* These should be in the same order as the list returned from
* MPSNNGraph.sourceImageHandles. They should be allocated against
* the same MTLDevice. There must be at least one source image.
* Note: this array is intended to handle the case where multiple
* input images are required to generate a single graph result.
* That is, the graph itself has multiple inputs. If you need to
* execute the graph multiple times, then call this API multiple
* times, or better yet use [encodeToCommandBuffer:sourceImages:]
* multiple times.
Я хочу отметить, однако, что MPSNNConcatenationNode ведет себя довольно уникальным образом. Это всегда согласуется с глубиной (канал) измерения. При объединении изображений с разными пространственными размерами будет учитываться меньшее (т.е. 2x2x10 concat 4x4x15 -> 2x2x25). Может быть, именно отсюда возникла ваша проблема.