我正在构建一个 iOS 应用程序,它可以将相机中的帧实时渲染到金属纹理。我想使用 CoreML 对金属纹理的子区域执行样式传输(想象相机输出为 2x2 网格,其中 4 个正方形中的每一个都用作样式传输网络的输入,输出粘贴回显示的纹理)。我试图弄清楚如何最好地在 Metal 管道中使用 CoreML 来用 mlmodel 的输出填充纹理的非重叠子区域(希望不会将 mlmodel 分解为 MPSNNGraph)。是否可以直接将 MTLTexture 或 MTLBuffer 提供给 coreML 模型?我想尽可能避免格式转换(为了速度)。
我的 mlmodel 在其输入和输出中采用 CVPixelBuffers。可以改为采用 MTLTextures 吗?
我尝试的第一件事是:将给定的样本缓冲区切割成子区域(通过复制像素数据 ugh),推断每个子区域,然后将它们一起粘贴到一个新的样本缓冲区中,然后将其转换为 MTLTexture 并显示。这种方法根本没有利用金属,因为直到推理之后才创建纹理。它还有很多迂回的转换/复制/粘贴操作,这会减慢一切。
我尝试的第二件事是:将相机数据直接发送到 MTLTexture,推断样本缓冲区的子区域,使用 MTLTexture.replace(region:...withBytes:) 为每个子区域粘贴到当前显示的纹理中。但是,MTLTexture.replace() 使用 cpu,对于实时视频来说不够快。
我即将尝试的想法是:将我的 mlmodel 转换为 MPSNNGraph,获取帧作为纹理,使用 MPSNNGraph 对子区域进行推理,并显示输出。我想我会先在这里检查一下,然后再完成转换 mlmodel 的所有工作。抱歉,如果这太宽泛了,我主要在 tensorflow 中工作,在这里有点超出我的深度。