标签: coreml

iOS 14.5 中的 CoreML 内存泄漏

在我的应用程序中,我将 VNImageRequestHandler 与自定义 MLModel 一起用于对象检测。

该应用程序适用于 14.5 之前的 iOS 版本。

当 iOS 14.5 到来时,它打破了一切。

  1. 每当try handler.perform([visionRequest])抛出错误时(Error Domain=com.apple.vis Code=11 "encountered unknown exception" UserInfo={NSLocalizedDescription=encountered unknown exception}),pixelBuffer内存被保留并且永远不会释放,它使 AVCaptureOutput 的缓冲区满然后新帧没来。
  2. 我必须更改代码如下,通过将pixelBuffer复制到另一个var,我解决了新帧不来的问题,但仍然发生内存泄漏问题。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

由于内存泄漏,应用程序在一段时间后崩溃。

请注意,在 iOS 14.5 版本之前,检测工作完美,try handler.perform([visionRequest])永远不会抛出任何错误。

这是我的代码:

private func predictWithPixelBuffer(sampleBuffer: CMSampleBuffer) {
  guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
    return
  }
  
  // Get additional info from the camera.
  var options: [VNImageOption : Any] = [:]
  if let cameraIntrinsicMatrix = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) {
    options[.cameraIntrinsics] = cameraIntrinsicMatrix
  } …
Run Code Online (Sandbox Code Playgroud)

memory-leaks ios coreml ios-vision ios14

21
推荐指数
1
解决办法
807
查看次数

将Image转换为CVPixelBuffer以进行机器学习Swift

我试图让在2017 WWDC上演示的Apple样本Core ML模型正常运行.我正在使用GoogLeNet来尝试对图像进行分类(请参阅Apple Machine Learning Page).该模型将CVPixelBuffer作为输入.我有一个名为imageSample.jpg的图像,我正用于此演示.我的代码如下:

        var sample = UIImage(named: "imageSample")?.cgImage
        let bufferThree = getCVPixelBuffer(sample!)

        let model = GoogLeNetPlaces()
        guard let output = try? model.prediction(input: GoogLeNetPlacesInput.init(sceneImage: bufferThree!)) else {
            fatalError("Unexpected runtime error.")
        }

        print(output.sceneLabel)
Run Code Online (Sandbox Code Playgroud)

我总是在输出中获得意外的运行时错误,而不是图像分类.我转换图片的代码如下:

func getCVPixelBuffer(_ image: CGImage) -> CVPixelBuffer? {
        let imageWidth = Int(image.width)
        let imageHeight = Int(image.height)

        let attributes : [NSObject:AnyObject] = [
            kCVPixelBufferCGImageCompatibilityKey : true as AnyObject,
            kCVPixelBufferCGBitmapContextCompatibilityKey : true as AnyObject
        ]

        var pxbuffer: CVPixelBuffer? = nil
        CVPixelBufferCreate(kCFAllocatorDefault,
                            imageWidth,
                            imageHeight,
                            kCVPixelFormatType_32ARGB,
                            attributes as …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch machine-learning ios swift coreml

19
推荐指数
2
解决办法
9420
查看次数

如何创建和训练用于Core ML的神经模型

Apple推出了Core ML.有许多第三方提供训练有素的模型.

但是如果我想自己创建一个模型怎么办?我该怎么做?我可以使用哪些工具和技术?

neural-network coreml

18
推荐指数
1
解决办法
5558
查看次数

CoreML / MLModelConfig PreferredMetalDevice - 了解设备放置启发法

是否有任何公开文档明确说明了CoreML's在 macOS 上运行推理模型时 GPU 设备放置的策略?它如何决定是否应在集成、离散或 CPU 上运行?可以可靠地“强制”一条路径吗?对于像配备多个独立 GPU 和多个 eGPU 的新款 Mac Pro 这样的系统来说,这种情况有何变化?

我对 rMBP 的测试表明答案是否定的 - 温度、电池、插入电源、自动图形设置和应用程序支持,甚至可能还有一些 MLModel 架构启发式方法都在设备放置中发挥着作用。

结合上下文更长:

我很好奇是否有任何关于 CoreML 的设备选择启发式的公开文档。通过添加 10.15 的 CoreML preferredMetalDeviceAPI MLModelConfig,我想可以强制MTLDevice/ MLModelVision 请求运行。

在我使用 Vega 20 的 2018 rMBP 上对集成、分立和 eGPU 进行的测试中,似乎只有 eGPU 在请求时始终运行 CoreML 模型。

我的 CoreML 模型是一个管道模型,由具有多个输出的 MobileNet 分类器(附加到自定义特征提取器的多头分类器)组成。

我很想了解设备选择偏好,原因如下:

a) 我想确保我的MLModel输入图像CIImagesMTLTextures本地设备推理支持,以限制 PCI 传输并继续在单个 GPU 设备上进行处理

b) 我的模型实际上是输入视频帧,WWDC '19 / 10.15 引入了 VideoToolbox 和 …

macos ios metal metal-performance-shaders coreml

18
推荐指数
1
解决办法
2226
查看次数

如何将UIImage转换为CVPixelBuffer

Apple的新CoreML框架具有预测功能,需要一个CVPixelBuffer.为了分类,UIImage必须在两者之间进行转换.

我从Apple工程师处获得的转换代码:

1  // image has been defined earlier
2
3     var pixelbuffer: CVPixelBuffer? = nil
4   
5     CVPixelBufferCreate(kCFAllocatorDefault, Int(image.size.width), Int(image.size.height), kCVPixelFormatType_OneComponent8, nil, &pixelbuffer)
6     CVPixelBufferLockBaseAddress(pixelbuffer!, CVPixelBufferLockFlags(rawValue:0))
7   
8     let colorspace = CGColorSpaceCreateDeviceGray()
9     let bitmapContext = CGContext(data: CVPixelBufferGetBaseAddress(pixelbuffer!), width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelbuffer!), space: colorspace, bitmapInfo: 0)!
10  
11    bitmapContext.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
Run Code Online (Sandbox Code Playgroud)

这个解决方案很快,适用于灰度图像.必须根据图像类型进行的更改包括:

  • 第5行| kCVPixelFormatType_OneComponent8到另一个OSType(kCVPixelFormatType_32ARGB对于RGB)
  • 第8行| colorSpace到另一个CGColorSpace( …

uiimage swift cvpixelbuffer coreml

17
推荐指数
1
解决办法
1万
查看次数

出货后不断训练CoreML模型

在查看新的CoreML API时,我看不到在生成.mlmodel并将其捆绑到您的应用程序后继续训练模型的任何方法.这让我觉得我无法对用户的内容或动作进行机器学习,因为模型必须事先经过完全训练.

发货后有没有办法将训练数据添加到我训练过的模型中?

编辑:我刚刚注意到你可以从URL初始化生成的模型类,所以也许我可以将新的训练数据发布到我的服务器,重新生成训练模型并将其下载到应用程序中?似乎它会起作用,但这完全打败了在没有用户数据离开设备的情况下能够使用ML的隐私方面.

metal-performance-shaders ios11 coreml

14
推荐指数
2
解决办法
2543
查看次数

如何将视觉框架坐标系转换为ARKit?

我正在使用ARKit(使用SceneKit)添加虚拟对象(例如球).我通过使用Vision框架并在视觉请求完成处理程序方法中接收其更新位置来跟踪真实世界对象(例如,脚).

let request = VNTrackObjectRequest(detectedObjectObservation: lastObservation, completionHandler: self.handleVisionRequestUpdate)
Run Code Online (Sandbox Code Playgroud)

我想用虚拟替换跟踪的现实世界对象(例如用立方体替换脚)但是我不知道如何将边界框矩形(我们在视觉请求完成中接收)替换为场景套件节点,因为坐标系统是不同的.

以下是视觉请求完成处理程序的代码:

 private func handleVisionRequestUpdate(_ request: VNRequest, error: Error?) {
    // Dispatch to the main queue because we are touching non-atomic, non-thread safe properties of the view controller
    DispatchQueue.main.async {
      // make sure we have an actual result
      guard let newObservation = request.results?.first as? VNDetectedObjectObservation else { return }

      // prepare for next loop
      self.lastObservation = newObservation

      // check the confidence level before updating the UI
      guard newObservation.confidence >= 0.3 else { …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios ios11 arkit coreml

13
推荐指数
1
解决办法
4514
查看次数

使用ARkit和CoreML的Vision框架

虽然我一直在研究最佳实践并为正在进行的项目(即Vuforia中的Unity3D iOS项目进行原生集成,使用AVFoundation提取帧然后通过基于云的图像识别传递图像)试验多个选项,但我得出的结论是想使用ARkit,Vision Framework和CoreML; 让我解释.

我想知道我将如何捕获ARFrames,使用Vision Framework来使用CoreML模型检测和跟踪给定对象.

此外,这将是很好有一个边框,一旦对象被识别一起在手势触摸添加一个AR对象的能力,但是这是有可能获得实实在在的项目下来后方可实施.

毫无疑问这是可能的,但我不确定如何通过Vision将ARFrame传递给CoreML进行处理.

有任何想法吗?

computer-vision arkit coreml

13
推荐指数
1
解决办法
5743
查看次数

初始化CoreML模型时崩溃:Error Domain = com.apple.CoreML Code = 0"声明网络时出错."

我在App Store上有一个应用程序,我从Crashlytics获取错误日志.在我的项目中初始化CoreML模型时,会出现用户获得的最常见错误之一(以及难以重现的错误).以下是我初始化模型的方法:

class VisionManager: NSObject {
  /// Prediction model
  private static let model = MobileNet()

  ...

  override init() {
    super.init()

    guard let visionModel = try? VNCoreMLModel(for: VisionManager.model.model) else {
      // this case should never happen as we know for sure that the model we are using is an image classification model
      fatalError("The CoreML model being used is not compatible with the Vision framework.")
    }

    ...
  }

...
}
Run Code Online (Sandbox Code Playgroud)

如Crashlytics所见,错误如下:

致命错误:'试试!' 表达式意外地引发了错误:错误Domain = com.apple.CoreML Code = 0"声明网络时出错." UserInfo = {NSLocalizedDescription =声明网络时出错.}:file …

ios swift coreml

10
推荐指数
1
解决办法
1251
查看次数

使用 iPhone TrueDepth 传感器检测真人脸 vs 照片?

如何使用使用 iPhonetrue-depth相机捕获的深度数据来区分真实的人类 3D 面部和相同的照片?要求是将其用于身份验证。

我做了什么:创建了一个示例应用程序来获取AVDepthData相机前面的连续流。

avfoundation swift arkit coreml truedepth-camera

10
推荐指数
2
解决办法
698
查看次数