Общие сведения о CoreML в Xamarin.iOS
CoreML обеспечивает машинное обучение в iOS. Приложения могут воспользоваться обученными моделями машинного обучения для выполнения любых задач, от решения проблем до распознавания изображений.
В этом руководстве рассматриваются следующие сведения:
Начало работы с CoreML
В этих шагах описывается, как добавить CoreML в проект iOS.
1. Добавление модели CoreML в проект
Добавьте модель CoreML (файл с расширением MLModel ) в каталог ресурсов проекта.
В свойствах файла модели его действие сборки имеет значение CoreMLModel. Это означает, что он будет скомпилирован в mlmodelc-файл при создании приложения.
2. Загрузка модели
Загрузите модель с помощью MLModel.Create
статического метода:
var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);
3. Установка параметров
Параметры модели передаются и выходят с помощью класса контейнера, реализующего IMLFeatureProvider
.
Классы поставщика функций ведут себя как словарь строк и MLFeatureValue
s, где каждое значение функции может быть простой строкой или числом, массивом или данными, или буфером пикселей, содержащим изображение.
Ниже показан код поставщика функций с одним значением:
public class MyInput : NSObject, IMLFeatureProvider
{
public double MyParam { get; set; }
public NSSet<NSString> FeatureNames => new NSSet<NSString>(new NSString("myParam"));
public MLFeatureValue GetFeatureValue(string featureName)
{
if (featureName == "myParam")
return MLFeatureValue.FromDouble(MyParam);
return MLFeatureValue.FromDouble(0); // default value
}
Используя такие классы, входные параметры можно предоставить таким образом, как понять CoreML. Имена функций (например myParam
, в примере кода) должны соответствовать ожидаемому модели.
4. Запуск модели
Для использования модели требуется, чтобы поставщик компонентов был создан и заданы параметры, а затем вызывается GetPrediction
метод:
var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);
5. Извлечение результатов
Результат outFeatures
прогнозирования также является экземпляром выходных IMLFeatureProvider
значений, к которым можно получить доступ с GetFeatureValue
именем каждого выходного параметра (например theResult
, в следующем примере:
var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800
Использование CoreML с платформой визуального зрения
CoreML также можно использовать в сочетании с платформой Визуального распознавания для выполнения операций с изображением, таких как распознавание фигур, идентификация объектов и другие задачи.
В приведенных ниже шагах описано, как CoreML и Vision можно использовать вместе. Пример объединяет распознавание прямоугольников из платформы Визуального распознавания с моделью MNINSTClassifier CoreML для идентификации рукописной цифры на фотографии.
1. Создание модели CoreML для визуального зрения
Модель CoreML MNISTClassifier загружается, а затем упаковывается в нее VNCoreMLModel
, что делает модель доступной для задач визуального зрения. Этот код также создает два запроса визуального зрения: сначала для поиска прямоугольников на изображении, а затем для обработки прямоугольника с помощью модели CoreML:
// Load the ML model
var bundle = NSBundle.MainBundle;
var assetPath = bundle.GetUrlForResource("MNISTClassifier", "mlmodelc");
NSError mlErr, vnErr;
var mlModel = MLModel.Create(assetPath, out mlErr);
var model = VNCoreMLModel.FromMLModel(mlModel, out vnErr);
// Initialize Vision requests
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
ClassificationRequest = new VNCoreMLRequest(model, HandleClassification);
Класс по-прежнему должен реализовать HandleRectangles
методы и HandleClassification
методы для запросов визуального зрения, показанные на шагах 3 и 4 ниже.
2. Запуск обработки визуального зрения
Следующий код начинает обработку запроса. В примере CoreMLVision этот код запускается после того, как пользователь выбрал изображение:
// Run the rectangle detector, which upon completion runs the ML classifier.
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
handler.Perform(new VNRequest[] {RectangleRequest}, out NSError error);
});
Этот обработчик передает платформу ciImage
VNDetectRectanglesRequest
Визуального зрения, созданную на шаге 1.
3. Обработка результатов обработки визуального зрения
После завершения обнаружения прямоугольника он выполняет метод, который обрезает HandleRectangles
изображение для извлечения первого прямоугольника, преобразует изображение прямоугольника в серый масштаб и передает его в модель CoreML для классификации.
Параметр request
, переданный этому методу, содержит сведения о запросе визуального зрения и использовании GetResults<VNRectangleObservation>()
метода, он возвращает список прямоугольников, найденных на изображении. Первый прямоугольник observations[0]
извлекается и передается в модель CoreML:
void HandleRectangles(VNRequest request, NSError error) {
var observations = request.GetResults<VNRectangleObservation>();
// ... omitted error handling ...
var detectedRectangle = observations[0]; // first rectangle
// ... omitted cropping and greyscale conversion ...
// Run the Core ML MNIST classifier -- results in handleClassification method
var handler = new VNImageRequestHandler(correctedImage, new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(() => {
handler.Perform(new VNRequest[] {ClassificationRequest}, out NSError err);
});
}
Он ClassificationRequest
был инициализирован на шаге 1, чтобы использовать метод, определенный HandleClassification
на следующем шаге.
4. Обработка CoreML
Параметр request
, переданный этому методу, содержит сведения о запросе CoreML и использование GetResults<VNClassificationObservation>()
метода, он возвращает список возможных результатов, упорядоченных по достоверности (сначала наивысшая достоверность):
void HandleClassification(VNRequest request, NSError error){
var observations = request.GetResults<VNClassificationObservation>();
// ... omitted error handling ...
var best = observations[0]; // first/best classification result
// render in UI
DispatchQueue.MainQueue.DispatchAsync(()=>{
ClassificationLabel.Text = $"Classification: {best.Identifier} Confidence: {best.Confidence * 100f:#.00}%";
});
}