2017-09-07 8 views
1

AppleにはiOS 11の新機能があり、ビジョンフレームワークを使用してモデルなしでオブジェクト検出を行うことができます。私はこれらの新しいAPIを試してみましたが、がVNDetectRectanglesRequestの結果が良くないことが分かりました。 APIを正しく使用していますか?ここでiOS 11では、ビジョンフレームワークVNDetectRectanglesRequestを使用してオブジェクトの検出を正確に行うことはできませんか?

は、いくつかの良いケースです:

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 

       } 
      } 
     } 
    } 
+0

あなたが求めていることは明確ではありません。これがどのようなケースで成功し、失敗するのか尋ねていますか?それは記述が難しいでしょう.Appleの実装はブラックボックスなので、これを決めるためにさまざまなテクニックを使用することができます。たとえば、ボトルの例ではクリーンな長方形のコーナーや直線のエッジがないため、コーナーやラインの検出を使用している場合は、そのケースをうまく処理できない可能性があります。 –

+0

質問を編集します。私は正確にAPIを正しく使用する方法がわからない、または出力boundingBoxだけでは十分ではない –

+0

corelmを使用して小さなyoloモデルをロードすると、これまでのビジョンフレームワークを使用するよりもオブジェクト検出が向上する –

答えて

2

誤解、予想、およびブラックボックスの問題が既に提起されています。しかしそれとは別に、APIを間違って使用しています。

矩形検出器は、画像内で実世界の矩形を表すように見える領域を検出します。ほとんどの場合、画像をキャプチャするカメラは、見た目では真の長方形のオブジェクトを見るので、2D画像平面への3D投影は通常、長方形ではありません。たとえば、写真の1つにおけるコンピュータ画面の2D投影は、上部コーナーが下部コーナーよりもカメラから離れているため、より台形になります。

検出された矩形の実際のコーナーを見て、この形状になります。VNRectangleObservationオブジェクトのプロパティを参照してください。これら4つのコーナーの間に線を描くと、写真のコンピュータ画面や紙の形などをよく見かけるものが見つかるでしょう。

プロパティの代わりに、boundingBoxプロパティは、最小の矩形領域、つまり画像空間の矩形を取得し、それらのコーナー点を含みます。カメラのパースペクティブが正しければ、実際の長方形のオブジェクトの形には従いません。

1

あなたのコメントアウト行はほとんど右である、あなたはその背中を置くだけに、それを変更する必要があります:正方形は右の柔らかいおもちゃから実際にある

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

あなたの「悪いケース」の例を。 あなたの良いものは、画面の中央にあるので正しく見えます。

関連する問題