2017-11-04 5 views
0

Ich war hart an der Arbeit, um eine einfache Computer Vision Anwendung mit CoreML und Vision schnell zu erstellen. Ich habe mein eigenes Keras-Netzwerk trainiert, das farbige Bilder mit einer 64x64-Auflösung aufnimmt und Ihnen dann sagt, welcher Buchstabe des Alphabets es ist. Als ich diese App auf meinem Handy ausführen und ein Bild nehmen und klicken Sie auf ‚Mit diesem Bild‘, die Code-Abstürze in diesem Stück Code:VNC KlassifizierungFunktion nicht funktioniert?

//send a request to the network to identify the image 
      let request = VNCoreMLRequest(model: model) { (request, error) in 
       guard let results = request.results as? [VNClassificationObservation] else { 
        fatalError("Model failed to load image") 
      } 

Ich habe zu diesem Fehler in den letzten drei Stunden und Hoffnung stecken geblieben Ihr könnt mir helfen, herauszufinden, was falsch ist! Unten ist der Rest des Codes, den ich verwendet habe.

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var imageView: UIImageView! 

    let imagePicker = UIImagePickerController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     imagePicker.delegate = self 
     imagePicker.sourceType = .camera 
     imagePicker.allowsEditing = false 

    } 

    //function to chose an image from your library or take one with your camera 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

     if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 

      imageView.image = userPickedImage 

      //transform the image from UIImage to a CIIMage type 
      guard let ciImage = CIImage(image: userPickedImage) else { 
       fatalError("Couldn't transform image to CIImage type") 
      } 

      //call the detect function to pass the new ciImage into the network 
      detect(image: ciImage) 

     } 

     imagePicker.dismiss(animated: true, completion: nil) 

    } 

    //function to classify the image that is taken with the camera or chosen from the library 
    func detect(image: CIImage) { 

     //try to load the model, if not throw an error 
     guard let model = try? VNCoreMLModel(for: chars74k().model) else { 
      fatalError("Loading coreML model failed") 
     } 

     //send a request to the network to identify the image 
     let request = VNCoreMLRequest(model: model) { (request, error) in 
      guard let results = request.results as? [VNClassificationObservation] else { 
       fatalError("Model failed to load image") 
     } 

      print(results) 

    } 
     //create handler for image 
     let handler = VNImageRequestHandler(ciImage: image) 

     do{ 
      try handler.perform([request]) 
     } 
     catch { 
      print(error) 
     } 
+0

Auf welcher Linie stürzt es genau ab? Auf Ihrem 'fatalError' oder auf dem Aufruf von' VMCoreMLRequest() 'oder auf' try handler.perform() '? –

+0

Es stürzt auf der fatalError Zeile, nach dem Versuch, die Ergebnisse als VNClassificationObservation –

+0

Ich weiß, sicher, dass dieser Code funktioniert, weil ich es mit dem InceptionV3-Modell getestet, die gute Ergebnisse ergab, aber wenn ich den Code mit meinem eigenen Keras CNN, die testen Bei Eingabe eines 64x64 farbigen Bildes stürzt der Code bei diesem fatalError ab. –

Antwort

1

Sie werfen den falschen Typ Ihrer Ergebnisse ein. Um den Typ Ihrer Ergebnisse zu überprüfen, können Sie einen Breakpoint in die Zeile fatalError setzen und es mit Debugger machen. Aber ich nehme an, Sie sind ein Anfänger, also versuchen Sie es. Ersetzen:

guard let results = request.results as? [VNClassificationObservation] else { 
    fatalError("Model failed to load image") 
} 

mit:

print("your results are \(type(of: results))") 

if let results = request.results as? [VNClassificationObservation] { 
    print("your results are of type VNClassificationObservation") 
} 

if let results = request.results as? [VNPixelBufferObservation] { 
    print("your results are of type VNPixelBufferObservation") 
} 

if let results = request.results as? [VNCoreMLFeatureValueObservation] { 
    print("your results are of type VNCoreMLFeatureValueObservation") 
} 

Die docs ziemlich klar sind auf mögliche Ergebnisse von VNCoreMLRequest so sollten Sie sie lesen (ich dies sehr empfehlen, auch wenn Sie ohne das gelingt, es ist nicht viel und sie sind einfach).

den meisten Fällen Ausgang Ihrer Anfrage würde etwas kombiniert Klassifizierung mit anderen Ausgängen des Modells sein, so stehen die Chancen, dass Ihr Versagen Verschluss ersetzt werden sollte:

guard let results = request.results as? [VNCoreMLFeatureValueObservation] else { 
    fatalError("Model failed to load results") 
} 

erinnern, den Code zu modifizieren, bezieht sich zu results entsprechend. VNCoreMLFeatureValueObservation Protokoll enthält Informationen über mögliche Werte. Sie können auch mit ihnen an den Debugger von Ihrem Modell drucken:

print(model.modelDescription.outputDescriptionsByName) 

Dies sollte etwas Licht auf vergießen, was Sie erwarten sollten.

+0

dank dieser half mir die Quelle des Problems zu finden, die in der CNN selbst zu sein scheint! –