CoreML


# 1, CoreML

squeeznetを使ってみる

# 2,プロジェクト作る

imageVIew
TextView
buttonの配置

# 3,カメラで写真を撮る

### 1,カメラの撮影を許可
info.plist

Supported Interface oritentations(iPhone)の中に
Privaccy - Camera Usage Descriptionを追加


### 2,カメラで写真を撮り画面に戻ってくる
delegateを付け足す
```
class ViewController: UINavigationControllerDelegate,UIImagePickerControllerDelegate {}
```

imagePickerの処理

```
   
    var ImagePicker:UIImagePickerController!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        ImagePicker = UIImagePickerController()
        //imagepickerのdelegate指定
        ImagePicker.delegate = self
        //アルバムから持ってくるのかカメラを使うのか
        ImagePicker.sourceType = .camera
        
        
        
        // Do any additional setup after loading the view.
    }

@IBAction func takePhoto(_ sender: Any) {
        //写真を撮るに移動
        present(ImagePicker,animated: true,completion: nil)
        
    }
 //カメラで写真を撮った後の処理
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //写真を画面に表示 infoの中に入っている写真を表示
        photoDisplay.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
        ImagePicker.dismiss(animated: true, completion: nil)
    }
```

実機で実行するとき
Target -> Singing & CapabilitiesのTeamを指定する必要あり



# 3,AIで学習する

### 1,モデルをドラッグあんどドロップ

### 2,フレームわくimport
```
import CoreML
import Vision//カメラ映像扱うためのライブラリ
```
### 3,写真を撮った後にすいてうする

```
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //写真を画面に表示 infoの中に入っている写真を表示
        photoDisplay.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
        ImagePicker.dismiss(animated: true, completion: nil)
//ここを追加
        imageInference(image:  (info[UIImagePickerController.InfoKey.originalImage] as? UIImage)!)
    }
    
    
```
モデルへリクエストをなげる
```
func imageInference(image:UIImage){
            //使うモデルの指定 モデルを読み込み。読み込み失敗したらError
        guard let model = try?VNCoreMLModel(for: SqueezeNet().model) else{
            fatalError("モデルをロードできません")
        }
        //リクエスト作成
        //モデルをベースにしたリクエストを使う
        let request = VNCoreMLRequest(model: model){
            [weak self] request, error in
            //VNClassificationObservationで結果が返ってくる
            guard let results = request.results as? [VNClassificationObservation],
                  let firstResult = results.first else{
                fatalError("判定できません")
            }
            
            //非同期の処理　dispatchQue()
            DispatchQueue.main.async{
                self?.photoInfoDisplay.text = "確率 = \(Int(firstResult.confidence * 100)), \n 詳細 \((firstResult.identifier))"
            }
                    
        }
        //画像データをなげる
        guard let ciImage = CIImage(image: image) else{
            fatalError("画像を変換できません")
        }
        //リクエストを処理するためのオブジェクト 画像なのでCNImageRequest
        //引数に判定したい画像
        //カメラから取得した画像をciimageに変換している
        let imageHandler = VNImageRequestHandler(ciImage: ciImage)
        //データをなげる非同期処理
        //
        DispatchQueue.global(qos: .userInteractive).async {
            do {//画像とモデルをマッチングさせる処理
                try imageHandler.perform([request])
            } catch{
                print("エラー\(error)")
            }
        }
                
                
                
    }
```

# テキストを読み上げるプログラム
AVSpeechUItterance