SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
24.11.2024

Lição: 124: Integrando SwiftUI com Core ML

Nesta aula, exploraremos como integrar SwiftUI com o Core ML, o framework de aprendizado de máquina da Apple. Vamos criar um aplicativo simples que utiliza um modelo Core ML pré-treinado para fazer previsões com base na entrada do usuário. Para este exemplo, usaremos o modelo ImageClassifier, que pode classificar imagens em diferentes categorias.

Pré-requisitos

Antes de começarmos, verifique se você possui o seguinte:

  • Xcode instalado no seu macOS.
  • Conhecimento básico de Swift e SwiftUI.
  • Um modelo de classificação de imagens em Core ML. Você pode encontrar vários modelos pré-treinados na galeria oficial de modelos de ML da Apple ou criar o seu usando o Create ML.

Criando o Projeto

  1. Abra o Xcode e crie um novo projeto SwiftUI.
  2. Selecione "App" como o template e assegure-se de que a interface está configurada para SwiftUI.
  3. Nomeie seu projeto (por exemplo, ExemploCoreMLSwiftUI).

Importando o Modelo de Core ML

Baixe um modelo Core ML pré-treinado (por exemplo, um ImageClassifier.mlmodel) e adicione-o ao seu projeto no Xcode:

  1. Arraste o arquivo do modelo para a pasta "Models" em seu projeto Xcode.
  2. Certifique-se de que o modelo está incluído em seu alvo.

Configurando a Interface do Usuário

Vamos construir uma interface simples que permita aos usuários selecionar uma imagem e exibir o resultado da classificação.

ContentView.swift

Veja como a nossa ContentView ficará:

import SwiftUI
import CoreML
import Vision

struct ContentView: View {
    @State private var inputImage: UIImage?
    @State private var classificationLabel: String = "Escolha uma imagem para classificar"

    var body: some View {
        VStack {
            // Exibição da imagem
            if let inputImage = inputImage {
                Image(uiImage: inputImage)
                    .resizable()
                    .scaledToFit()
                    .frame(width: 300, height: 300)
                    .clipped()
            }

            Text(classificationLabel)
                .font(.headline)
                .padding()

            Button("Selecionar Imagem") {
                pickImage()
            }
            .padding()
        }
    }

    private func pickImage() {
        // Aqui vai a lógica para seleção de imagem.
    }

    private func classifyImage() {
        guard let image = inputImage else { return }
        let model = try? VNCoreMLModel(for: ImageClassifier().model)

        // Criar uma solicitação
        let request = VNCoreMLRequest(model: model!) { request, error in
            if let results = request.results as? [VNClassificationObservation], let firstResult = results.first {
                DispatchQueue.main.async {
                    self.classificationLabel = "Esta é uma \(firstResult.identifier) com confiança \(firstResult.confidence * 100)%"
                }
            }
        }

        // Criar um manipulador e executar a solicitação
        if let cgImage = image.cgImage {
            let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
            try? handler.perform([request])
        }
    }
}

Implementando a Seleção de Imagens

Vamos implementar a funcionalidade de seleção de imagens usando UIImagePickerController. Precisaremos adicionar um coordenador para isso.

import SwiftUI
import PhotosUI

struct ContentView: View {
    @State private var inputImage: UIImage?
    @State private var classificationLabel: String = "Escolha uma imagem para classificar"
    @State private var showImagePicker: Bool = false

    var body: some View {
        VStack {
            if let inputImage = inputImage {
                Image(uiImage: inputImage)
                    .resizable()
                    .scaledToFit()
                    .frame(width: 300, height: 300)
                    .clipped()
            }

            Text(classificationLabel)
                .font(.headline)
                .padding()

            Button("Selecionar Imagem") {
                showImagePicker = true
            }
            .padding()
        }
        .sheet(isPresented: $showImagePicker) {
            ImagePicker(selectedImage: $inputImage, classificationLabel: $classificationLabel)
        }
    }
}

Em seguida, vamos criar um seletor de imagem personalizado:

ImagePicker.swift

import SwiftUI
import UIKit

struct ImagePicker: UIViewControllerRepresentable {
    @Binding var selectedImage: UIImage?
    @Binding var classificationLabel: String

    class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        var parent: ImagePicker

        init(parent: ImagePicker) {
            self.parent = parent
        }

        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            if let uiImage = info[.originalImage] as? UIImage {
                parent.selectedImage = uiImage
                parent.classifyImage(uiImage)
            }
            picker.dismiss(animated: true)
        }

        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            picker.dismiss(animated: true)
        }
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator(parent: self)
    }

    func makeUIViewController(context: Context) -> UIImagePickerController {
        let picker = UIImagePickerController()
        picker.delegate = context.coordinator
        picker.sourceType = .photoLibrary
        return picker
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}

    func classifyImage(_ image: UIImage) {
        guard let cgImage = image.cgImage else { return }
        let model = try? VNCoreMLModel(for: ImageClassifier().model)

        let request = VNCoreMLRequest(model: model!) { request, error in
            if let results = request.results as? [VNClassificationObservation], let firstResult = results.first {
                DispatchQueue.main.async {
                    self.classificationLabel = "Esta é uma \(firstResult.identifier) com confiança \(String(format: "%.2f", firstResult.confidence * 100))%"
                }
            }
        }

        let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
        try? handler.perform([request])
    }
}

Resumo

Nesta aula, aprendemos como integrar SwiftUI com o Core ML para uma tarefa de classificação de imagens. Criamos um aplicativo simples em SwiftUI que permite aos usuários escolher uma imagem de sua biblioteca de fotos e exibe os resultados da classificação usando um modelo Core ML pré-treinado. Ao aproveitar o UIViewControllerRepresentable do SwiftUI, pudemos apresentar um seletor de imagens do UIKit perfeitamente em nosso aplicativo SwiftUI.

Este exemplo pode servir como uma base para aplicações mais complexas que utilizam capacidades de aprendizado de máquina e a moderna estrutura de interface do SwiftUI. Sinta-se à vontade para expandir isso explorando diferentes modelos e aprimorando a interface do usuário.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!