LoginSignup
2
1

【CreateML】画像分類モデルを作成して、bravesoftキャラクター画像分類アプリ作成してみた!

Last updated at Posted at 2024-06-21

初めまして!
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(画像分類)」とは画像を認識する機械学習モデルです。
画像を与えると、その画像のカテゴリ ラベルが返されます。
スクリーンショット 2024-06-18 11.54.35.png

画像分類をトレーニングするには、キリンやゾウなどの写真を収集することで動物を認識するようにトレーニングすることにより精度を上げていきます。
スクリーンショット 2024-06-18 11.56.31.png

上記のトレーニングにより、モデルの作成ができます。

今回用意するトレーニングデータ

スクリーンショット 2024-06-17 19.54.17.png

**フォルダ構成**
BraveCharacterTrainingData
 ー ボケイヌ
  |
  ------- 1~16のボケイヌ画像データ
 ー ホンネコ
   |
   ------- 1~16のホンネコ画像データ

警告
上記のようなフォルダ構成でないと上手くトレーニングできないので構成を守ってください。また、分類したい物毎にフォルダを作成してください。「ボケイヌ」と「ホンネコ」のフォルダ名がラベルになります。

MLの作成手順

手順1 - Image Classifierプロジェクトを作成する

スクリーンショット 2024-06-18 12.14.23.png
Xcode起動 → 上のメニュー「Xcode」 → Open Developer Tool → Create MLをクリックします。

スクリーンショット 2024-06-18 12.19.50.png
上記の画像にある、「New Document」をクリックします。

スクリーンショット 2024-06-18 12.30.31.png
Allカテゴリから、「Image Classification」を選択し、「Next」を押しましょう。

スクリーンショット 2024-06-18 12.35.58.png
ProjectNameを入力しましょう。今回は、「BraveCharacterImageClassifier」という名前にします。Author,License,Descriptionは任意です。入力できたら、「Next」で次にいきます。

スクリーンショット 2024-06-18 12.40.52.png
プロジェクトファイルを作成すると上記の画面が表示されます。これでImage Classifierプロジェクトの作成は完了です。次はトレーニングをしていきます。

手順2 - 実際にトレーニングをする

スクリーンショット 2024-06-18 12.49.16.png
Settingsタブ - DataのTraining Dataの➕ボタンをクリックしてください。
そして、今回用意したトレーニングデータフォルダを選択します。

スクリーンショット 2024-06-18 12.52.57.png
トレーニングデータを入れると上記のようにItem件数が表示されます。

スクリーンショット 2024-06-18 12.57.52.png
トレーニングデータがセットされた状態で「Train」ボタンを押します。
トレーニングが完了するまで待ちましょう。

スクリーンショット 2024-06-18 15.21.24.png
上記のようにTrainingタブではトレーニング後の認識できた画像件数と精度が記載されます。

トレーニングしたモデルで評価してみよう

スクリーンショット 2024-06-18 15.30.02.png
EvaluationタブでTestingDataにトレーニングデータと同じフォルダ構成でテストデータフォルダを用意して追加します。

スクリーンショット 2024-06-18 15.43.13.png
Metricsタブでは、様々な下記情報見ることできます。

Metrics
名前 説明
Class モデルが分類するカテゴリ
Count テストデータの各クラスの合計枚数
Correct モデルが正しく分類された合計枚数
False Positives 偽陽性 - モデルがクラスとして誤って分類してしまった合計枚数
False Negatives 偽陰性 - モデルがクラスとして分類すべきだったが誤って他のクラスに分類した合計枚数
Precision 適合率 - モデルがそのクラスとして予測したうち、実際にクラスに属する画像の割合
Recall 再現率 - そのクラスに属する画像のうち、モデルが正しく予測した割合
F1 Score スコアで0から1の範囲で表示され、1が最高スコア

Exploreタブでは、結果をフィルタリングして対象の画像を見ることができます。

スクリーンショット 2024-06-18 16.00.40.png

トレーニングしたモデルでプレビューしてみよう

方法1
画像を直接アップする方法
スクリーンショット 2024-06-18 16.07.42.png
左下の➕ボタン→ Add filesで直接画像をアップできます。
アップが完了すると、クラス分類を瞬時にしてくれます。

方法2
Live PreviewでMacのカメラを通す方法
スクリーンショット 2024-06-18 16.13.35.png
リアルタイムでカメラに画像分類させたいものを映すことで、その場でクラス分類してくれます。

手順3 - 作成したモデルを保存する

スクリーンショット 2024-06-18 16.17.23.png

Class Labelsに分類予定のものが記載されていることを確認して、添付の赤枠部分「Get」を押してモデルを保存しましょう。これでモデルの作成は完了しました。続いて、モデルをアプリに組み込んでいきましょう。

MLモデルのアプリ組み込み

今回は、Classifying Images with Vision and Core MLのサンプルアプリを使用して、組み込んでいきます。まずは、上記のリンクからサンプルをダウンロードしてください。

スクリーンショット 2024-06-18 16.24.24.png
Xcodeでダウンロードしたプロジェクトを開くと、上記と同じようになります。
Modelsディレクトリがあるので、そこに先ほど作成したモデルをドラック&ドロップで組み込んでいきます。

スクリーンショット 2024-06-18 16.27.23.png
既存にある「MobileNet」の下あたりにドロップして、モデルを入れてください。


スクリーンショット 2024-06-18 16.37.59.png

上記のようになれば、組み込み完了で準備は整いました。
次は実際にサンプルアプリで動かしていきます。

サンプルアプリで試してみよう!(UIKit)

先ほどサンプルアプリを公式からダウンロードしたプロジェクトを使います。
ImagePredictor.swiftファイルを選択して、下記コードを探してコードを変更してください。

// 既存のモデル組み込み
let imageClassifierWrapper = try? MobileNet(configuration: defaultConfig)
↓
// 作成したモデルを組み込み
let imageClassifierWrapper = try? BraveCharacterImageClassifier(configuration: defaultConfig)

変更後に、ビルドしてみましょう!

実機画面


こんな感じでボケイヌとホンネコの画像分類ができましたね!

SwiftUIでリアルタイムに画像分類できるアプリを作成しよう!

先ほどのサンプルはUIKitだったので、SwiftUIではトレーニングモデルのプレビューと同様にLive PreviewでiPhoneカメラを使ったリアルタイム画像分類アプリを作成を紹介します。

ファイル構成

スクリーンショット 2024-06-18 17.18.34.png

作成したモデルはMLModelsディレクトリに入れてください。

ContentView

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の処理は割愛します。

CameraView
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に文字列が入っていきます。
全体のコードは以上になるのでビルドしてみましょう!

実機画面

Videotogif (3).gif

このようにSwiftUIでリアルタイム画像分析できましたね!
以上になります。お疲れ様でした。

終わりに

今回の記事では、CreatMLでの画像分類モデルの作成からアプリの組み込み、実際の使用例などを紹介させていただきました。

画像分類モデル以外にも、ビデオや音声など様々な機械学習ができるようにAppleが提供しているので他にも試してみたいですね。

機械学習によるオンデバイスAPI「Vision」「Natural Language」「Speech」「Sound Anlysis」と幅広くあり、どれもワクワクするような技術とAPIによってはアプリをさらに強化してくれるAPIが揃っているので是非、試しに作ってみてください!


bravesoftではiOSアプリやAndroidアプリの開発を行っています。 アプリ開発に興味がある方は是非是非、採用ページをご確認ください👀

参考資料

アプリ

AppleStore

GooglePlayStore

LINEスタンプ

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1