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