Учебник. Повторное обучение классификатора изображений TensorFlow с помощью передачи обучения и ML.NET

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Из этой статьи вы узнаете, как повторно обучить модель TensorFlow для классификации изображений с помощью передачи обучения и ML.NET. Исходная модель была обучена для классификации отдельных изображений. После повторного обучения новая модель сортирует изображения по различным категориям.

Обучение модели для классификации изображений с нуля предусматривает настройку нескольких миллионов параметров, а также использование огромных объемов помеченных данных обучения и вычислительных ресурсов (сотни часов работы GPU). Хотя передача обучения не настолько эффективна, как обучение пользовательской модели с нуля, этот подход позволяет значительно ускорить соответствующий процесс с использованием всего нескольких тысяч изображений (а не миллионов помеченных изображений) для быстрого создания пользовательской модели (в пределах часа на компьютере без GPU).

В этом руководстве вы узнаете, как:

  • Определение проблемы
  • повторно использовать и настраивать предварительно обученную модель;
  • классифицировать изображения.

Что собой представляет передача обучения?

Хотели ли бы вы иметь возможность повторно использовать предварительно обученную модель для решения похожей проблемы, а также переобучать для этой цели все или некоторые слои такой модели? Подход с повторным использованием части уже обученной модели для создания новой называется передачей обучения.

Пример классификации изображений

Этот пример представляет собой консольное приложение, которое использует ML.NET для создания классификатора изображений путем повторного применения предварительно обученной модели для классификации изображений на основе небольшого объема данных обучения.

Исходный код для этого руководства можно найти в репозитории dotnet/samples. Обратите внимание на то, что по умолчанию конфигурации проекта .NET в этом руководстве предназначена для .NET Core 2.2.

Предварительные требования

Выбор подходящей задачи машинного обучения

Глубокое обучение — это разновидность машинного обучения, которая произвела революцию в области компьютерного зрения и распознавания речи.

Модели глубокого обучения обучаются на крупных наборах помеченных данных с использованием нейронных сетей, которые содержат множество слоев обучения. Глубокое обучение:

  • лучше выполняет некоторые задачи, например в области компьютерного зрения;

  • хорошо работает с огромными объемами данных.

Классификация изображений — это типичная задача Машинного обучения, которая позволяет автоматически классифицировать изображения по нескольким категориям, например:

  • для определения того, содержит ли изображение человеческое лицо;
  • для различения изображений котов и собак.

Или же она помогает определить тип объекта на изображении — еда, игрушка или прибор:

Изображение с пиццей Изображение с плюшевым мишкой Изображение с тостером

Примечание

Изображения выше принадлежат Викискладу и имеют следующие атрибуты:

При передаче обучения могут использоваться разные стратегии, например переобучение всех слоев и предпоследнего слоя. В этом руководстве поясняется и демонстрируется, как использовать стратегию предпоследнего слоя. В рамках стратегии предпоследнего слоя повторно используется модель, которая уже предварительно обучена решать конкретную проблему. Последний слой такой модели затем переобучается для решения новой проблемы. Повторное использование предварительно обученной модели для работы с новой моделью значительно экономит время и ресурсы.

Ваш пример модели классификации изображений повторно использует модель Inception, популярную модель распознавания изображений, обученную на наборе данных ImageNet. В ходе этого процесса модель TensorFlow пытается выполнять классификацию целых изображений по множеству классов, например "Зонтик", "Майка" и "Посудомойка".

Inception v1 model можно классифицировать как сверточную глубокую нейронную сеть, которая может обеспечить достаточную производительность при выполнении сложных задач визуального распознавания, достигая в некоторых областях уровней не ниже или даже выше человеческих возможностей. Эта модель (алгоритм) разработана коллективом исследователей на основе исходной публикации Rethinking the Inception Architecture for Computer Vision за авторством Szegedy и др.

Так как Inception model уже обучена на тысячах различных изображений, она содержит признаки изображений, необходимые для их идентификации. Нижние слои признаков изображений распознают простые признаки (например, контуры), а верхние слои — более сложные признаки (например, формы). Последний слой обучается на наборе данных намного меньшего размера, так как вы используете уже обученную модель, которая может классифицировать изображения. Так как ваша модель позволяет классифицировать изображения более чем по двум категориям, она относится к многоклассовым классификаторам.

TensorFlow — это популярный набор средств глубокого (машинного) обучения, который позволяет обучать глубокие нейронные сети и выполнять общие вычисления с числами. Они реализуется в ML.NET как transformer. В этом руководстве он используется для повторного использования Inception model.

Как показано на схеме ниже, вам нужно добавить ссылки на пакеты NuGet ML.NET в приложения .NET Core или .NET Framework. На внутреннем уровне ML.NET включает и ссылается на встроенную библиотеку TensorFlow, которая позволяет создавать код, загружающий существующую обученную модель TensorFlow для оценки.

Схема преобразования ML.NET с использованием TensorFlow

Модель Inception model обучена классифицировать изображения по тысяче категорий, но вам столько категорий не нужно. Также вам нужны четко определенные категории. Перейдем к этапу передачи (transfer) этого процесса передачи обучения (transfer learning). Вы можете передать способность Inception model распознавать и классифицировать изображения в новые ограниченные категории своего классификатора изображений.

Также вы можете переобучить последний слой такой модели с помощью набора из трех категорий:

  • еда;
  • игрушка;
  • прибор.

Ваш слой будет использовать алгоритм мультиномиальной логистической регрессии для поиска корректной категории за минимальное время. Для поиска ответа этот алгоритм выполняет классификацию на основе вероятностей, присваивая соответствующей категории значение единицы, а всем остальным — нулевое значение.

DataSet

Доступны два источника данных: файл .tsv и файлы образов. Файл tags.tsv содержит два столбца: первый определен как ImagePath, а во втором указана метка Label, соответствующая изображению. В примере файла ниже отсутствует строка заголовка. Сам файл выглядит следующим образом:

tsv

broccoli.jpg    food pizza.jpg   food pizza2.jpg  food teddy2.jpg  toy teddy3.jpg  toy teddy4.jpg  toy toaster.jpg appliance toaster2.png    appliance 

Изображения для обучения и тестирования расположены в папках ресурсов, которые вы скачали в виде ZIP-файла. Эти изображения принадлежат Викискладу.

Викисклад, бесплатный репозиторий мультимедиа. Получено в 10:48 17 октября 2018 г. со страниц:
https://commons.wikimedia.org/wiki/Pizzahttps://commons.wikimedia.org/wiki/Toasterhttps://commons.wikimedia.org/wiki/Teddy_bear

Создание консольного приложения

Создание проекта

  1. Создайте консольное приложение .NET Core с именем TransferLearningTF.

  2. Установите пакет NuGet для Microsoft.ML:

    В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet. Выберите nuget.org в качестве источника пакета, откройте вкладку "Обзор" и выполните поиск Microsoft.ML. Щелкните раскрывающийся список Версия, выберите пакет 1.0.0 в списке и нажмите кнопку Установить. Нажмите кнопку ОК в диалоговом окне Предварительный просмотр изменений, а затем нажмите кнопку Принимаю в диалоговом окне Принятие условий лицензионного соглашения, если вы согласны с указанными условиями лицензионного соглашения для выбранных пакетов. Повторите эти шаги для пакетов Microsoft.ML.ImageAnalytics версии 1.0.0 и Microsoft.ML.TensorFlow версии 0.12.0.

подготавливать данные;

  1. Скачайте ZIP-файл каталога с ресурсами проекта и распакуйте его.

  2. Скопируйте каталог assets в каталог проекта TransferLearningTF. Этот каталог и его подкаталоги содержат данные и файлы поддержки (за исключением модели Inception, которую вы скачаете и добавите на следующем шаге), необходимые для работы с этим руководством.

  3. Скачайте модель Inception и распакуйте ее.

  4. Скопируйте содержание каталога inception5h, который вы распаковали, в каталог assetsinputs-traininception проекта TransferLearningTF. Этот каталог содержит модель и дополнительные файлы поддержки, необходимые для работы с этим руководством, как показано на следующем рисунке:

    Содержание каталога Inception
  5. В обозревателе решений щелкните правой кнопкой мыши каждый файл в каталоге и подкаталогах ресурсов и выберите Свойства. В разделе Дополнительно для параметра Копировать в выходной каталог установите значение Копировать более позднюю версию.

Создание классов и определение путей

Добавьте следующие новые операторы using в начало файла Program.cs:

C#

using System; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Data.IO; using Microsoft.ML.Trainers; using Microsoft.ML.Transforms.Image; 

Создайте глобальные поля для хранения путей к различным ресурсам, а также глобальные переменные для значений LabelTokey, ImageReal и PredictedLabelValue:

  • _assetsPath содержит путь к ресурсам.
  • _trainTagsTsv содержит путь к TSV-файлу с тегами данных изображения обучения.
  • _predictTagsTsv содержит путь к TSV-файлу с тегами данных изображения прогнозирования.
  • _trainImagesFolder содержит путь к изображениям, используемым для обучения модели.
  • _predictImagesFolder содержит путь к изображениям, классифицируемым обученной моделью.
  • _inceptionPb содержит путь к предварительно обученной модели Inception, которая используется для переобучения вашей модели.
  • _inputImageClassifierZip содержит путь, из которого загружается обученная модель.
  • _outputImageClassifierZip содержит путь, по которому сохраняется обученная модель.
  • LabelTokey — это значение Label, сопоставленное с ключом.
  • ImageReal — это столбец, содержащий спрогнозированное значение изображения.
  • PredictedLabelValue — это столбец, содержащий спрогнозированное значение метки.

Добавьте следующий код в строку непосредственно над методом Main, чтобы указать эти пути и другие переменные:

C#

static readonly string _assetsPath = Path.Combine(Environment.CurrentDirectory, "assets"); static readonly string _trainTagsTsv = Path.Combine(_assetsPath, "inputs-train", "data", "tags.tsv"); static readonly string _predictImageListTsv = Path.Combine(_assetsPath, "inputs-predict", "data", "image_list.tsv"); static readonly string _trainImagesFolder = Path.Combine(_assetsPath, "inputs-train", "data"); static readonly string _predictImagesFolder = Path.Combine(_assetsPath, "inputs-predict", "data"); static readonly string _predictSingleImage = Path.Combine(_assetsPath, "inputs-predict-single", "data", "toaster3.jpg"); static readonly string _inceptionPb = Path.Combine(_assetsPath, "inputs-train", "inception", "tensorflow_inception_graph.pb"); static readonly string _inputImageClassifierZip = Path.Combine(_assetsPath, "inputs-predict", "imageClassifier.zip"); static readonly string _outputImageClassifierZip = Path.Combine(_assetsPath, "outputs", "imageClassifier.zip"); private static string LabelTokey = nameof(LabelTokey); private static string PredictedLabelValue = nameof(PredictedLabelValue); 

Создайте несколько классов для входных данных и прогнозов. Добавьте в проект новый класс:

  1. В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункты Добавить > Новый элемент.

  2. В диалоговом окне Добавление нового элемента выберите Класс и измените значение поля Имя на ImageData.cs. Теперь нажмите кнопку Добавить.

    Файл ImageData.cs откроется в редакторе кода. Добавьте следующую инструкцию using в начало файла ImageData.cs:

C#

using Microsoft.ML.Data; 

Удалите существующее определение класса и добавьте следующий код для класса ImageData в файл ImageData.cs:

C#

public class ImageData {     [LoadColumn(0)]     public string ImagePath;      [LoadColumn(1)]     public string Label; } 

ImageData является классом входных данных изображения и имеет следующие поля String:

  • ImagePath содержит имя файла изображения.
  • Label содержит значение для метки изображения.

Добавьте новый класс в свой проект для ImagePrediction:

  1. В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункты Добавить > Новый элемент.

  2. В диалоговом окне Добавление нового элемента выберите Класс и измените значение поля Имя на ImagePrediction.cs. Теперь нажмите кнопку Добавить.

    Файл ImagePrediction.cs откроется в редакторе кода. Удалите обе инструкции using System.Collections.Generic и System.Text в начале файла ImagePrediction.cs:

Удалите существующее определение класса и добавьте следующий код с классом ImagePrediction в файл ImagePrediction.cs:

C#

public class ImagePrediction : ImageData {     public float[] Score;      public string PredictedLabelValue; } 

ImagePrediction является классом прогноза изображения и имеет следующие поля:

  • Score содержит процентное значение достоверности для конкретной классификации изображения.
  • PredictedLabelValue содержит значение для прогнозируемой метки классификации изображения.

Класс ImagePrediction используется для прогнозирования после обучения модели. Он включает string (ImagePath) с путем к изображению. Label используется для применения и переобучения модели. PredictedLabelValue используется для прогнозирования и оценки. Для оценки применяются входные обучающие данные, прогнозируемые значения и модель.

Класс MLContext является отправной точкой для любых операций ML.NET. В результате инициализации класса mlContext создается среда ML.NET, которая может использоваться всеми объектами в рамках процесса создания модели. По существу он аналогичен классу DBContext в Entity Framework.

Инициализация переменных в методе Main

Инициализируйте переменную mlContext с использованием нового экземпляра MLContext. Замените строку Console.WriteLine("Hello World!") в методе Main следующим кодом:

C#

MLContext mlContext = new MLContext(seed: 1); 

Создание структуры для параметров по умолчанию

Модель Inception имеет несколько параметров по умолчанию, которые необходимо передать. Создайте структуру, чтобы сопоставить значения параметров по умолчанию с понятными именами, с помощью следующего кода сразу после метода Main():

C#

private struct InceptionSettings {     public const int ImageHeight = 224;     public const int ImageWidth = 224;     public const float Mean = 117;     public const float Scale = 1;     public const bool ChannelsLast = true; } 

Создание служебного метода для отображения данных

Поскольку вы будете отображать данные изображения и связанные прогнозы несколько раз, создайте метод программы отображения для обработки отображения изображений и результатов прогнозирования.

Метод DisplayResults() выполняет следующие задачи:

  • отображение результатов прогнозирования.

Создайте метод DisplayResults() сразу после структуры InceptionSettings с помощью следующего кода:

C#

private static void DisplayResults(IEnumerable<ImagePrediction> imagePredictionData) {  } 

Метод Transform() заполняется ImagePath в ImagePrediction вместе с прогнозируемыми полями. В ходе процесса ML.NET каждый компонент добавляет столбцы, что упрощает отображение результатов:

C#

foreach (ImagePrediction prediction in imagePredictionData) {     Console.WriteLine($"Image: {Path.GetFileName(prediction.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score.Max()} "); } 

Вы будете вызывать метод DisplayResults() в двух методах классификации изображений.

Создание служебного метода для TSV-файла

Метод ReadFromTsv() выполняет следующие задачи:

  • считывание файла tags.tsv с данными изображения;
  • добавление пути файла к имени файла изображения;
  • загрузка данных файла в объект IEnumerable ImageData.

Создайте метод ReadFromTsv() сразу после метода PairAndDisplayResults(), вставив в него следующий код:

C#

public static IEnumerable<ImageData> ReadFromTsv(string file, string folder) {  } 

Указанный ниже код анализирует файл tags.tsv, после чего добавляет путь к файлу к имени файла изображения для свойства ImagePath и загружает его и Label в объект ImageData. Добавьте его в качестве первой строки метода ReadFromTsv(). Вам понадобится полный путь к файлу для отображения результатов прогнозирования.

C#

return File.ReadAllLines(file)  .Select(line => line.Split('	'))  .Select(line => new ImageData()  {      ImagePath = Path.Combine(folder, line[0])  }); 

В ML.NET есть три основных понятия: данные, преобразователи и средства оценки.

Повторное использование и настройка предварительно обученной модели

В следующей строке кода в методе Main() добавьте приведенный ниже вызов метода ReuseAndTuneInceptionModel():

C#

var model = ReuseAndTuneInceptionModel(mlContext, _trainTagsTsv, _trainImagesFolder, _inceptionPb, _outputImageClassifierZip); 

Метод ReuseAndTuneInceptionModel() выполняет следующие задачи:

  • загрузка данных;
  • извлечение и преобразование данных;
  • оценка модели TensorFlow;
  • настройка (переобучение) модели;
  • отображение результатов модели;
  • оценка итоговой модели;
  • возвращение модели.

Создайте метод ReuseAndTuneInceptionModel() сразу после структуры InceptionSettings и непосредственно перед методом DisplayResults() с помощью следующего кода:

C#

public static ITransformer ReuseAndTuneInceptionModel(MLContext mlContext, string dataLocation, string imagesFolder, string inputModelLocation, string outputModelLocation) {  } 

Загрузка данных

Данные в ML.NET представлены классом IDataView. IDataView позволяет гибко и полно описывать табличные данные (числовые и текстовые). Данные можно загружать в объект IDataView из текстового файла или в режиме реального времени (например, из базы данных SQL или файлов журнала).

Загрузите данные с помощью оболочки MLContext.Data.LoadFromTextFile. Добавьте в следующую строку метода ReuseAndTuneInceptionModel() приведенный ниже код:

C#

var data = mlContext.Data.LoadFromTextFile<ImageData>(path: dataLocation, hasHeader: false); 

Извлечение компонентов и преобразование данных

Предварительная обработка и очистка данных — это очень важные задачи, которые нужно выполнить перед использованием набора данных для машинного обучения. Использование данных напрямую без этих задач моделирования может дать неправильные результаты.

Алгоритмы машинного обучения распознают данные с присвоенными признаками, поэтому при работе с глубокими нейронными сетями вам необходимо преобразовать изображения в подходящий для сети формат. Этот формат — числовой вектор.

После обучения и оценки создайте прогноз с помощью значений столбца Label. Так как вы используете предварительно обученную модель, сопоставьте поля с новой моделью с помощью метода MapValueToKey(). Этот метод преобразует Label в столбец с числовыми ключами (LabelTokey) и добавляет его в виде нового столбца набора данных. Присвойте этому средству оценки estimator имя, так как вы также добавите к нему метод обучения. Добавьте следующую строку кода:

C#

var estimator = mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: LabelTokey, inputColumnName: "Label") 

Ваше средство оценки обработки изображений использует средства присвоения признаков предварительно обученной глубокой нейронной сети (DNN) для выделения признаков. При работе с глубокими нейронными сетями вам необходимо преобразовать изображения в подходящий для сети формат. По этой причине вам нужно использовать несколько преобразований изображений, чтобы вы могли предоставить модели данные изображений в подходящем формате:

  1. Изображения преобразования LoadImages загружаются в память как растровые изображения.
  2. Преобразование ResizeImages изменяет размер изображений, так как предварительно обученная модель имеет определенные значения ширины и высоты изображений.
  3. Преобразование ExtractPixels извлекает пиксели из входных изображений и преобразует их в числовой вектор.

Добавьте эти преобразования изображений в следующие строки кода:

C#

.Append(mlContext.Transforms.LoadImages(outputColumnName: "input", imageFolder: _trainImagesFolder, inputColumnName: nameof(ImageData.ImagePath))) .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input", imageWidth: InceptionSettings.ImageWidth, imageHeight: InceptionSettings.ImageHeight, inputColumnName: "input")) .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: InceptionSettings.ChannelsLast, offsetImage: InceptionSettings.Mean)) 

LoadTensorFlowModel является удобным методом, который позволяет загружать модель TensorFlow один раз, а затем создает TensorFlowEstimator с помощью ScoreTensorFlowModel. Компонент ScoreTensorFlowModel выделяет указанные выходные данные (признаки изображения Inception model``softmax2_pre_activation) и присваивает набору данных оценку с помощью предварительно обученной модели TensorFlow.

Узел softmax2_pre_activation обеспечивает поддержку модели, определяя классы изображений. Узел softmax2_pre_activation возвращает значение вероятности для каждой категории изображения, причем сумма всех таких вероятностей должна равняться 1. Предполагается, что изображение принадлежит только к одной категории, как показано в следующем примере:

КлассВероятность
Food0,001
Toy0,95
Appliance0,06

Добавьте TensorFlowTransform к estimator с помощью такой строки кода:

C#

.Append(mlContext.Model.LoadTensorFlowModel(inputModelLocation).     ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2_pre_activation" }, inputColumnNames: new[] { "input" }, addBatchDimensionInput: true)) 

Выбор алгоритма обучения

Чтобы добавить алгоритм обучения, вызовите метод оболочки mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(). Класс LbfgsMaximumEntropy добавляется в estimator и принимает признаки изображения Inception (softmax2_pre_activation) и входные параметры Label для обучения на основе исторических данных. Добавьте метод обучения с помощью следующего кода:

C#

.Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: LabelTokey, featureColumnName: "softmax2_pre_activation")) 

Вам также нужно сопоставить predictedlabel с predictedlabelvalue:

C#

.Append(mlContext.Transforms.Conversion.MapKeyToValue(PredictedLabelValue, "PredictedLabel")) .AppendCacheCheckpoint(mlContext); 

Метод Fit() обучает модель путем преобразования набора данных и применения обучения. Обучите модель на основе обучающего набора данных и получите обученную модель, добавив в метод ReuseAndTuneInceptionModel() следующие строки кода:

C#

ITransformer model = estimator.Fit(data); 

Метод Transform() делает прогнозы для нескольких входных строк тестового набора данных. Преобразуйте данные Training, добавив в метод ReuseAndTuneInceptionModel() следующий код:

C#

var predictions = model.Transform(data); 

Преобразуйте представления DataViews данных изображений и прогнозов в строго типизированные объекты IEnumerables, чтобы связать их для более удобного отображения. Для этого воспользуйтесь методом MLContext.CreateEnumerable(), добавив следующий код:

C#

var imageData = mlContext.Data.CreateEnumerable<ImageData>(data, false, true); var imagePredictionData = mlContext.Data.CreateEnumerable<ImagePrediction>(predictions, false, true); 

Вызовите метод DisplayResults(), чтобы отобразить данные и прогнозы, добавив в метод ReuseAndTuneInceptionModel() следующую строку кода:

C#

DisplayResults(imagePredictionData); 

Получив прогноз, с помощью метода Evaluate() вы сможете:

  • оценить модель (сравнивает спрогнозированные значения с фактическим набором данных Labels);

  • получить метрики производительности модели.

В качестве следующей строки в методе ReuseAndTuneInceptionModel() добавьте приведенный ниже код:

C#

var multiclassContext = mlContext.MulticlassClassification; var metrics = multiclassContext.Evaluate(predictions, labelColumnName: LabelTokey, predictedLabelColumnName: "PredictedLabel"); 

Для классификации изображений выполняется оценка следующих метрик:

  • Log-loss — см. раздел Логарифмические потери. Значение логарифмических потерь должно быть максимально близко к нулю.

  • Per class Log-loss. Значение логарифмических потерь для каждого класса должно быть максимально близко к нулю.

Используйте следующий код для отображения метрик, передачи результатов и выполнения действий по ним:

C#

Console.WriteLine($"LogLoss is: {metrics.LogLoss}"); Console.WriteLine($"PerClassLogLoss is: {String.Join(" , ", metrics.PerClassLogLoss.Select(c => c.ToString()))}"); 

Добавьте следующий код, чтобы возвращать обученную модель:

C#

return model; 

классифицировать изображения с помощью загруженной модели.

Добавьте такой вызов в метод ClassifyImages() в следующей строке кода в методе Main:

C#

ClassifyImages(mlContext, _predictImageListTsv, _predictImagesFolder, _outputImageClassifierZip, model); 

Метод ClassifyImages() выполняет следующие задачи:

  • считывание TSV-файла в интерфейс IEnumerable;
  • создание прогноза для классификаций изображений на основе проверочных данных.

Создайте метод ClassifyImages() сразу после метода ReuseAndTuneInceptionModel() и непосредственно перед методом PairAndDisplayResults() с помощью следующего кода:

C#

public static void ClassifyImages(MLContext mlContext, string dataLocation, string imagesFolder, string outputModelLocation, ITransformer model) {  } 

Сначала вызовите метод ReadFromTsv() для создания класса IEnumerable<ImageData>, который содержит полный путь для каждого значения ImagePath. Вам потребуется такой путь к файлу для связывания данных и результатов прогнозирования. Вам также нужно преобразовать класс IEnumerable<ImageData> в класс IDataView, который будет использоваться для прогнозирования. Добавьте такой код в следующие две строки в методе ClassifyImages():

C#

var imageData = ReadFromTsv(dataLocation, imagesFolder); var imageDataView = mlContext.Data.LoadFromEnumerable<ImageData>(imageData); 

Как вы это уже сделали с данными изображения для обучения, создайте прогноз категории для проверочных данных изображения с помощью метода Transform() переданной модели. Добавьте следующий код в метод ClassifyImages(), чтобы создавать прогнозы и преобразовывать predictions IDataView в IEnumerable для связывания и отображения:

C#

var predictions = model.Transform(imageDataView); var imagePredictionData = mlContext.Data.CreateEnumerable<ImagePrediction>(predictions, false, true); 

Чтобы связать и отобразить проверочные данные изображения и прогнозы, добавьте такой код для вызова ранее созданного метода DisplayResults() в следующую строку метода ClassifyImages():

C#

DisplayResults(imagePredictionData); 

Классификация отдельного изображения с помощью загруженной модели

Добавьте такой вызов в метод ClassifySingleImage() в следующей строке кода в методе Main:

C#

ClassifySingleImage(mlContext, _predictSingleImage, _outputImageClassifierZip, model); 

Метод ClassifySingleImage() выполняет следующие задачи:

  • загрузка экземпляра ImageData;
  • создание прогноза для классификации изображений на основе проверочных данных.

Создайте метод ClassifySingleImage() сразу после метода ClassifyImages() и непосредственно перед методом PairAndDisplayResults() с помощью следующего кода:

C#

public static void ClassifySingleImage(MLContext mlContext, string imagePath, string outputModelLocation, ITransformer model) {  } 

Сначала создайте класс ImageData, который хранит полный путь и имя файла изображения для одного значения ImagePath. Добавьте такой код в следующие строки в методе ClassifySingleImage():

C#

var imageData = new ImageData() {     ImagePath = imagePath }; 

Класс PredictionEngine — это удобный API, который создает прогноз на основе одного экземпляра данных. Функция Predict() создает прогноз по одному столбцу данных. Передайте значение imageData классу PredictionEngine, чтобы спрогнозировать категорию изображения, добавив следующий код в ClassifySingleImage():

C#

// Make prediction function (input = ImageData, output = ImagePrediction) var predictor = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model); var prediction = predictor.Predict(imageData); 

Отобразите результат прогнозирования с помощью следующей строки кода в методе ClassifySingleImage():

C#

Console.WriteLine($"Image: {Path.GetFileName(imageData.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score.Max()} "); 

Результаты

Выполнив предыдущие шаги, запустите консольное приложение (CTRL+F5). Результаты выполнения должны выглядеть примерно так, как указано ниже. Кроме того, могут выводиться предупреждения или сообщения об обработке, но для удобства здесь мы убрали их.

console

=============== Training classification model =============== Image: broccoli.jpg predicted as: food with score: 0.976743 Image: pizza.jpg predicted as: food with score: 0.9751652 Image: pizza2.jpg predicted as: food with score: 0.9660203 Image: teddy2.jpg predicted as: toy with score: 0.9748783 Image: teddy3.jpg predicted as: toy with score: 0.9829691 Image: teddy4.jpg predicted as: toy with score: 0.9868168 Image: toaster.jpg predicted as: appliance with score: 0.9769174 Image: toaster2.png predicted as: appliance with score: 0.9800823 =============== Classification metrics =============== LogLoss is: 0.0228266745633507 PerClassLogLoss is: 0.0277501705149937 , 0.0186303530571291 , 0.0217359128952187 =============== Making classifications =============== Image: broccoli.png predicted as: food with score: 0.905548 Image: pizza3.jpg predicted as: food with score: 0.9709008 Image: teddy6.jpg predicted as: toy with score: 0.9750155 =============== Making single image classification =============== Image: toaster3.jpg predicted as: appliance with score: 0.9625379  C:Program Filesdotnetdotnet.exe (process 4304) exited with code 0. Press any key to close this window . . . 

Поздравляем! Вы успешно создали модель машинного обучения для классификации изображений на основе предварительно обученной модели TensorFlow в ML.NET.

Исходный код для этого руководства можно найти в репозитории dotnet/samples.

В этом руководстве вы узнали, как:

  • Определение проблемы
  • повторно использовать и настраивать предварительно обученную модель;
  • классифицировать изображения с помощью загруженной модели.

Ознакомьтесь с примерами Машинного обучения в репозитории GitHub, чтобы подробнее изучить расширенный пример классификации изображений.


Источник: msft.it

Комментарии: