首页 > 编程问答 >如何使用我的 CoreML 模型在 Vision 中获取 MLMultiArray 输出

如何使用我的 CoreML 模型在 Vision 中获取 MLMultiArray 输出

时间:2024-07-30 09:32:28浏览次数:9  
标签:python swift coreml apple-vision

我正在尝试在 swift 中将我的 CoreMl 模型与 Vision 框架结合使用。我的模型输出一个 MLMultiArray。当我通过 Vision 运行它时,我确实得到了一个输出,但是输出的类型是 VNObservation,我无法使用它,也无法将其转换为 MLMultiArray。有谁知道如何获取 MLMultiArray 作为输出,或将 VNObservation 转换为 MLMultiArray?谢谢!!

我的代码显示了 AVCaptureSession(相机)的函数 captureOutput,每个捕获帧(sampleBuffer)正在由模型处理。

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {return}
    
    guard let model = try? VNCoreMLModel(for:mobilenet_v2_nail_model_update().model) else {
        print("returned huh")
        return}

    let request = VNCoreMLRequest(model: model) {
        finishReq, err in
        
        guard let results = finishReq.results as? [VNObservation] else { return }
        
        guard let vnObservationObject = results.first as? VNObservation else { return }
        
        //this is where I am stuck, cannot convert result into MLMultiArray
    }

    do {
        try VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
        
        if let mlMultiArray = self.currentMLArray {
            let aWidth = CGFloat(mlMultiArray.shape[0].intValue)
            let aHeight = CGFloat(mlMultiArray.shape[1].intValue)
            
            UIGraphicsBeginImageContext(
                CGSize(width: aWidth, height: aHeight))
            if let ctx = UIGraphicsGetCurrentContext() {
                
                ctx.clear(CGRect(x: 0.0, y: 0.0, width: Double(aWidth), height: Double(aHeight)));
                
                for j in 0..<Int(aHeight) {
                    for i in 0..<Int(aWidth) {
                        let aValue = (mlMultiArray[j * Int(aHeight) + i].floatValue >= 0.5) ?
                        1.0 : 0.0
                        
                        let aRect = CGRect(
                            x: CGFloat(i),
                            y: CGFloat(j),
                            width: 1.0,
                            height: 1.0)
                        
                        let aColor: UIColor = UIColor(
                            displayP3Red: 0.0,
                            green: 0.0,
                            blue: 0.0,
                            alpha: CGFloat(aValue))
                        
                        aColor.setFill()
                        UIRectFill(aRect)
                    }
                }
                
                let anImage = UIGraphicsGetImageFromCurrentImageContext()
                
                DispatchQueue.main.async { [weak self] in
                    self?.imageView.image = anImage
                }
            } else {
                print("nil")
            }
        }
    } catch {
        print("error")
    }
}

这也是对象打印出来时的样子!整个 MLMultiArray 未显示,因为它太大了!

<VNCoreMLFeatureValueObservation: 0x282ecbd40> 6A57503A-5613-4C6A-BA14-5DCC7E90F7A4 VNCoreMLRequestRevision1 置信度=1.000000“var_1027”-“MultiArray:Float32 480×320 矩阵 [0.0002018213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.401539e-05,6.759167e-05,7.200241e-05,7.200241e -05,7.140636e-05,7.140636e-05,7.086992e-05,7.086992e-05,7.033348e-05,6.973743e-05,6.657839e-05,6.711483e-05,6.920099e-05,7。 31349e -05,7.843971e-05,8.028746e-05,8.028746e-05,7.724762e-05,7.253885e-05,7.31349e-05,7.486343e-05,7.724762e-05,7.724762e-05,7.4 26739e -05,7.253885e-05,7.253885e-05,7.367134e-05,7.599592e-05,7.724762e-05,7.784367e-05,8.028746e-05,8.094311e-05.....


你几乎成功了!这个诀窍在于理解 Vision 如何处理 CoreML 模型的输出。Vision 不会直接给你 MLMultiArray ,而是将其封装在一个 VNCoreMLFeatureValueObservation 对象中。

以下是提取 MLMultiArray 的方法:

guard let results = finishReq.results as? [VNCoreMLFeatureValueObservation] else { return }
guard let observation = results.first else { return }

// 访问 featureValue 属性来获取 MLMultiArray
guard let mlMultiArray = observation.featureValue.multiArrayValue else { 
    print("无法获取 MLMultiArray")
    return 
}

// 现在你可以使用 mlMultiArray
let aWidth = CGFloat(mlMultiArray.shape[0].intValue)
let aHeight = CGFloat(mlMultiArray.shape[1].intValue)
// ...其余代码...

解释:

  1. results 转换为 [VNCoreMLFeatureValueObservation] 你的模型返回 VNCoreMLFeatureValueObservation 对象数组,而不是 VNObservation
  2. 获取第一个观察结果: 通常,你只会得到一个观察结果,除非你的模型有多个输出。
  3. 访问 featureValue.multiArrayValue VNCoreMLFeatureValueObservation 对象有一个 featureValue 属性,其中包含实际输出。由于你的模型输出 MLMultiArray ,你可以使用 multiArrayValue 属性来访问它。

代码中其他需要注意的事项:

  • 错误处理: 添加了额外的错误处理,以防无法获取 MLMultiArray
  • 类型安全: 确保使用 guard let 语句和类型转换来安全地访问值。

进行这些更改后,你的代码应该能够从 Vision 请求中成功提取并处理 MLMultiArray

标签:python,swift,coreml,apple-vision
From: 76220368

相关文章

  • python性能分析器:cProfile
    代码:(1)importcProfileimportrecProfile.run('re.compile("foo|bar")')运行结果:(2)importcProfiledefrunRe():importrecProfile.runctx('re.compile("foo|bar")',None,locals())runRe()运行结果:(3)i......
  • 基于Python网络招聘数据可视化分析系统的设计与实现
    基于Python网络招聘数据可视化分析系统的设计与实现DesignandImplementationofPython-basedNetworkRecruitmentDataVisualizationAnalysisSystem完整下载链接:基于Python网络招聘数据可视化分析系统的设计与实现文章目录基于Python网络招聘数据可视化分析系......
  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......
  • Python OpenCV - 显示坏像素检查测试
    我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为160x320像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有51200像素,那就是坏的。另外,我想知道每个坏像素的位置。一旦拍摄的图像太大,我将共享一个......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......
  • Python CDLL 无法加载两次
    我正在尝试用python创建一个密码管理器,但遇到了一个问题,一旦加载了一种类型的dll,我就无法加载不同的dll,在这个示例中,我加载了一个dll,并尝试解密加密的密码数据,它工作正常,直到我加载另一个不同的nss3.dll文件,此时它给我一个错误:“过程入口点HeapAlloc无法位于动态链......
  • 你能将 HTTPS 功能添加到 python Flask Web 服务器吗?
    我正在尝试构建一个Web界面来模拟网络设备上的静态接口,该网络设备使用摘要式身份验证和HTTPS。我想出了如何将摘要式身份验证集成到Web服务器中,但我似乎无法找到如何使用FLASK获取https,如果您可以向我展示如何实现,请评论我需要使用下面的代码做什么来实现这一点。from......
  • Python:比较 csv 文件并打印相似之处
    我需要比较两个csv文件并打印出它们的相似之处。第一个文件有名称和浓度,第二个文件就像只有名称的“最佳”列表,我需要绘制相似性图表。例如,这就是我的列表的样子:file1-old_file.csvname_id,conc_test1,conc_test2name1,####,####name2,###......