2017-09-07 4 views
1

Apple a de nouvelles fonctionnalités dans iOS 11 qui vous permet d'utiliser le cadre de vision pour la détection d'objets sans modèles. J'essaye ces nouvelles API mais trouve le résultat de VNDetectRectanglesRequest n'est pas bon. Est-ce que j'utilise les API correctement?iOS 11 en utilisant le cadre de vision VNDetectRectanglesRequest de faire la détection d'objet pas précisément?

Voici quelques bonnes cas:

enter image description here

enter image description here

Et certains mauvais cas:

enter image description here

Voici mon code:

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 

       } 
      } 
     } 
    } 
+0

Ce que vous demandez n'est pas clair. Demandez-vous sur quels cas cela va réussir et échouer sous? Cela va être difficile à décrire, car la mise en œuvre d'Apple est une boîte noire et ils pourraient utiliser un certain nombre de techniques différentes pour le déterminer. Par exemple, l'exemple de votre bouteille n'a pas de coins rectangulaires propres ou de bords droits, donc s'ils utilisaient une détection de coin ou de ligne, ils ne pourraient pas bien gérer cette boîte. –

+0

Je modifie la question. Je ne sais pas exactement comment utiliser les API correctement ou la sortie boundingBox n'est juste pas assez bonne maintenant –

+0

Utiliser corelm pour charger le modèle tiny-yolo obtiendra une meilleure détection d'objet que d'utiliser le framework de vision jusqu'à présent –

Répondre

2

Il y a beaucoup d'idées fausses, d'attentes et de boîtes noires qui ont déjà été soulevées. Mais à part cela, vous utilisez également l'API de manière incorrecte.

Le détecteur de rectangle trouve des zones dans l'image qui semblent représenter des formes rectangulaires réelles. Dans la plupart des cas, la caméra capturant une image voit un objet rectangulaire réel en perspective - de sorte que sa projection 3D sur le plan image 2D ne sera généralement pas rectangulaire. Par exemple, la projection 2D de l'écran de l'ordinateur dans l'une de vos photos est plus trapézoïdale, car les coins supérieurs sont plus éloignés de la caméra que les coins inférieurs.

Vous obtenez cette forme en observant les coins réels du rectangle détecté - voir les propriétés de l'objet VNRectangleObservation. Si vous dessinez des lignes entre ces quatre coins, vous trouverez généralement quelque chose qui permet de mieux suivre la forme d'un écran d'ordinateur, d'un morceau de papier, etc. dans votre photo.

La propriété boundingBox vous permet d'obtenir la plus petite zone rectangulaire, c'est-à-dire rectangulaire dans l'espace image, contenant ces points d'angle. Donc, il ne suivra pas la forme d'un vrai objet rectangulaire à moins que la perspective de votre caméra soit juste.

1

Votre commenté la ligne est presque droite, vous devez remettre tout ça, mais changer pour:

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

Votre exemple « mauvais cas » la place est en fait du jouet en peluche à droite. Vos bons regardent bien parce qu'ils sont au centre de l'écran.