[iOS]CoreMLを使った画像判定アプリを作って、人工知能について知ろう!

2018年9月6日ITSwift

こんにちは、ハラダ(@nobuhiro_harada)です

「機械学習」、「人工知能」といった言葉をよく耳にする昨今

実際にプログラムはどうなっていて、どういう用途があるのかサッパリ知らなかったのですが、こちらの「TheNewBaghdad」さんの動画で学習させてもらって、、

「あ、そういうこと!」

と、なりましたのでご紹介

学習動画

「カメラで撮った画像に、何が写っていて、その正確さはいくつです」と、判定してくれるアプリです

画像判定を試してみました

sample-app-using-coreml1

「ボールペン」とはわかるけど、、27%

sample-app-using-coreml2

「節子! それ植木鉢やない、植物や」

sample-app-using-coreml3

石畳をドアマット、玄関マットと判定しちゃうんですね

sample-app-using-coreml4

デイジー、ようやく87%

CoreMLを使ってしたいことを決めて、学習させる画像を選定してモデルを作成した方がいいようですね

自分がパッと思いついたのは、、、

「bokete」https://bokete.jp/ ですが、エロ画像がよくアップロードされるらしく、それを以前は人が削除していたのをGoogleの画像APIを使って、ある閾値を超えたものはアップロードさせない仕組みを取っている、とのことなのですが、

CoreMLを使えば、Googleの画像APIを利用せずに、スマホのアプリ内でアップロードさせないようにできる、、はず

コード(ViewController.swift)

import UIKit
import CoreML
import Vision
import AVFoundation

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    // 画像オブジェクト
    @IBOutlet weak var imageViewObject: UIImageView!
    @IBOutlet weak var textField: UITextView!
    var imagePicker:UIImagePickerController!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        imagePicker            = UIImagePickerController()
        imagePicker.delegate   = self
        imagePicker.sourceType = .camera
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func takePicture(_ sender: Any) {
        // イメージピッカー起動
        present(imagePicker, animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        // イメージオブジェクトに画像を渡す
        imageViewObject.image = info[UIImagePickerControllerOriginalImage] as? UIImage
        // イメージピッカー終了
        imagePicker.dismiss(animated: true, completion: nil)
        // イメージをCoreMLに渡す
        pictureIdentifyML(image: (info[UIImagePickerControllerOriginalImage] as? UIImage)!)
    }
    
    func pictureIdentifyML(image:UIImage) {
        
        // 使用するモデルを設定
        guard let model = try? VNCoreMLModel(for:Resnet50().model) else {
            fatalError("can not load ML model")
        }
        
        // 画像判定処理
        let request = VNCoreMLRequest(model:model) {
            [weak self] request, error in
            guard let results = request.results as? [VNClassificationObservation], let firstResult = results.first else {
                fatalError("can not get result from VNCoreMLResult")
            }
            
            DispatchQueue.main.sync {
                // 結果の表示
                self?.textField.text = "confidence = \(Int(firstResult.confidence * 100))%, \n identifier = \((firstResult.identifier))"
                
                // 結果の読み上げ
                let utTerance   = AVSpeechUtterance(string: (self?.textField.text)!)
                utTerance.voice = AVSpeechSynthesisVoice(language: "en-gb")
                let synthesizer = AVSpeechSynthesizer()
                synthesizer.speak(utTerance)
            }
        }
        
        // 選択した画像をCore Imageに変換
        guard let ciImage = CIImage(image:image) else {
            fatalError("can not convert to CIImage")
        }
        
        // 変換した画像をハンドラーに渡す
        let imageHandler = VNImageRequestHandler(ciImage:ciImage)
        
        // ハンドラーから画像判定処理へ
        DispatchQueue.global(qos: .userInteractive).async {
            do {
                try imageHandler.perform([request])
            } catch {
                print("Error \(error)")
            }
        }
    }
}

CoreMLについて

CoreMLについては下記のブログがすごくわかりやすかったです。

[iOS 11] Core MLで焼き鳥を機械学習させてみた
https://dev.classmethod.jp/smartphone/iphone/ios-11-core-ml-2/

あとは、WWDC2017 のプレゼンでしょうか

ひとこと

大量の画像や言語を学ばせて、モデルを作成するのですが、自分がプログラミングを勉強する際に動画を観たり、本を読んだりしてるのと同じですね。機械って、「特定のことを人間より速く、精確に行えて、人間の生活を楽にする」ものだと思うのですが、人工知能もある人にとっては仕事を奪うものになるかもしれませんが、俯瞰してみると、人類の総労働時間を減らしてくれて、次の進化への手助けをしてくれるものなのではないか、と思います。下記のブログではアルファ碁のスペックについて記載がありますが、このスペックがどれだけエグいのかはエンジニアだったら、ひと目でわかると思います。それだけのスペック使って、人間の碁のプロに勝つくらいのことしかできないのか、と。アルファ碁って、碁しかできないんですよね?人工知能の研究が進むほど、逆に人のスペックがどれだけすごいのか証明されるような気がします

参考:
人間と人工知能(アルファ碁)をエネルギー効率から比較してみる
http://biz-it-base.com/?p=8123

ハードウェア構成は、CPUが1,202個、GPUが176個とのことです。
これをGCPの利用料金に換算すると、年間約29億円だとか(驚)
人工知能(ディープラーニング)を世界最先端レベルで開発するには、圧倒的な資金力が必要なことが分かりますね。

気になる消費電力は、CPUを100ワットとすると、約12万ワット。
GPUは200~300ワットとすると、5万ワットくらいになります。
さらに周辺機器などもありますから、合計で、ザックリと20万ワットくらいでしょうか。
(※2017年7月27日追記:日本経済新聞の記事で「25万ワット」との記述がありました)

アルファ碁、あんた、「どこかの街」くらい、電気食ってますな・・

スポンサーリンク

Posted by nobuhiro harada