初めまして!
bravesoft株式会社でiOSエンジニアをしている永井です。
最近、Visionフレームワークに触る機会があり、機械学習機能は「面白い!」と個人的になりました。もっと追求するべく、Appleの機械学習から画像分類というのを見つけたので今回は「CreateML」についてのモデル作成からアプリの組み込み/実装までの記事となります。
この記事では、bravesoftの自社開発にあるキャラクターを分類していきます。
この記事で得られるもの
・CreateMLの基礎知識
・画像分類モデルについて
・モデルの作成方法
・モデルのアプリ組み込み
CreateMLとは
macOS向けに開発された機械学習モデル構築フレームワークです。GUIベースのツールで、テキスト分類や画像分類や音声分類などのタスクを簡単に実行できます。Swiftとのシームレスな統合が特徴で、最適化されたモデルを生成し、Core MLでの統合も容易で作成したアプリに簡単に組み込むことが可能です。
公式サイト
https://developer.apple.com/jp/machine-learning/create-ml/
Image Classifier(画像分類)モデルとは
「Image Classifier(画像分類)」とは画像を認識する機械学習モデルです。
画像を与えると、その画像のカテゴリ ラベルが返されます。
画像分類をトレーニングするには、キリンやゾウなどの写真を収集することで動物を認識するようにトレーニングすることにより精度を上げていきます。
上記のトレーニングにより、モデルの作成ができます。
今回用意するトレーニングデータ
**フォルダ構成**
BraveCharacterTrainingData
ー ボケイヌ
|
------- 1~16のボケイヌ画像データ
ー ホンネコ
|
------- 1~16のホンネコ画像データ
警告
上記のようなフォルダ構成でないと上手くトレーニングできないので構成を守ってください。また、分類したい物毎にフォルダを作成してください。「ボケイヌ」と「ホンネコ」のフォルダ名がラベルになります。
MLの作成手順
手順1 - Image Classifierプロジェクトを作成する
Xcode起動 → 上のメニュー「Xcode」 → Open Developer Tool → Create MLをクリックします。
上記の画像にある、「New Document」をクリックします。
Allカテゴリから、「Image Classification」を選択し、「Next」を押しましょう。
ProjectNameを入力しましょう。今回は、「BraveCharacterImageClassifier」という名前にします。Author,License,Descriptionは任意です。入力できたら、「Next」で次にいきます。
プロジェクトファイルを作成すると上記の画面が表示されます。これでImage Classifierプロジェクトの作成は完了です。次はトレーニングをしていきます。
手順2 - 実際にトレーニングをする
Settingsタブ - DataのTraining Dataの➕ボタンをクリックしてください。
そして、今回用意したトレーニングデータフォルダを選択します。
トレーニングデータを入れると上記のようにItem件数が表示されます。
トレーニングデータがセットされた状態で「Train」ボタンを押します。
トレーニングが完了するまで待ちましょう。
上記のようにTrainingタブではトレーニング後の認識できた画像件数と精度が記載されます。
トレーニングしたモデルで評価してみよう
EvaluationタブでTestingDataにトレーニングデータと同じフォルダ構成でテストデータフォルダを用意して追加します。
名前 | 説明 |
---|---|
Class | モデルが分類するカテゴリ |
Count | テストデータの各クラスの合計枚数 |
Correct | モデルが正しく分類された合計枚数 |
False Positives | 偽陽性 - モデルがクラスとして誤って分類してしまった合計枚数 |
False Negatives | 偽陰性 - モデルがクラスとして分類すべきだったが誤って他のクラスに分類した合計枚数 |
Precision | 適合率 - モデルがそのクラスとして予測したうち、実際にクラスに属する画像の割合 |
Recall | 再現率 - そのクラスに属する画像のうち、モデルが正しく予測した割合 |
F1 Score | スコアで0から1の範囲で表示され、1が最高スコア |
Exploreタブでは、結果をフィルタリングして対象の画像を見ることができます。
トレーニングしたモデルでプレビューしてみよう
方法1
画像を直接アップする方法
左下の➕ボタン→ Add filesで直接画像をアップできます。
アップが完了すると、クラス分類を瞬時にしてくれます。
方法2
Live PreviewでMacのカメラを通す方法
リアルタイムでカメラに画像分類させたいものを映すことで、その場でクラス分類してくれます。
手順3 - 作成したモデルを保存する
Class Labelsに分類予定のものが記載されていることを確認して、添付の赤枠部分「Get」を押してモデルを保存しましょう。これでモデルの作成は完了しました。続いて、モデルをアプリに組み込んでいきましょう。
MLモデルのアプリ組み込み
今回は、Classifying Images with Vision and Core MLのサンプルアプリを使用して、組み込んでいきます。まずは、上記のリンクからサンプルをダウンロードしてください。
Xcodeでダウンロードしたプロジェクトを開くと、上記と同じようになります。
Modelsディレクトリがあるので、そこに先ほど作成したモデルをドラック&ドロップで組み込んでいきます。
既存にある「MobileNet」の下あたりにドロップして、モデルを入れてください。
上記のようになれば、組み込み完了で準備は整いました。
次は実際にサンプルアプリで動かしていきます。
サンプルアプリで試してみよう!(UIKit)
先ほどサンプルアプリを公式からダウンロードしたプロジェクトを使います。
ImagePredictor.swiftファイルを選択して、下記コードを探してコードを変更してください。
// 既存のモデル組み込み
let imageClassifierWrapper = try? MobileNet(configuration: defaultConfig)
↓
// 作成したモデルを組み込み
let imageClassifierWrapper = try? BraveCharacterImageClassifier(configuration: defaultConfig)
変更後に、ビルドしてみましょう!
実機画面
SwiftUIでリアルタイムに画像分類できるアプリを作成しよう!
先ほどのサンプルはUIKitだったので、SwiftUIではトレーニングモデルのプレビューと同様にLive PreviewでiPhoneカメラを使ったリアルタイム画像分類アプリを作成を紹介します。
ファイル構成
作成したモデルはMLModelsディレクトリに入れてください。
ContentView
import SwiftUI
struct ContentView: View {
@State private var classificationLabel: String = ""
var body: some View {
VStack {
CameraView(classificationLabel: $classificationLabel)
.edgesIgnoringSafeArea(.all)
Text(classificationLabel)
.padding()
.background(Color.white)
.cornerRadius(10)
.shadow(radius: 10)
}
}
}
CameraView
カメラプレビューを表示させるmakeUIViewControllerの処理は割愛します。
import SwiftUI
import AVFoundation
import Vision
import CoreML
struct CameraView: UIViewControllerRepresentable {
// 画像分類結果のラベル
@Binding var classificationLabel: String
class Coordinator: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
var parent: CameraView
var imageClassifierVisionModel: VNCoreMLModel?
init(parent: CameraView) {
self.parent = parent
// CoreMLモデルのロード
let defaultConfig = MLModelConfiguration()
let imageClassifierWrapper = try? BraveCharacterImageClassifier(configuration: defaultConfig)
guard let imageClassifier = imageClassifierWrapper else {
fatalError("App failed to create an image classifier model instance.")
}
let imageClassifierModel = imageClassifier.model
self.imageClassifierVisionModel = try? VNCoreMLModel(for: imageClassifierModel)
}
// カメラフレームがキャプチャされたときに呼び出されるデリゲートメソッド
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
let imageClassifierVisionModel = imageClassifierVisionModel
else { return }
// 画像分類リクエストを作成
let request = VNCoreMLRequest(model: imageClassifierVisionModel) { (request, error) in
if let results = request.results as? [VNClassificationObservation] {
if let firstResult = results.first {
let confidence = firstResult.confidence
let identifier = firstResult.identifier
DispatchQueue.main.async {
self.parent.classificationLabel = "\(identifier) (信頼度: \(Int(confidence * 100))%)"
}
}
}
}
// リクエストハンドラを作成して画像分類を実行
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
try? handler.perform([request])
}
}
captureOutputに画像分類のリクエストを投げることでフレーム毎に分析することができます。これにより、分析結果がClassificationLabelに文字列が入っていきます。
全体のコードは以上になるのでビルドしてみましょう!
実機画面
このようにSwiftUIでリアルタイム画像分析できましたね!
以上になります。お疲れ様でした。
終わりに
今回の記事では、CreatMLでの画像分類モデルの作成からアプリの組み込み、実際の使用例などを紹介させていただきました。
画像分類モデル以外にも、ビデオや音声など様々な機械学習ができるようにAppleが提供しているので他にも試してみたいですね。
機械学習によるオンデバイスAPI「Vision」「Natural Language」「Speech」「Sound Anlysis」と幅広くあり、どれもワクワクするような技術とAPIによってはアプリをさらに強化してくれるAPIが揃っているので是非、試しに作ってみてください!
bravesoftではiOSアプリやAndroidアプリの開発を行っています。 アプリ開発に興味がある方は是非是非、採用ページをご確認ください👀
参考資料
アプリ
AppleStore
GooglePlayStore
LINEスタンプ