1
CoreML을 사용하는 이미지 인식 응용 프로그램을 만들었습니다. 그리고 UI 측면에서, 내가 이미지를 선택하고 함수 detect()
을 수행 한 후 결과를 보여 주면 메인 뷰로 돌아가고 싶습니다. 그러나, 내가 DispatchQueue.main
을 사용하더라도 항상 동시에 결과와 메인 뷰를 보여줍니다. detect()
중에서 DispatchQueue.main
을 사용하면 작동 할 수 있습니다. 그러나 나는 거기에 있지 않아야한다고 생각한다. 그리고 SVProgressHUD.show()
이 작동하지 않는 또 다른 문제가 있습니다.Swift 4.0의 DispatchQueue 사용 방법
import UIKit
import CoreML
import Vision
import SVProgressHUD
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var cameraButton: UIBarButtonItem!
let imagePicker = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
imagePicker.delegate = self
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
cameraButton.isEnabled = false
SVProgressHUD.show()
if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage{
imageView.image = userPickedImage
imagePicker.dismiss(animated: true, completion: nil)
let userPickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
guard let ciImage = CIImage(image: userPickedImage) else {
fatalError("WRONG")
}
detect(image: ciImage)
}
}
func detect(image: CIImage){
guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else {
fatalError("Loading CoreML Model Failed")
}
let request = VNCoreMLRequest(model: model) { (request, error) in
guard let results = request.results as? [VNClassificationObservation] else{
fatalError("Model failed to process image")
}
if let firstResult = results.first {
let r = firstResult.identifier.split(separator: ",")
DispatchQueue.main.async {
self.cameraButton.isEnabled = true
SVProgressHUD.dismiss()
self.navigationItem.title = r.last?.description
}
}
}
let handler = VNImageRequestHandler(ciImage: image)
do{
try handler.perform([request])
}
catch {
print(error)
}
}
@IBAction func cameraTapped(_ sender: UIBarButtonItem) {
imagePicker.sourceType = .savedPhotosAlbum
imagePicker.allowsEditing = false
present(imagePicker, animated: true, completion: nil)
}
}