我正在构建一个iOS应用程序,可以实时渲染从相机到Metal Textures的帧 . 我想使用CoreML在金属纹理的子区域上执行样式传输(将相机输出想象为2x2网格,其中4个方块中的每一个都用作样式传输网络的输入,并且输出粘贴回显示的纹理) . 我试图找出如何最好地使用MetalML内部的CoreML来填充纹理的非重叠子区域与mlmodel的输出(希望不将ml模型分解为MPSNNGraph) . 是否可以直接将MTLTexture或MTLBuffer提供给coreML模型?我想尽可能避免格式转换(速度) .

我的mlmodel在其输入和输出处采用CVPixelBuffers . 是否可以取代MTLTextures?

我尝试的第一件事是:将给定的样本缓冲区切割成子区域(通过复制像素数据ugh),在每个子区域上推断,然后将它们粘贴到一个新的样本缓冲区中,然后将其转换为MTLTexture并显示 . 这种方法根本没有利用金属,因为直到推断之后才创建纹理 . 它还有很多迂回的转换/复制/粘贴操作,可以减慢一切 .

我尝试的第二件事是:直接将相机数据发送到MTLTexture,推断样本缓冲区的子区域,使用MTLTexture.replace(region:... withBytes :)为每个子区域粘贴到当前显示的纹理中 . 但是,MTLTexture.replace()使用cpu并且对于实时视频来说不够快 .

我要尝试的想法是:将我的mlmodel转换为MPSNNGraph,将帧作为纹理,使用MPSNNGraph推断子区域,并显示输出 . 我想在我完成所有转换mlmodel的努力之前先检查一下 . 对不起,如果这个太宽泛,我主要工作在tensorflow,我有点超出我的深度 .