Core ML enables you to integrate machine learning models into iOS apps. Learn to use pre-trained models and create ML-powered features.
Getting Started with Core ML
Import a Model
- 1Add .mlmodel file to your Xcode project
- 2Xcode automatically generates Swift interface
- 3Import CoreML and Vision frameworks
swift
import CoreML
import Vision
struct ImageClassifier: View {
var body: some View {
Text("Core ML Image Classification")
}
}Image Classification
Classify Images
swift
import Vision
import UIKit
class ImageClassifier: ObservableObject {
@Published var classificationLabel: String = ""
@Published var confidence: Double = 0.0
private let model: VNCoreMLModel?
init() {
// Load MobileNet model
let config = MLModelConfiguration()
guard let mobileNet = try? MobileNetV2(configuration: config) else {
self.model = nil
return
}
self.model = try? VNCoreMLModel(for: mobileNet.model)
}
func classify(image: UIImage) {
guard let model = model else {
classificationLabel = "Model not available"
return
}
let request = VNCoreMLRequest(model: model) { [weak self] request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first else {
return
}
DispatchQueue.main.async {
self?.classificationLabel = topResult.identifier
self?.confidence = Double(topResult.confidence)
}
}
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
do {
try handler.perform([request])
} catch {
classificationLabel = "Classification failed"
}
}
}SwiftUI Integration
swift
struct ClassificationView: View {
@StateObject private var classifier = ImageClassifier()
@State private var selectedImage: UIImage?
@State private var isPickerPresented = false
var body: some View {
VStack(spacing: 20) {
if let image = selectedImage {
Image(uiImage: image)
.resizable()
.scaledToFit()
.frame(height: 300)
.cornerRadius(10)
}
Button("Select Image") {
isPickerPresented = true
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
if !classifier.classificationLabel.isEmpty {
VStack {
Text("Classification:")
.font(.headline)
Text(classifier.classificationLabel)
.font(.title)
Text("Confidence: \(String(format: "%.2f%%", classifier.confidence * 100))")
.font(.caption)
.foregroundColor(.secondary)
}
}
}
.padding()
.sheet(isPresented: $isPickerPresented) {
ImagePicker(image: $selectedImage)
}
.onChange(of: selectedImage) { _, image in
if let image = image {
classifier.classify(image: image)
}
}
}
}
struct ImagePicker: UIViewControllerRepresentable {
@Binding var image: UIImage?
@Environment(\.dismiss) var dismiss
func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator(image: $image, dismiss: dismiss)
}
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding var image: UIImage?
var dismiss: DismissAction
init(image: Binding<UIImage?>, dismiss: DismissAction) {
self._image = image
self.dismiss = dismiss
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let uiImage = info[.originalImage] as? UIImage {
image = uiImage
}
dismiss()
}
}
}Text Analysis
Natural Language Processing
swift
import NaturalLanguage
class TextAnalyzer: ObservableObject {
@Published var sentiment: String = ""
@Published var keywords: [String] = []
func analyzeSentiment(text: String) {
let tagger = NLTagger(tagSchemes: [.sentimentScore])
tagger.string = text
let (sentiment, _) = tagger.tag(at: text.startIndex, unit: .paragraph, scheme: .sentimentScore)
DispatchQueue.main.async {
switch sentiment {
case .positive:
self.sentiment = "Positive"
case .negative:
self.sentiment = "Negative"
default:
self.sentiment = "Neutral"
}
}
}
func extractKeywords(text: String) {
let tagger = NLTagger(tagSchemes: [.nameType, .lexicalClass])
tagger.string = text
var keywords: [String] = []
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .nameType, options: options) { tag, _ in
if let tag = tag, tag == .personalName || tag == .placeName {
keywords.append(String(text))
}
return true
}
DispatchQueue.main.async {
self.keywords = keywords
}
}
}Object Detection
Detect Objects in Images
swift
class ObjectDetector: ObservableObject {
@Published var detections: [DetectedObject] = []
private let model: VNCoreMLModel?
init() {
// Load YOLO or similar object detection model
let config = MLModelConfiguration()
guard let objectDetectionModel = try? YOLOv3(configuration: config) else {
self.model = nil
return
}
self.model = try? VNCoreMLModel(for: objectDetectionModel.model)
}
func detectObjects(in image: UIImage) {
guard let model = model else { return }
let request = VNCoreMLRequest(model: model) { [weak self] request, error in
guard let results = request.results as? [VNRecognizedObjectObservation] else {
return
}
let detections = results.map { observation in
DetectedObject(
label: observation.labels.first?.identifier ?? "Unknown",
confidence: Double(observation.labels.first?.confidence ?? 0),
boundingBox: observation.boundingBox
)
}
DispatchQueue.main.async {
self?.detections = detections
}
}
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try? handler.perform([request])
}
}
struct DetectedObject {
let label: String
let confidence: Double
let boundingBox: CGRect
}Face Detection
Detect Faces
swift
import Vision
class FaceDetector: ObservableObject {
@Published var faceCount: Int = 0
func detectFaces(in image: UIImage) {
let request = VNDetectFaceRectanglesRequest { [weak self] request, error in
guard let results = request.results as? [VNFaceObservation] else {
return
}
DispatchQueue.main.async {
self?.faceCount = results.count
}
}
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try? handler.perform([request])
}
}Custom Models
Create and Train Model
- 1Create ML Model: Use Create ML app
- 2Train: Use your dataset
- 3Export: Export as .mlmodel
- 4Integrate: Add to Xcode project
swift
// Use custom trained model
class CustomModelPredictor {
private let model: MyCustomModel
init() throws {
self.model = try MyCustomModel(configuration: MLModelConfiguration())
}
func predict(input: MLFeatureProvider) throws -> MyCustomModelOutput {
return try model.prediction(from: input)
}
}On-Device Training
Personalized Models
swift
import CoreML
class OnDeviceTrainer {
private var model: MLModel?
func trainModel(trainingData: MLDataTable) async throws {
// Define model structure
let model = try MLRegressor(
trainingData: trainingData,
targetColumn: "target"
)
// Save model
let metadata = MLModelMetadata(
author: "Your Name",
shortDescription: "Custom trained model",
license: nil,
version: "1.0"
)
let modelURL = try model.write(to: getDocumentsDirectory().appendingPathComponent("CustomModel.mlmodel"), metadata: metadata)
// Load model
self.model = try MLModel(contentsOf: modelURL)
}
private func getDocumentsDirectory() -> URL {
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
}
}Best Practices
- 1Model Size: Optimize model size for app size
- 2Performance: Test model performance on device
- 3Battery: Consider battery consumption
- 4Privacy: Process data on-device when possible
- 5Fallback: Provide fallback for unsupported devices
- 6Testing: Test on various devices
- 7Updates: Plan for model updates
- 8UX: Provide feedback during processing
Core ML brings powerful machine learning capabilities to iOS apps!