CoreMLを使って画像認識を行いたいのですが、結果をLabelやtextfieldではなく、tableviewのcellに置きたいと思っています。
環境
xcode:10
swift:5
画像認識の結果をLabelに表示するコード
cameraViewcontroller
1import UIKit 2import CoreML 3import Vision 4 5class cameraViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 6 7 8 @IBOutlet weak var subLabel: UITextView! 9 10 @IBOutlet weak var PhotoView: UIImageView! 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // Do any additional setup after loading the view. 15 } 16 17 @IBAction func cameraView(_ sender: Any) { 18 19 let sourceType:UIImagePickerController.SourceType = 20 UIImagePickerController.SourceType.camera 21 // カメラが利用可能かチェック 22 if UIImagePickerController.isSourceTypeAvailable( 23 UIImagePickerController.SourceType.camera){ 24 // インスタンスの作成 25 let cameraPicker = UIImagePickerController() 26 cameraPicker.sourceType = sourceType 27 cameraPicker.delegate = self 28 self.present(cameraPicker, animated: true, completion: nil) 29 30 } 31 else{ 32 subLabel.text = "error" 33 34 } 35 } 36 37 // 撮影が完了時した時に呼ばれる 38 func imagePickerController(_ imagePicker: UIImagePickerController, 39 didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ 40 41 // dismiss 42 imagePicker.dismiss(animated: true, completion: nil) 43 44 if let pickedImage = info[.originalImage] 45 as? UIImage { 46 47 PhotoView.contentMode = .scaleAspectFit 48 PhotoView.image = pickedImage 49 50 photoPredict(pickedImage) 51 } 52 53 } 54 55 func photoPredict(_ targetPhoto: UIImage){ 56 57 // 学習モデルのインスタンス生成 58 guard let model = try? VNCoreMLModel(for: Resnet50().model) else{ 59 print("error model") 60 return 61 } 62 63 // リクエスト 64 let request = VNCoreMLRequest(model: model){ 65 request, error in 66 guard let results = request.results as? [VNClassificationObservation] else { 67 return 68 } 69 // 確率を整数にする 70 let conf = Int(results[0].confidence * 100) 71 // 候補の1番目 72 let name = results[0].identifier 73 74 if conf >= 50{ 75 self.subLabel.text = "(name) です。確率は(conf)% \n" 76 } 77 else{ 78 self.subLabel.text = "もしかしたら、(name) かも。確率は(conf)% \n" 79 } 80 } 81 // 画像のリサイズ 82 request.imageCropAndScaleOption = .centerCrop 83 84 // CIImageに変換 85 guard let ciImage = CIImage(image: targetPhoto) else { 86 return 87 } 88 89 // 画像の向き 90 let orientation = CGImagePropertyOrientation( 91 rawValue: UInt32(targetPhoto.imageOrientation.rawValue))! 92 93 // ハンドラを実行 94 let handler = VNImageRequestHandler( 95 ciImage: ciImage, orientation: orientation) 96 97 do{ 98 try handler.perform([request]) 99 100 }catch { 101 print("error handler") 102 } 103 104 } 105 106 107// //閉じる処理 108// imagePicker.dismiss(animated: true, completion: nil) 109// subLabel.text = "Tap the [Save] to save a picture" 110// 111// } 112 113 // 撮影がキャンセルされた時に呼ばれる 114 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 115 picker.dismiss(animated: true, completion: nil) 116// subLabel.text = "Canceled" 117 } 118 119 120 @IBAction func showAlbum(_ sender: Any) { 121 let sourceType:UIImagePickerController.SourceType = 122 UIImagePickerController.SourceType.photoLibrary 123 124 if UIImagePickerController.isSourceTypeAvailable( 125 UIImagePickerController.SourceType.photoLibrary){ 126 // インスタンスの作成 127 let cameraPicker = UIImagePickerController() 128 cameraPicker.sourceType = sourceType 129 cameraPicker.delegate = self 130 self.present(cameraPicker, animated: true, completion: nil) 131 132 subLabel.text = "Tap the [Start] to save a picture" 133 } 134 else{ 135 subLabel.text = "error" 136 137 } 138 } 139 140 141 @IBAction func nextButton(_ sender: Any) { 142 //button押したら次のページに遷移する。値も一緒に 143 let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "AI") as! AIViewController 144 145 //AIViewControllerのtextにsubLabelのテキストを代入 146 vc2.text = subLabel.text! 147 148 149 //NavigationControllerを継承したViewControllerを遷移 150 self.navigationController?.pushViewController(vc2, animated: true) 151 152 } 153 154 155}
改善したい箇所
cameraViewcontroller
1// リクエスト 2 let request = VNCoreMLRequest(model: model){ 3 request, error in 4 guard let results = request.results as? [VNClassificationObservation] else { 5 return 6 } 7 // 確率を整数にする 8 let conf = Int(results[0].confidence * 100) 9 // 候補の1番目 10 let name = results[0].identifier 11 12 if conf >= 50{ 13 self.subLabel.text = "(name) です。確率は(conf)% \n" 14 } 15 else{ 16 self.subLabel.text = "もしかしたら、(name) かも。確率は(conf)% \n" 17 } 18 }
上記のself.subLabel.textをsubLabelではなく新たに設置するTableviewのcell内です。
ご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。