关于CoreML 和 Vision 的Confident 不同的解决方法

作者分享了在使用CoreML和Vision进行颜色识别时,遇到的从CVPixelBuffer到UIImage转换、相机配置和模型confidence差异等问题,以及解决尝试的过程,包括CgImage区域裁剪以提高准确度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天用coreml和vision写了个颜色识别项目,训练后的coreml的准确率达到了99.5%,但是实际上使用的时候效果并不理想。

因为是将相机的CVPixelBuffer导入进去识别的,第一反应是CVPixelBuffer和真实的照片颜色有出入,去细究了下:当将 CVPixelBuffer 转换为真实的照片(比如 UIImage),系统会根据特定的颜色空间和配置信息对像素数据进行解释和显示。这个过程应该是一个准确的转换,不会引入颜色误差。

排除了这一问题,接下来考虑的是相机的配置问题:对比度、饱和度这些,但是发现也不是。。。。

最后将真实照片放入到CoreML中预测的时候,效果竟然出乎意料的好,才发现是CoreML 和 Vision的confident有出入,至于为什么有出入,暂时还没找到原因。希望有大佬看到了能解惑,谢谢了。

至此,我直接用CoreML处理图像获得结果。

具体代码如下:

// 使用
                    if let restoredImage = self.convertCVPixelBufferToUIImage(pixelBuffer: currentFrame.capturedImage) {
                        // 在这里使用还原的 UIImage 对象
                        let ciImage = CIImage(image: restoredImage)
                        let model = MyImageClassifier2() // MyModel为我们训练好的CoreML模型
                        let output = try? model.prediction(image: currentFrame.capturedImage) // 使用CoreML模型进行预测
                        if let result = output?.target { // 输出预测结果
                            
                                   print(result)
                               }
                    } else {
                        print("无法将 CVPixelBuffer 转换为 UIImage")
                    }


 
    //CVPixelBuffer转换uiimage
    func convertCVPixelBufferToUIImage(pixelBuffer: CVPixelBuffer) -> UIImage? {
        let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
        let context = CIContext()
        
        if let cgImage = context.createCGImage(ciImage, from: ciImage.extent) {
            return UIImage(cgImage: cgImage)
        }
        
        return nil
    }

为了提高准确度,可以将CVPixelBuffer转换为CgImage后裁剪指定区域:

// 截取指定区域的图像
                    let originalImage = CIImage(cvPixelBuffer: currentFrame.capturedImage)
                    let context = CIContext()
                    
                    // 定义要截取的区域
                    for touch in touches {
                        let location = touch.location(in: self.view)
                        let regionOfInterest = CGRect(x: location.x - 25, y: location.y - 25, width: 50, height: 50)  
                        
                        // 使用 Core Graphics 截取指定区域的图像
                        if let cgImage = context.createCGImage(originalImage, from: regionOfInterest) {
//                            let croppedImage = UIImage(cgImage: cgImage)
                            // 现在 cgImage 就是截取后的图像,可以在这里使用它
                            let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
                            try handler.perform([request])

                        }
                
                
                    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值