DEVELOPER’s BLOG

技術ブログ

Core MLとVision、Inception v3モデルを使ってOSアプリを作成する

2019.12.04 譚 志翔
アプリ開発 画像認識
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をつくる
Xcode作成画面 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%ぐらいで判断された) 

6A29C419-EB06-4321-BC25-8A7220368DC8, revision 1, 0.942064 "hotdog, hot dog, red hot",
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だと...。 Core MLとVision、Inception v3モデルを使ったiOSアプリ

画面上にhotdogの判定があります! 

hotdog以外だと...・ Core MLとVision、Inception v3モデルを使ったiOSアプリ

きちんと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)
    }
}

関連記事

pythonでEfficientNet + Multi Output を使って年齢予測の実装

ディープラーニングを使って、人の顔の画像を入力すると 年齢・性別・人種 を判別するモデルを作ります。 身近な機械学習では1つのデータ(画像)に対して1つの予測を出力するタスクが一般的ですが、今回は1つのデータ(画像)で複数の予測(年齢・性別・人種)を予測します。 実装方法 学習用データ まず、学習用に大量の顔画像が必要になりますが、ありがたいことに既に公開されているデータセットがあります。 UTKFace というもので、20万枚の顔画像が含まれています。ま

記事詳細
pythonでEfficientNet + Multi Output を使って年齢予測の実装
利用事例 機械学習 画像認識
機械学習活用事例|パーソナルカラー診断システム

概要 自分に似合う色、引き立たせてくれる色を知る手法として「パーソナルカラー診断」が最近流行しています。 パーソナルカラーとは、個人の生まれ持った素材(髪、瞳、肌など)と雰囲気が合う色のことです。人によって似合う色はそれぞれ異なります。 パーソナルカラー診断では、個人を大きく2タイプ(イエローベース、ブルーベース)、さらに4タイプ(スプリング、サマー、オータム、ウィンター)に分別し、それぞれのタイプに合った色を知ることができます。 パーソナルカラーを知るメ

記事詳細
機械学習活用事例|パーソナルカラー診断システム
利用事例 機械学習 画像認識
強力な物体検出M2Detで動画の判別する(google colaboratory)

はじめに この記事では物体検出に興味がある初学者向けに、最新技術をデモンストレーションを通して体感的に知ってもらうことを目的としています。今回紹介するのはAAAI19というカンファレンスにて精度と速度を高水準で叩き出した「M2Det」です。one-stage手法の中では最強モデル候補の一つとなっており、以下の図を見ても分かるようにYOLO,SSD,Refine-Net等と比較しても同程度の速度を保ちつつ、精度が上がっていることがわかります。 ※https:

記事詳細
強力な物体検出M2Detで動画の判別する(google colaboratory)
ニューラルネットワーク 機械学習 画像認識
GAN:敵対生成ネットワークとは何か?画像生成アルゴリズムの紹介

はじめに まずは下の動画をご覧ください。 スパイダーマン2の主役はトビー・マグワイアですが、この動画ではトム・クルーズがスパイダーマンを演じています。 これは実際にトム・クルーズが演じているのではなく、トム・クルーズの顔画像を用いて合成したもので、機械学習の技術を用いて実現できます。 機械学習は画像に何が写っているか判別したり、株価の予測に使われていましたが、今回ご紹介するGANではdeep learningの技術を用いて「人間を騙す自然なもの」を生成する

記事詳細
GAN:敵対生成ネットワークとは何か?画像生成アルゴリズムの紹介
ニューラルネットワーク 機械学習 画像認識

お問い合わせはこちらから