1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VisionOS でも Core ML はつかえる

Feb-05-2024 18-56-08.gif

とりあえずシンプルな使い方。
AnimeGANで顔画像をアニメ風にしてみる。

シンプルな手順

Core ML モデルファイルを Xcode に追加

モデル処理コードと SwiftUI で表示するコードを書く

シンプルに Window に Core ML で処理した画像を表示するだけなので(最初は Core ML つかえるか試すだけだからそれでいいの!)、 SwiftUI で書けばいい。 iOSと変わらない。

モデルハンドラークラス

普通に Vision の VNCoreMLRequest を実行するだけ。

ModelHandler.swift
import SwiftUI
import Vision

class ModelHandler: ObservableObject {
    @Published var resultImage: UIImage?
    private var request: VNCoreMLRequest!

    init() {
        setupModel()
    }

    private func setupModel() {
        guard let model = try? VNCoreMLModel(for: animegan2face_paint_512_v2().model) else {
            fatalError()
        }

        self.request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
            guard let results = request.results, let firstResult = results.first as? VNPixelBufferObservation else {
                return
            }
            let ciImage = CIImage(cvPixelBuffer: firstResult.pixelBuffer)
            let context = CIContext()
            guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else { return }
            DispatchQueue.main.async {
                self?.resultImage = UIImage(cgImage: cgImage)
            }
        })
    }

    func processImage(_ uiImage: UIImage) {
        guard let ciImage = CIImage(image: uiImage) else {
            fatalError()
        }
        
        let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])
        DispatchQueue.global(qos: .userInteractive).async {
            do {
                try handler.perform([self.request])
            } catch {
                fatalError()
            }
        }
    }
}

UI

ContentView.swift

import SwiftUI

struct ContentView: View {
    @State private var inputImage: UIImage = UIImage(named: "myFace")!
    @ObservedObject var modelHandler = ModelHandler()

    var body: some View {
        VStack {
                Image(uiImage: inputImage)
                    .resizable()
                    .scaledToFit()
            
            if let resultImage = modelHandler.resultImage {
                Image(uiImage: resultImage)
                    .resizable()
                    .scaledToFit()
            }
            Button("ToAnime") {
                modelHandler.processImage(inputImage)
            }
        }
        .padding()
    }
}

#Preview(windowStyle: .automatic) {
    ContentView()
}

ボタンを押すとアニメ風になる。
これだけ。

とはいえ、Core ML がふつうに使えてよかった。

Core ML モデルは以下にあります。

いろいろやってみよう。

サンプルコードは以下

🐣


フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習/AR関連の情報を発信しています。

X
Medium
GitHub

1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?