iOS 11使用Vision框架的VNDetectRectanglesRequest进行物体检测不精确?

4

苹果在iOS 11中推出了新功能,允许您使用视觉框架进行对象检测而无需使用模型。我尝试了这些新的API,但发现VNDetectRectanglesRequest的结果不好。我是否正确使用了这些API?

以下是一些好的案例:

enter image description here

enter image description here

还有一些不好的情况:

enter image description here

这是我的代码:

 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

        // create the request

        let request2 = VNDetectRectanglesRequest { (request, error) in
            self.VNDetectRectanglesRequestCompletionBlock(request: request, error: error)
        }

        do {
            request2.minimumConfidence = 0.7
            try self.visionSequenceHandler.perform([request2], on: pixelBuffer)
        } catch {
            print("Throws: \(error)")
        }
    }


func VNDetectRectanglesRequestCompletionBlock(request: VNRequest, error: Error?) {
        if let array = request.results {
            if array.count > 0 {
                let ob = array.first as? VNRectangleObservation
                print("count: \(array.count)")
                print("fps: \(self.measureFPS())")
                DispatchQueue.main.async {
                    let boxRect = ob!.boundingBox
                    let transRect = self.transformRect(fromRect: boxRect, toViewRect: self.cameraLayer.frame)
                    var transformedRect = ob!.boundingBox
                    //transformedRect.origin.y = 1 - transformedRect.origin.y
                    let convertedRect = self.cameraLayer.layerRectConverted(fromMetadataOutputRect: transformedRect)

                    self.highlightView?.frame = convertedRect

                }
            }
        }
    }

不清楚您的问题是什么。您是否在询问此方法在哪些情况下会成功或失败?这很难描述,因为苹果公司的实现是一个黑盒子,他们可能使用多种不同的技术来确定这一点。例如,您的瓶子例子没有干净的矩形角或直边,因此如果他们使用角或线检测,它可能无法处理那种情况。 - Brad Larson
我编辑了这个问题。我不确定如何正确使用API或者输出的边界框现在还不够好。 - Yan Li
使用 CoreML 加载 Tiny-YOLO 模型比目前使用 Vision 框架进行物体检测效果更好。 - Yan Li
1
内置的视觉操作旨在成为更简单的检测器(模板匹配、形状检测),而不是像YOLO网络和相关卷积网络那样的广义物体检测。它们解决的是不同的问题。如果在存在锐利边缘和角落的情况下,您得到了适当的边界框,并且它们没有被90度或类似的东西所替代,那么您可能已经正确地使用了API。您只是可能正在尝试使用它处理这些技术无法很好处理的情况。 - Brad Larson
明白了,感谢您的评论 :) - Yan Li
我也遇到了同样的问题,它也会在非矩形区域上进行高亮显示。请有经验的人给予建议。谢谢。 - Anand Gautam
2个回答

6

已经提出了许多误解、期望和黑盒问题。但除此之外,您还在错误地使用API。

矩形检测器可找到在图像中似乎代表真实世界矩形形状的区域。在大多数情况下,捕获图像的相机会看到透视图中的真实矩形对象,因此其在2D图像平面上的3D投影通常不是矩形。例如,在您的某张照片中,计算机屏幕的2D投影更为梯形,因为顶部角比底部角离相机更远。

通过查看检测到的矩形的实际角落来获取此形状--请参阅VNRectangleObservation对象的属性。如果在那四个角之间画线,通常可以找到更好地跟踪您的照片中电脑屏幕、纸张等物体形状的内容。

boundingBox属性将为您提供包含这些角点的最小矩形区域--即在图像空间中的矩形。因此,它不会跟随真实矩形对象的形状,除非您的摄像机透视图刚好正确。


2

你注释掉的那一行基本正确,你需要将其恢复并更改为:

transformedRect.origin.y = 1 - (transformedRect.origin.y + transformedRect.width)

您的“糟糕案例”中,方块实际上来自右侧的软玩具。您的好案例看起来正确,因为它们位于屏幕中心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接