... > Swift > Интеграция CoreML для...

Интеграция CoreML для машинного обучения в приложения в swift

НАВИГАЦИЯ ПО СТРАНИЦЕ

Подготовка модели Использование Core ML в коде Интеграция

Интеграция Core ML в приложения на Swift позволяет использовать модели машинного обучения для решения различных задач, таких как распознавание изображений, классификация текста и другие. Вот основные шаги для интеграции Core ML в ваше приложение:

Подготовка модели машинного обучения

  1. Выбор и конвертация модели:

    • Выберите модель машинного обучения, совместимую с Core ML. Множество моделей доступны на платформах, таких как [Apple's Model Zoo] (https://developer.apple.com/machine-learning/models/).

    • Конвертируйте выбранную модель в формат Core ML (обычно .mlmodel).

  2. 2. Интеграция модели в проект:

    • Добавьте .mlmodel файл в ваш проект Xcode.

    • Удостоверьтесь, что модель правильно добавлена к цели вашего приложения.

Использование Core ML в коде

  1. Создание экземпляра MLModel:

    • Используйте MLModel для создания экземпляра модели в коде.

      import CoreML
      
      if let model = try? YourModel() {
          // Ваш код
      }
  2. Подготовка входных данных:

    • Подготовьте входные данные в формате, который принимает ваша модель.

      import CoreML
      
      if let input = YourModelInput(...) {
          // Ваш код
      }
  3. Выполнение предсказания:

    • Вызовите метод prediction модели для выполнения предсказания.

      import CoreML
      
      if let output = try? model.prediction(input: input) as? YourModelOutput {
          // Обработка вывода предсказания
      }

Интеграция в пользовательский интерфейс

  1. Обновление пользовательского интерфейса:

    • Обновите пользовательский интерфейс в соответствии с результатами предсказания.

      import UIKit
      
      class YourViewController: UIViewController {
          @IBOutlet weak var resultLabel: UILabel!
      
          func updateUI(with prediction: YourModelOutput) {
              resultLabel.text = "Предсказание: \(prediction.someProperty)"
          }
      }
  2. Интеграция с камерой или другими входными данными (по необходимости):

    • Если ваша модель работает с изображениями, камерой или другими входными данными, интегрируйте соответствующие API (например, AVCapture для камеры).

Пример интеграции в коде:

import UIKit
import CoreML
import Vision

class ImageClassificationViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var resultLabel: UILabel!

    lazy var classificationRequest: VNCoreMLRequest = {
        do {
            let model = try VNCoreMLModel(for: YourImageClassificationModel().model)
            let request = VNCoreMLRequest(model: model) { [weak self] request, error in
                self?.processClassifications(for: request, error: error)
            }
            request.imageCropAndScaleOption = .centerCrop
            return request
        } catch {
            fatalError("Ошибка при создании запроса: \(error.localizedDescription)")
        }
    }()

    func processClassifications(for request: VNRequest, error: Error?) {
        DispatchQueue.main.async {
            if let results = request.results {
                let classifications = results as! [VNClassificationObservation]
                if classifications.isEmpty {
                    self.resultLabel.text = "Ничего не распознано."
                } else {
                    let topClassification = classifications[0]
                    self.resultLabel.text = "Предсказание: \(topClassification.identifier) (\(topClassification.confidence * 100)%)"
                }
            } else if let error = error {
                self.resultLabel.text = "Ошибка при выполнении предсказания: \(error.localizedDescription)"
            }
        }
    }

    @IBAction func chooseImage(_ sender: Any) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary
        present(imagePicker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true, completion: nil)
        resultLabel.text = "Предсказание: (ожидание)"
        if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.contentMode = .scaleAspectFit
            imageView.image = pickedImage
            classifyImage(image: pickedImage)
        }
    }

    func classifyImage(image: UIImage) {
        guard let ciImage = CIImage(image: image) else {
            fatalError("Не удалось создать CIImage из UIImage")
        }
        
        let orientation = CGImagePropertyOrientation(image.imageOrientation)
        DispatchQueue.global(qos: .userInitiated).async {
            let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
            do {
                try handler.perform([self.classificationRequest])
            } catch {
                DispatchQueue.main.async {
                    self.resultLabel.text = "Ошибка при выполнении запроса: \(error.localizedDescription)"
                }
            }
        }
    }
}