#ディープラーニングをかんたんにできるCreateML
数学などの専門知識は不要です。
AppleのツールCreateMLで、あなたも簡単にディープラーニングのモデルを学習させることができます。
そして、そのモデルはiOSアプリでつかうことができます。
#データをあつめましょう
##トレーニング・データ
イケメンの画像100枚と、イケメンではない画像100枚をあつめました。
そして、それらをフォルダわけしました。
イケメンフォルダ
イケメンじゃないフォルダ
##テスティング・データ
トレーニング・データと同じフォルダ構成で、テスティング・データのフォルダもつくります。
イケメン、イケメンじゃない、10枚ずつです。
トレーニング・データに含まれない画像を用意する必要があります。
分類の子フォルダ名(この場合、「ikemen」と「ikemennot」)はトレーニング・データと同じであることが要求されます。
#CreateMLを起動
XcodeをControllキーを押しながらクリック、そしてOpenDeveloperTools、CreateMLを選択。
CreateMLのメニューからImage Classification(画像分類)を選びます。
それから、好きなプロジェクト名を入力します。
#CreatMLで画像分類モデルを学習させる
Training DataとTesting Dataの+ボタンをクリックして、用意したフォルダを指定します。
テスティング・データでテストした結果を表示してくれます。
イケメンのPrecision89%、Recall80%。
モデルがイケメンと予測した画像の89%が正解。
イケメン画像の80%がイケメンと予測されました。
Previewを選択してオリジナル画像をドロップすると、その画像でテストできます。
99%の確信でイケメンではない、と予測されました。
#モデルをiOSモバイルアプリでつかう
##mlmodelをゲット
Outputタブを選択すると、学習したモデルが表示されます。
これはCoreMLモデル形式です。
Getボタンを押して、モデルを保存します。
保存されたモデルを、Xcodeプロジェクトにドラッグ&ドロップします。
##Visionフレームワークでモデルをつかう
Visionフレームワークでmlmodelを手軽に使えます。
VNCoreMLRequestで、CoreMLモデルの推論リクエストをつくります。
func setupVision() -> NSError? {
// Setup Vision parts
let error: NSError! = nil
guard let modelURL = Bundle.main.url(forResource: "ikemenclasifier 1", withExtension: "mlmodelc") else {
return NSError(domain: "VisionObjectRecognitionViewController", code: -1, userInfo: [NSLocalizedDescriptionKey: "Model file is missing"])
}
do {
let visionModel = try VNCoreMLModel(for: MLModel(contentsOf: modelURL))
let objectRecognition = VNCoreMLRequest(model: visionModel, completionHandler: { (request, error) in
DispatchQueue.main.async(execute: {
// perform all the UI updates on the main queue
if let results = request.results {
self.mlCompletion(results)
}
})
})
self.mlRequest = [objectRecognition]
} catch let error as NSError {
print("Model loading went wrong: \(error)")
}
return error
}
VNImageRequestHandlerを使って、用意した画像でCoreMLリクエストを実行します。
let imageRequestHandler = VNImageRequestHandler(ciImage: image, orientation: exifOrientation, options: [:])
do {
try imageRequestHandler.perform(self.mlRequest)
} catch {
print(error)
}
リクエストは結果をVNClassificationObservationとして返します。
identifierは結果の分類名です。それは、データのフォルダ名と同じになります。この場合、「ikemen」か「ikemennot」です。
confidenceはパーセンテージの確信度です。
func mlCompletion(_ results: [Any]) {
guard let observation = results.first as? VNClassificationObservation else {
print("its not ml observation")
return
}
print(observation.identifier,observation.confidence)
if observation.identifier == "ikemen" {
resultLabel.text = "イケメン\n\(floor(observation.confidence * 100))"
ikemenCount += 1
} else {
resultLabel.text = "イケメンではない\n\(floor(observation.confidence * 100))"
}
}

##実際のアプリはこちら
GitHubにアプリ置いときます。
https://github.com/john-rocky/HandsomeClassifier
ぼくのTwitterをフォローしてください。お願いします。
https://twitter.com/JackdeS11
お仕事のご依頼をこのメールにお願いします。
rockyshikoku@gmail.com
あと、Looks Good For Me(わるくないね)、押してください。
ここです ↓
チャオ🐣!