VisionOS で AI（Core ML） をつかう

# VisionOS でも Core ML はつかえる

![Feb-05-2024 18-56-08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0f46c404-ae02-9e25-1b97-8bb2ca02af88.gif)

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

# シンプルな手順

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

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

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

### モデルハンドラークラス

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

```swift: 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

```swift: 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　モデルは以下にあります。

https://github.com/john-rocky/CoreML-Models

いろいろやってみよう。

サンプルコードは以下

https://github.com/john-rocky/VisionOSCoreML

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

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

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

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

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

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)