我试图制作一个图像分类应用程序。由于某些原因,分类标签没有显示任何结果。以下是我的代码,不胜感激。enter image description here

===

import UIKit
import CoreML
import Vision

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var myImageView: UIImageView!

let picker = UIImagePickerController()

@IBAction func cameraButton(_ sender: UIBarButtonItem) {
    let vc = UIImagePickerController()
    vc.sourceType = .camera
    vc.allowsEditing = false
    vc.delegate = self
    present(vc, animated: true)
}

@IBAction func photoButton(_ sender: UIBarButtonItem) {
    picker.allowsEditing = false
    picker.sourceType = .photoLibrary
    picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    present(picker, animated: true, completion: nil)
}


@IBOutlet weak var classificationLabel: UILabel!

/// Image classification

lazy var classificationRequest: VNCoreMLRequest = {
    do {

        let model = try VNCoreMLModel(for: AnimalClassifier().model)

        let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
            self?.processClassifications(for: request, error: error)
        })
        request.imageCropAndScaleOption = .centerCrop
        return request
    } catch {
        fatalError("Failed to load Vision ML model: \(error)")
    }
}()


func updateClassifications(for Image: UIImage) {
    classificationLabel.text = "Classifying..."

    let orientation = CGImagePropertyOrientation(Image.imageOrientation)
    guard let ciImage = CIImage(image: Image) else { fatalError("Unable to create \(CIImage.self) from \(Image).") }

    DispatchQueue.global(qos: .userInitiated).async {
        let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
        do {
            try handler.perform([self.classificationRequest])
        } catch {
            print("Failed to perform classification.\n\(error.localizedDescription)")
        }
    }
}


func processClassifications(for request: VNRequest, error: Error?) {
    DispatchQueue.main.async {
        guard let results = request.results else {
            self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
            return
        }

        let classifications = results as! [VNClassificationObservation]

        if classifications.isEmpty {
            self.classificationLabel.text = "Nothing recognized."
        } else {
            // Display top classifications ranked by confidence in the UI.
            let topClassifications = classifications.prefix(2)
            let descriptions = topClassifications.map { classification in
                // Formats the classification for display; e.g. "(0.37) cliff, drop, drop-off".
               return String(format: "  (%.2f) %@", classification.confidence, classification.identifier)
            }
            self.classificationLabel.text = "Classification:\n" + descriptions.joined(separator: "\n")
        }
    }
}


override func viewDidLoad() {
    super.viewDidLoad()
    picker.delegate = self
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    var Image: UIImage

    if let possibleImage = info[.editedImage] as? UIImage {
        Image = possibleImage
    } else if let possibleImage = info[.originalImage] as? UIImage {
        Image = possibleImage
    } else {
        return
    }

    myImageView.image = Image

    dismiss(animated: true)

    updateClassifications(for: Image)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: nil)
}
}

最佳答案

为了使标签支持多行,您需要将属性numberOfLines设置为0。因此,例如在viewDidLoad中执行

classificationLabel.numberOfLines = 0

关于swift - 图像分类器未在Xcode的分类标签中显示结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58152752/

10-14 23:25