DEVELOPER’s BLOG
技術ブログ
Core MLとVision、Inception v3モデルを使ってOSアプリを作成する
はじめに
iOSネイティブアプリと機械学習を組み合わせたいと思い、Appleが提供してくれているフレームワークCore MLとVision、事前に訓練したInception v3モデルを使用し、ドラマのSilicon Valleyに出たthis is not hot dogアプリを作ってみました。
this is not hot dog とは、撮影された画像がホットドッグかどうかを認識するアプリです。YouTube動画がありますのでご覧ください。
YouTubeより Silicon Valley: Season 4 Episode 4: Not Hotdog (HBO)
目次
環境
- プロセッサ Intel Core i7-5557U 3.1 GHz
- メモリ 16GB 1867 MHz DDR3
- Apple Swift version 4.2.1
- Xcode Version 10.1 (10B61)
Core MLとは
Core ML is the foundation for domain-specific frameworks and functionality
日本語に訳すと学習モデル等をiOS / macOS上で利用する際に、開発者が専門的な知識を必要とせずに扱えるように補助するフレームワークです。
主に下記の2つ機能があります。
1.Load a Pre-Trained Model
事前学習済みModelをロードでする
2.Make Predictions
予測する
Visionとは
コンピュータビジョンの機械学習機能を容易にAppに組み込むことができます。
フェイストラッキング、顔検出、ランドマーク、テキスト検出、矩形検出、バーコード検出、オブジェクトトラッキング、画像レジストレーションなどの機能に対応しています。
Inception v3はCore MLモデルのひとつです。
木、動物、食べ物、乗り物、人々など、1000のカテゴリセットから画像に存在する主なオブジェクトを検出することができます。
作成手順
1.Xcodeにてプロジェクトを作成する
2.下の画像のようなUIをつくる
3.こちらのリンク
からInception v3をダウンロード
4.ダウンロードしたものをプロジェクトに入れる
5.モデルの作成
guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else {
fatalError("Loading Core ML Model Failed.")
}
6.リクエスト(VNCoreMLRequest)の生成とハンドラ処理
let request = VNCoreMLRequest(model: model){( request,error) in
guard let results = request.results as? [VNClassificationObservation] else{
fatalError("Model failrd to process image")
}
7.受け取ったrequestのfirstでhotdogかどうかを判断し、結果はnavigationItemに渡す(一個目のrequestは精度が一番高いため、下記のように94%ぐらいで判断された)
if let firstResult = results.first {
if firstResult.identifier.contains("hotdog") {
self.navigationItem.title = "Hotdog!"
} else {
self.navigationItem.title = "not Hotdog!"
}
}
8.CIImageへの変換
guard let ciimage = CIImage(image: userPickedImage) else {
fatalError("Could not convert UIImage into CIImage")
}
9.ハンドラの生成と実行
let handler = VNImageRequestHandler(ciImage: image)
do {
try! handler.perform([request])
}
catch{
print(error)
}
10.画像のようなアプリが完成。
hotdogだと...。

画面上にhotdogの判定があります!
hotdog以外だと...・

きちんとNot hotdogの判定がされました。
まとめ
いかがでしょうか?
数行のソースコードでこのように作成できて楽しかったです。
Appleさんは他のモデルも用意してくれているので、ぜひ使ってみてください!
アクセルユニバース株式会社 (以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。
当社のインターン生は機械学習論文解説を書いたり、実際に実装したりしています。
随時紹介していくので是非ご覧ください!
定期的にメルマガでも情報配信予定なので、問い合わせページに「メルマガ登録希望」とご連絡ください。
ソースコード
class ViewController: UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate {
@IBOutlet weak var imageView: UIImageView!
let imagePicker = UIImagePickerController()
var classificationResults : [VNClassificationObservation] = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
imagePicker.delegate = self
imagePicker.sourceType = .camera
imagePicker.allowsEditing = true
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let userPickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
imageView.image = userPickedImage
guard let ciimage = CIImage(image: userPickedImage) else {
fatalError("Could not convert UIImage into CIImage")
}
detect(image: ciimage)
}
imagePicker.dismiss(animated: true, completion: nil)
}
func detect(image: CIImage){
guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else {
fatalError("Loading Core ML Model Failed.")
}
let request = VNCoreMLRequest(model: model){( request,error) in
guard let results = request.results as? [VNClassificationObservation] else{
fatalError("Model failed to process image")
}
print(results)
if let firstResult = results.first {
if firstResult.identifier.contains("hotdog") {
self.navigationItem.title = "Hotdog!"
} else {
self.navigationItem.title = "not Hotdog!"
}
}
}
let handler = VNImageRequestHandler(ciImage: image)
do {
try! handler.perform([request])
}
catch{
print(error)
}
}
@IBAction func cameraTapped(_ sender: UIBarButtonItem) {
imagePicker.sourceType = .camera
imagePicker.allowsEditing = false
present(imagePicker, animated: true, completion: nil)
}
}