Получите выбранное изображение в imagePickerController и передайте его в coreML - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь сделать распознавание с помощью coreML, функция работает и правильно показывает результат. Но я хочу вызвать метод в кнопку, например, когда я нажал кнопку catDog, и он запускает метод. Но так как finalResult () и identifCatOrDog () - это их собственные функции, так что я не могу вызвать их в кнопку. Я попытался скопировать и вставить метод внутри кнопки, но он мне ничего не показывает. Как я могу отредактировать код так, чтобы findResult () работал только тогда, когда я нажал кнопку, которая не работает автоматически?

import UIKit
import CoreML
import Vision
import Photos

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet var loadImage: UIImageView!
@IBOutlet var Result: UILabel!

@IBAction func photoBtn(_ sender: UIButton) {
    getPhoto()
}

@IBAction func cameraBtn(_ sender: UIButton) {
}

@IBAction func catDog(_ sender: UIButton) {
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func getPhoto() {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = .photoLibrary
    present(picker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true, completion: nil)
    guard let gotImage = info[.originalImage] as? UIImage else {
        fatalError("No picture chosen")
    }

    loadImage.image = gotImage
    identifyCatOrDog(image: gotImage)
}

func identifyCatOrDog(image: UIImage) {
    let modelFile = ImageClassifier()
    let model = try! VNCoreMLModel(for: modelFile.model)

    let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [ : ])

    let request = VNCoreMLRequest(model: model, completionHandler: findResults)
    try! handler.perform([request])
}

func findResults(request: VNRequest, error: Error?) {
    guard let results = request.results as? [VNClassificationObservation] else {
        fatalError("Unable to get results")
    }

    var bestGuess = ""
    var bestConfidence: VNConfidence = 0

    for classification in results {
        if (classification.confidence > bestConfidence) {
            bestConfidence = classification.confidence
            bestGuess = classification.identifier
        }
    }

    Result.text = "Image is: \(bestGuess) with confidence \(bestConfidence) out of 1"
}

1 Ответ

0 голосов
/ 20 марта 2019

Я полагаю, что проблема в том, что иногда, когда сборщик изображений закрыт, вы хотите позвонить identifyCatOrDog, а в других случаях - нет.

Одна довольно грубая возможность заключается в следующем:Метод действия кнопки, поднимите флаг свойства экземпляра bool, чтобы при вызове didFinishPickingMedia вы знали, вызывать или нет identifyCatOrDog.

Более изощренным способом было бы разделить вещи на вспомогательные классы, чтобы работа средства выбора изображений после нажатия кнопки catDog происходила в совершенно другом мире кода.

...