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
- Abra o Xcode e crie um novo projeto SwiftUI.
- Selecione "App" como o template e assegure-se de que a interface está configurada para SwiftUI.
- 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:
- Arraste o arquivo do modelo para a pasta "Models" em seu projeto Xcode.
- 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.