Несколько дней назад меня попросили создать руководство по классификации изображений с использованием подхода кода, а также подхода с использованием Azure Cognitive Services, чтобы определить достоинства и недостатки каждого из них.

В этом уроке мы собираемся использовать сценарий «Собаки и кошки», который очень популярен в мире машинного обучения.

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

После прохождения этого урока вы будете знать:

  1. Где найти набор фотографий собак и кошек
  2. Загрузите и подготовьте фото собак и кошек
  3. Как разработать модель классификации фотографий с помощью Transfer Learning (предварительно обученные модели)
  4. Как разработать модель классификации фотографий с помощью службы Azure CustomVision.ai

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

Мы будем использовать записные книжки Jupyter для разработки кода, а также нам понадобится графический процессор, чтобы иметь возможность обучать модель. Некоторые бесплатные варианты доступны для создания ноутбука на базе графического процессора. Для этого урока я решил использовать Google Colab, отличный бесплатный вариант для графического процессора. Ноутбуки Azure, которые также являются отличной альтернативой, не имеют графического процессора на уровне бесплатного пользования, поэтому это не подходящая альтернатива для этого руководства.

Каждая записная книжка должна начинаться со следующих строк, чтобы гарантировать, что любые изменения в библиотеках, которые вы вносите, перезагружаются здесь автоматически, а также чтобы все отображаемые диаграммы или изображения отображались в записной книжке. Нам также необходимо смонтировать диск в Google Drive для хранения DataSet.

# Put these at the top of every notebook, to get automatic reloading # and inline plotting
%reload_ext autoreload
%autoreload 2
%matplotlib inline
from google.colab import drive
drive.mount(‘/content/drive’)

1. Где найти набор данных с фотографиями собак и кошек

Microsoft Research в партнерстве с Petfinder.com создали несколько лет назад отличный набор данных о собаках и кошках, готовый к использованию с уже засекреченными фотографиями. Они предоставили более трех миллионов изображений кошек и собак, вручную классифицированных людьми в тысячах приютов для животных по всей территории Соединенных Штатов. Https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=rss_alldownloads_devresources

Полный набор данных можно загрузить по следующему URL-адресу:

Http://files.fast.ai/files/dogscats.zip

Итак, давайте приступим к загрузке набора данных с помощью команды wget, которая загрузит ZIP-файл, содержащий все изображения собак и кошек. Это будет загрузка около 850 МБ, так что это займет некоторое время.

!wget -c http://files.fast.ai/files/dogscats.zip

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

!unzip dogscats.zip
!ls -la

Давайте нарисуем несколько изображений кошек из учебной папки:

# plot cat photos from the dogs vs cats dataset
from matplotlib import pyplot
from matplotlib.image import imread
# define location of dataset
folder = ‘dogscats/train/cats/’
# plot first few images
for i in range(30,37,1):
 # define subplot
 pyplot.subplot(330 + 1 + i)
 # define filename
 filename = folder + ‘cat.’ + str(i) + ‘.jpg’
 # load image pixels
 image = imread(filename)
 # plot raw pixel data
 pyplot.imshow(image)
# show the figure
pyplot.show()

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

# plot dog photos from the dogs vs cats dataset
from matplotlib import pyplot
from matplotlib.image import imread
# define location of dataset
folder = ‘dogscats/train/dogs/’
# plot first few images
for i in range(100,108,1):
 # define subplot
 pyplot.subplot(330 + 1 + i)
 # define filename
 filename = folder + ‘dog.’ + str(i) + ‘.jpg’
 # load image pixels
 image = imread(filename)
 # plot raw pixel data
 pyplot.imshow(image)
# show the figure
pyplot.show()

3. Как разработать модель для классификации фотографий с помощью трансферного обучения (предварительно обученные модели)

Для обучения моделей глубокой сверточной нейронной сети могут потребоваться дни или даже недели на очень больших наборах данных (как набор данных DogCats, который мы здесь используем).

Один из способов сократить этот процесс - повторно использовать веса модели из предварительно обученных моделей, которые были разработаны для стандартных наборов данных тестов компьютерного зрения, таких как задачи распознавания изображений ImageNet. Это называется трансферным обучением. Трансферное обучение - это исследовательская проблема в машинном обучении, которая фокусируется на хранении знаний, полученных при решении одной проблемы, и применении их к другой, но связанной проблеме. Самые эффективные модели можно загрузить и использовать напрямую или интегрировать в новую модель для решения ваших собственных проблем с компьютерным зрением.

В этой задаче классификации «Собаки против кошек» будет использоваться предварительно обученная модель, доступная в замечательной библиотеке FAST.AI. Предварительно обученная модель - это модель, которую кто-то обучил на аналогичных типах данных. Поэтому вместо обучения модели с нуля будет использоваться модель, обученная в ImageNet. ImageNet - это набор данных, состоящий из 1,2 миллиона изображений и 1000 классов. Эта предварительно обученная модель будет основой решения. Мы будем использовать предварительно обученную модель RESNET50. ResNet - это сверточная нейронная сеть, которую команда Microsoft использовала, чтобы выиграть соревнование ILSRVC 2015 и превзойти человеческую производительность в наборе данных ImageNet. ResNet50 - одна из версий, представленных в этих экспериментах, и она оказалась отличной моделью для классификации изображений. В основном то, что мы собираемся

Для получения дополнительной информации вы можете прочитать их статью в https://arxiv.org/abs/1512.03385 Deep Residual Learning for Image Recognition.

Устанавливаем путь к папке Training и указываем два важных параметра: размер пакета и размер изображения. Чем больше размер пакета, тем быстрее мы обучим нашу модель, но требуется больше памяти. Размер изображения определяет размер / сжатие, необходимое для всех изображений.

from fastai.vision import *
from fastai.metrics import error_rate
PATH=”dogscats/train”
bs = 64 #batch size: if your GPU is running out of memory, set a smaller batch size, i.e 16
sz = 224 #image size
data = ImageDataBunch.from_folder(PATH, ds_tfms=get_transforms(), size=sz, bs=bs, valid_pct=0.2).normalize(imagenet_stats)
print (“There are”, len(data.train_ds), “training images and”, len(data.valid_ds), “validation images.” )

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

data.show_batch(rows=3, figsize=(7,8)) #show 3 lines of images, totaling 9 random images from the training set

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

learn = cnn_learner(data, models.resnet50, metrics=accuracy) #create a Convolutional Neural Network based on the RestNet50 model. Do Transfer Learning with the Dogs and Cats images.
learn.fit_one_cycle(4) # execute 4 epochs, that is basicallly 4 complete iterations with all the Data.

Точность более 98%.

Анализ результатов

Давайте посмотрим на производительность этой модели, показав матрицу неточностей. Эта матрица представляет собой особый макет таблицы, который позволяет визуализировать работу алгоритма. Каждая строка матрицы представляет экземпляры в прогнозируемом классе, а каждый столбец представляет экземпляры в фактическом классе (или наоборот):

interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix(figsize=(12,12), dpi=60)

Как видите, у нас есть отличная модель для идентификации собак и кошек !!. Точность более 98%.

Матрица неточностей показывает, что некоторые изображения в проверочном наборе неправильно классифицированы. Давайте посмотрим, что некоторые из этих изображений неправильно классифицированы:

interp.plot_top_losses(9, figsize=(15,11), heatmap=False)

Какие-то странные образы !! По этой причине модель не может правильно классифицировать собак и кошек.

Если мы хотим предсказать метку или предсказание совершенно нового изображения, мы можем сделать это, указав путь к новому изображению:

imagepath = ‘/content/dogscats/test1/100.jpg’ #The path to your test image
img = open_image(imagepath) #load the image
pred_class,pred_idx,outputs = learn.predict(img) #predict the label for the specified image
img.show()
print (“It is a”, pred_class)

4. Как разработать модель классификации фотографий с помощью службы Azure CustomVision.ai.

Azure Custom Vision - это когнитивная служба, которая позволяет создавать, развертывать и улучшать собственные классификаторы изображений. Классификатор изображений - это служба ИИ, которая применяет метки (которые представляют классы) к изображениям в соответствии с их визуальными характеристиками. В этом сервисе мы загружаем изображения в сервис, указываем метку изображений, и сервисы создают модель машинного обучения (на основе трансферного обучения) для классификации новых изображений на основе характеристик изображения и устанавливают метку и вероятность. к каждому изображению на основе меток, используемых в процессе загрузки.

Чтобы воспользоваться услугой, нам необходимо зарегистрировать учетную запись Azure, а также зарегистрироваться на сайте: http://www.customvision.ai

Получив учетную запись Azure и получив доступ к порталу CustomVision.ai, запустите упражнение, создав НОВЫЙ ПРОЕКТ:

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

Затем перейдите к загрузке большого набора изображений собак и добавьте метку DOG после загрузки. Затем загрузите изображения кошек и добавьте метку CAT после загрузки. Используйте набор данных dogscats, загруженный в первой части этого упражнения:

Следующим шагом после загрузки и маркировки изображений является ОБУЧЕНИЕ модели. Нажмите зеленую кнопку «Поезд»:

вот и все. У нас есть обученная и готовая к использованию модель классификации «Собака против кошки».

Посмотрим, насколько хороша наша модель:

Довольно неплохая производительность, близкая к 100%.

Чтобы использовать модель в наших собственных приложениях, мы должны использовать некоторые ключи и значения, найденные на URL-адресе прогнозирования и на странице настроек.

На странице URL-адреса прогноза запишите ключ прогноза для файла изображения:

И на странице настроек запишите конечную точку и идентификатор ресурса:

После этого мы готовы использовать наш режим. Мы должны импортировать CustomVision SDK и указать конечную точку, ключ прогноза и идентификатор ресурса.

!pip install azure-cognitiveservices-vision-customvision
from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient
from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateEntry
ENDPOINT = “https://eastus.api.cognitive.microsoft.com/"
# Replace with a valid key
prediction_key = “YOUR KEY HERE”
prediction_resource_id = “YOUR RESOURCE ID HERE”

А затем мы можем вызвать модель CustomVision.ai, создав предиктор и установив файл изображения, который мы хотим проанализировать:

from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
# Now there is a trained endpoint that can be used to make a prediction
predictor = CustomVisionPredictionClient(prediction_key, endpoint=ENDPOINT)
with open(“/content/dogscats/valid/cats/cat.502.jpg”, “rb”) as image_contents: #this is the Path to the image we want to predict the label for.
 results = predictor.classify_image(“ee4d3fbc-8c69–4f7f-b587–034dad5cf4eb”, “Iteration1”, image_contents.read())
# Display the results.
 for prediction in results.predictions:
 print(“\t” + prediction.tag_name +
 “: {0:.2f}%”.format(prediction.probability * 100))
img = open_image(“/content/dogscats/valid/cats/cat.1013.jpg”) #load the image and present it.
img.show()

Как видите, модель предсказала, что это изображение кошки. ПРАВИЛЬНО !!!, со 100% вероятностью.

Давайте попробуем с изображением собаки:

with open("/content/dogscats/valid/dogs/dog.10020.jpg", "rb") as image_contents: #this is the Path to the image we want to predict the label for.
    results = predictor.classify_image("ee4d3fbc-8c69-4f7f-b587-034dad5cf4eb", "Iteration1", image_contents.read())# here put the name of you Iteration in CustomVision.ai service and the Project ID
# Display the results.
    for prediction in results.predictions:
        print("\t" + prediction.tag_name +
              ": {0:.2f}%".format(prediction.probability * 100))
img = open_image("/content/dogscats/valid/dogs/dog.10020.jpg") #load the image and present it.
img.show()

Правильно классифицировано !!!

Модель CustomVision.ai довольно проста в использовании с помощью всего нескольких строк кода. Производительность действительно хороша со стандартными параметрами на портале обслуживания.

Надеюсь, в этом руководстве объясняется, как выполнить базовую классификацию изображений. Спасибо.

Вы можете загрузить и использовать Блокнот, посетив мой профиль GITHUB:

Https://github.com/masdc/MediumArticles/blob/master/Image%20classification%20using%20two%20approches.ipynb