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

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

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

Обучение модели службы Azure Custom Vision Service распознаванию изображения автомобиля

Первая задача, которую нам нужно было сделать, — это найти способ использовать Azure Cognitive Services для выполнения анализа изображений.

Моей первой мыслью в этой ситуации было использовать Microsoft Computer Vision API для возврата информации об изображении. Это, вероятно, было бы правильным решением, однако API вернул бы много информации, которая не нужна для цели нашего взлома. Пример ответа API ниже (взято из документации Microsoft здесь) показывает, что API предоставит нам любые категории и теги, которые, по его мнению, присутствуют в изображении, а также различные метаданные.

{ 
  "categories": [ 
    { 
      "name": "abstract_", 
      "score": 0.00390625 
    }, 
    { 
      "name": "others_", 
      "score": 0.0234375 
    }, 
    { 
      "name": "outdoor_", 
      "score": 0.00390625 
    } 
  ], 
  "description": { 
    "tags": [ 
      "road", 
      "building", 
      "outdoor", 
      "street", 
      "night",
      "black", 
      "city", 
      "white", 
      "light", 
      "sitting", 
      "riding", 
      "man", 
      "side", 
      "empty", 
      "rain", 
      "corner", 
      "traffic", 
      "lit", 
      "hydrant", 
      "stop", 
      "board", 
      "parked", 
      "bus", 
      "tall" 
    ], 
    "captions": [ 
      { 
        "text": "a close up of an empty city street at night", 
        "confidence": 0.7965622853462756 
      } 
    ] 
  }, 
  "requestId": "dddf1ac9-7e66-4c47-bdef-222f3fe5aa23", 
  "metadata": { 
    "width": 3733, 
    "height": 1986, 
    "format": "Jpeg" 
  }, 
  "color": { 
    "dominantColorForeground": "Black", 
    "dominantColorBackground": "Black", 
    "dominantColors": [ 
      "Black", 
      "Grey" 
    ], 
    "accentColor": "666666", 
    "isBWImg": true 
  } 
} 

Другой вариант состоял в том, чтобы попробовать использовать службу Azure Custom Vision Service, которая в настоящее время все еще находится в предварительной версии. Custom Vision Service позволит нам настроить нашу собственную модель компьютерного зрения, которая будет возвращать только ту информацию, которая нам нужна.

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

Начать работу с Custom Vision было довольно просто. Сначала меня перенаправили на веб-сайт, где я вошел в систему с учетными данными своей учетной записи Microsoft (тот же самый, что и с моей подпиской Azure).

После входа в систему появляется простой интерфейс для создания нового проекта. При нажатии Новый проект открывается диалоговое окно, в котором вы можете ввести информацию о своем проекте.

Оттуда было просто загрузить изображения для обучения классификатора (дополнительная документация здесь). Сначала я начал создавать различные теги, идентифицирующие разные транспортные средства, такие как автомобиль, автомобили (для изображений с несколькими автомобилями), автобус и грузовик. В целях взлома я изменил его позже, чтобы было только два тега: car и notCar. Тег car будет содержать изображения только отдельных автомобилей, а тег notCar — всего остального.

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

Это была небольшая проблема, так как мы планировали запрограммировать нашу функцию Azure таким образом, чтобы сравнивать процентную оценку, которая будет возвращена, и если автомобильнеавтомобиль, то наша функция будет установить результат isCar как истинный. Однако из-за этого были некоторые случаи, когда оценка notCar на самом деле оказывалась выше, чем car, даже если они оба были довольно низкими из-за того, что модель не была обучена, а уверены, что пометить конкретное изображение.

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

Я тренировал модель до тех пор, пока она не превышала 60% — порог, о котором мы договорились ранее. Как видно ниже, ответ JSON от службы Custom Vision Service намного лаконичнее. Мы могли точно указать, какая классификация нам нужна, чтобы мы могли видеть только, машина это или нет, и нам не приходилось фильтровать множество других тегов, которые не имели к нам отношения.

"Predictions":[ 
  { 
    "TagId":"c0bf9dcf-09ed-448f-b956-71c4fe2c6f5e", 
    "Tag":"notCar", 
    "Probability":1.8441413E-05 
  }, 
  { 
    "TagId":"70666965-666f-4da0-b8e5-e0e1fd8856de", 
    "Tag":"car", 
    "Probability":1.105892E-06 
  } 
]

После этого я получил URL-адрес прогноза, ключ и другую информацию, нажав кнопку URL-адрес прогноза в верхней части экрана. Нам это понадобится для следующей части хака — создания функции Azure для вызова службы Custom Vision.

Часть 2: Использование функций Azure для вызова службы Azure Custom Vision Service и подключения к CosmosDB

Первоначально опубликовано на thisisjanelles.github.io 22 марта 2018 г.