使用 VNCoreMLRequest 一次检测多个对象?

Detecting multiple objects at a time with VNCoreMLRequest?

我已经设置了一个工作正常的 VNCoreMLRequest

extension CameraVC : AVCaptureVideoDataOutputSampleBufferDelegate {

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
          print("Camera was able to capture a frame: ", Date())

        guard let pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
        guard let model = try? VNCoreMLModel(for: Resnet50().model) else { return }

        let request = VNCoreMLRequest(model: model) { (finishedReq, err) in
            if err != nil { print(err?.localizedDescription) ; return }

            guard let results = finishedReq.results as? [VNClassificationObservation] else { return }
            guard let firstObservation = results.first else { return }
            print(firstObservation.identifier, firstObservation.confidence)

        }
       try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
    }
}

此请求 returns 请求认为它正在查看的内容的数组,列表中的第一项是最佳猜测。

我想知道是否有办法使用这种技术同时检测多个独特的物体?如果我要同时在画面中放一个苹果和一根香蕉,有没有一种方法可以检测这两个物体,而不是让相机试图弄清楚画面中可以找到一个突出的物体?

是的,您可以这样做,但不能使用 ResNet50。

ResNet50 是一个分类模型,它只能告诉你图像的"main topic"。如果图像中有一个苹果和一个香蕉,它可能在其前 5 个预测中对苹果和香蕉有高分(比如 40% 的苹果和 35% 的香蕉和 25% 的其他东西)但这并不是你真正想要的正在寻找。

更好的解决方案是使用对象检测模型,它不仅可以告诉您图像中的各个对象是什么,还可以告诉您它们所在的位置。