11
10

More than 1 year has passed since last update.

スマホでリアルタイムで物体を認識したいなら、CoreMLモデルにカメラフィードを食わせるだけでOK

Posted at

iPhoneのカメラでリアルタイムで物体認識をする方法です

Jan-10-2022 13-44-52.gif

スマホのカメラで物体認識をするのはかんたんなのか?

スマホのカメラにうつるものがリアルタイムで判別できれば、色々なアプリに応用できそう。
しかし、物体認識は機械学習でおこなうが、ちょっとややこしそうな気もする。
しかも、1枚の画像ならまだしも、リアルタイムでカメラの映像を認識するのは設定が多そう。

CoreMLモデルにCaptureOutputを食わせるだけ

実は、それほどたくさんコードが必要なわけではない。
CoreMLモデルさえあれば、AVFoundationで取得したフレームをモデルに与えるだけで、リアルタイム物体認識ができる。

手法

まずはCoreMLの画像認識モデルを入手する。
ネット上から入手できるので、好みのものを使おう。
Appleが公式に配布しているものなど、画像認識モデルにはいろいろな種類があり精度もさまざまだが、
今回は、CoreMLモデル・ズーであるCoreML-Modelsから最新モデルであるRepVGGをダウンロードしてつかってみる。

モデルをSwiftで初期化する。

self.coreMLRequest = VNCoreMLRequest(model: try! VNCoreMLModel(for: try! RepVGG-A0(configuration:MLModelConfiguration()).model))

AVCaptureOutputのフレームをモデルに食わせる。

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {        
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

    let handler = VNImageRequestHandler(cvPixelBuffer:buffer, orientation: .right, options: [:])
    do {
        try handler.perform([self.coreMLRequest])
        guard let result = self.coreMLRequest.results?.first as? VNClassificationObservation else { return }
        let label = observation.identifier
        let confidence = observation.confidence
    } catch let error {
        print(error)
        return nil
    }
}

これで、リアルタイムで認識結果のラベル(クラス名)と信頼度が得られます。
高速にフレームごとに処理してくれます。
Jan-10-2022 13-44-52.gif

さまざまな用途に

このような手法でスマホのカメラに映った任意のものをリアルタイムで判別できれば、コンシューマーだけでなく例えば監視カメラの映像を判別したり、工場のラインで物体認識したり、いろいろな用途に使えます。

🐣


フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。

Twitter
Medium

11
10
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
11
10