Skip to content
All essays
iOSMarch 27, 202515 min

Core ML Complete Guide: Machine Learning in iOS

Integrate machine learning models into iOS apps with Core ML. Image classification, text analysis, and more.

Ü
Ümit Uz
Mobile & Full Stack Developer

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

  1. 1Add .mlmodel file to your Xcode project
  2. 2Xcode automatically generates Swift interface
  3. 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

  1. 1Create ML Model: Use Create ML app
  2. 2Train: Use your dataset
  3. 3Export: Export as .mlmodel
  4. 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

  1. 1Model Size: Optimize model size for app size
  2. 2Performance: Test model performance on device
  3. 3Battery: Consider battery consumption
  4. 4Privacy: Process data on-device when possible
  5. 5Fallback: Provide fallback for unsupported devices
  6. 6Testing: Test on various devices
  7. 7Updates: Plan for model updates
  8. 8UX: Provide feedback during processing

Core ML brings powerful machine learning capabilities to iOS apps!

Related essays

Next essay
Swift Security Best Practices: Protect User Data