问题标签 [metal-performance-shaders]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - MPSNNGraph 重塑节点
在 Metal/Metal-Performance-Shaders 中是否有类似于 Keras/TensorFlow 的 Reshape 层?我正在将经过训练的 Keras 模型转换为 MPSNNGraph,并且在处理 conv2d->dense->conv2dTranspose 部分时遇到了麻烦。我正在尝试构建以下配置:
我理解将密集层表示为金属中的 4D 块的概念(我认为?),但我不明白如何用金属从形状(8192)到(4,4,512)。我觉得可以做一些聪明的事情来获得 Dense_2 并重塑为单个 MPSNN 节点,但我不知道它是什么。
swift - 在 MPSCNNGraph 的输入处使用负浮点值
我正在将相关的 Keras 图转换为 Metal Performance Shaders(在https://developer.apple.com/documentation/metalperformanceshaders/objects_that_simplify_the_creation_of_neural_networks中具有图层对象的 MPSCNNGraph ),并且无法让该图输入或输出负数。这是一个问题,因为网络经过训练可以接受 -1.0 和 1.0 之间的输入。
我正在从 iPhone 相机捕获帧并将 SampleBuffers(格式 kCVPixelFormatType_32BGRA)转换为 MTLTextures(格式 MTLPixelFormat.bgra8Unorm(我想使用 MTLPixelFormat.rgba16Float,但在将 SampleBuffers 转换为 MTLTextures 时遇到问题))。
图表的第一层如下所示:
“bgrSwap”从 bgr 转换为 rgb,并将 f(x) = 2x - 1 应用于每个像素(将 LanczosScaleNode 的 [0,1] 输出转换为所需的范围 [-1.0,1.0])。
当我将 bgrSwap.resultImage 转换为浮点数时(使用来自@Hollance https://github.com/hollance/YOLO-CoreML-MPSNNGraph/blob/master/TinyYOLO-NNGraph/TinyYOLO-NNGraph/MPSImage%2BFloats.swift的助手(谢谢你hollance!我希望我没有误用这个扩展)),我只看到[0.0,1.0]中的值。我怀疑在幕后进行了一些转换,这使我无法在结果(重新调整?)之前看到结果,但我不确定。
swift - 在不同形状的金属纹理之间复制数据
我正在将两个训练有素的 Keras 模型转换为金属性能着色器。我必须重塑第一个图的输出并将其用作第二个图的输入。第一个图的输出是一个具有“形状”(1,1,8192) 的 MPSImage,第二个图的输入是一个“形状”(4,4,512) 的 MPSImage。
我将 graph1 的输出 image.texture 转换为 float16 数组,并将其传递给以下函数以将数据复制到“midImage”,即 4x4x512 MPSImage:
当我将 midImage 传递给 graph2 时,图形的输出是一个正方形,有 3/4 的乱码噪声,右下角有 1/4 的黑色。我想我不了解用于存储额外通道的 MPSImage 切片属性。谢谢!
ios - 如何在 MPSNNGraph 的输入端使用两个 MPSImage
我正在尝试在 MPSNNGraph 上输入两个图像。
但是,即使我在“withSourceImages”上输入了一个类似 [input1, input2] 的数组,我也只能输入“input1”作为输入图像。理想情况下,当创建如下图时,我想将“inputImage1”设为“input1”,将“inputImage2”设为“input2”。
实际上,当我像这样运行它并查看“concat”的结果时,我能够看到连接的是“input1”,而不是“input2”。
该图如下所示:
和编码图的一部分看起来像:
如何输入第二个输入并且图形接收它?
你能给我一些建议吗?
ios - MTKView - 一次绘制两个视图
我得到了什么
我正在按照 Apple 示例代码AVCamPhotoFilter在MTKView
.
我想要做什么
除了上面MTKView
,我还需要显示第二个MTKView
。但是,第二个将显示与第一个完全相同的内容。所以我不想重复代码并做两次工作。
当前绘制方法
问题
有没有一种方法可以简单地将纹理传递给第二个MTKView
并绘制而不做两次工作?
objective-c - 如何将 Metal Performance Shader 与 MTLBlitCommandEncoder 同步?
我试图更好地理解使用Metal Performance Shaders
和时的同步要求MTLBlitCommandEncoder
。
我有一个MTLCommandBuffer
设置如下:
用于
MTLBlitCommandEncoder
将纹理 A 的区域复制到纹理 B。纹理 A 大于纹理 B。我正在从纹理 A 中提取“图块”并将其复制到纹理 B。使用
MPSImageBilinearScale
金属性能着色器,纹理 B 作为源纹理,第三个纹理纹理 C 作为目标。此金属性能着色器将缩放并可能将纹理 B 的内容转换为纹理 C。
在金属性能着色器开始尝试缩放纹理 B 之前,如何确保 blit 编码器完全完成将数据从纹理 A 复制到纹理 B?我是否甚至需要担心这一点,或者命令缓冲区的串行特性是否已经为我解决了这个问题?
Metal 有栅栏的概念,MTLFence
用于同步对资源的访问,但我不认为有金属性能着色器在栅栏上等待。(而waitForFence:
编码器上存在。)
如果我不能使用栅栏并且我确实需要同步,推荐的做法是将 blit 编码器排入队列,然后waitUntilCompleted
在将着色器排入队列并再次调用之前调用命令缓冲区waitUntilCompleted
?前任:
我认为我需要将中间副本复制到纹理 B 的原因是因为忽略这个脚注,因为我忘记了一些基本的数学原理,并且已经弄清楚如何使缩放变换的平移属性与 clipRect 一起使用。MPSImageBilinearScale
它似乎会缩放其整个源纹理。对clipOffset
输出很有用,但不适用于实际的缩放或变换。所以需要将贴图从纹理 A 中提取到与贴图本身大小相同的纹理 B 中。然后缩放和变换将“有意义”。
metal - 剪刀矩形在金属中的极限是多少?
我正在金属上执行一个大文件,它显示以下错误:
-[MTLDebugRenderCommandEncoder initWithRenderCommandEncoder:parent:descriptor:]_block_invoke:807:断言失败“超出了在无记忆模式下工作的渲染编码器的剪刀矩形的硬件限制。” 来自调试器的消息:未能发送第 k 个数据包
有什么办法可以解决
ios - 类型“MyWeights”不符合协议“NSCopying”
我正在使用 Metal Performance Shader 设置神经网络,在编写权重初始化类时遇到问题:类型“MyWeights”不符合协议“NSCopying”。是什么导致了错误,以及如何解决这个问题?
PS。我试图通过添加 copy() 函数来修复它,但是我不知道要返回什么或它意味着什么。
objective-c - 如何为金属性能着色器设置 MTLTexture 和 MTLBuffers 查找关键点
问题
我第一次尝试性能着色器并遇到了运行时问题。返回的MTLTexture
似乎MTKTextureLoader
与 Metal Performance Shaders 的MPSImageFindKeypoints
编码器不兼容。
到目前为止,我发现的唯一提示来自 @warrenm 在 MPS 上的示例代码,它MTKTextureLoaderOptions
像我一样指定。我没有在文档中找到任何其他提及。
非常感谢任何帮助。
错误
其中 0x282ce8fc0MTLTexture
来自纹理加载器。据我所见,没有 MTLTexture 类型 80,枚举范围高达 8 左右(不是十六进制)。
代码
编辑
将图像转换为正确的像素格式后,我现在正在初始化缓冲区,如下所示:
没有错误了。但是我现在如何阅读内容?
((MPSImageKeypointData*)[keypointDataBuffer contents])[0].keypointCoordinate
为所有索引返回 (0,0)。我也不知道怎么读keypointsCountBuffer
。转换为 int 值的缓冲区内容显示的值高于定义的 maxKeypoints。我看不到文档在哪里说计数缓冲区具有哪种格式。
metal - 函数(depthwiseConvolution):在 lM[0] 的索引 0 处缺少 threadgroupMemory 绑定
我正在尝试在 MacOS 上使用 Metal Performance Shaders 执行一个简单的 DepthwiseConvolution 内核,但遇到了问题。首先,我用适当的大小初始化一个MPSImage
(称为debugInputImage
),并填充了一些数字,比如1.0
。然后我创建我的卷积核:
具有以下描述符datasource_depthwise_0
的实例在哪里:MPSCNNConvolutionDataSource
这就是我初始化输入图像的方式:
当我运行所有这些时:
并得到这个错误(在这一行let outImage = convolution_depthwise_0.encode(...
):
对于常规卷积,一切都很好,只有 Depthwise 我遇到了这个问题。
该错误的原因可能是什么?
系统:MacOS 10.14、XCode 10.1 beta 3
只有 MPSCNNDepthWiseConvolutionDescriptor 不起作用。我对 MPSCNNConvolutionDescriptor 没有任何问题。我在 iOS 上也没有问题,只有 Mac OS。