Обнаружение меток, лиц и ориентиров на изображениях с помощью Cloud Vision API

Cloud Vision API позволяет понять содержимое изображения, инкапсулируя мощные модели машинного обучения в простой REST API.

В этой лабораторной работе мы отправим изображения в Vision API и увидим, как он обнаруживает объекты, лица и ориентиры.

Что вы узнаете

  • Создание запроса Vision API и вызов API с помощью curl
  • Использование методов обнаружения меток, паутины, лиц и ориентиров API видения

Что вам понадобится

  • Проект облачной платформы Google
  • Браузер, такой как Chrome или Firefox

Как вы будете использовать этот учебник?

Прочитайте только это Прочтите его и выполните упражнения

Как бы вы оценили свой опыт работы с Google Cloud Platform?

Новичок Средний Опытный

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID .

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

Прохождение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их работающими (см. раздел «Очистка» в конце этого документа).

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Нажмите на значок меню в левом верхнем углу экрана.

Выберите API и сервисы из раскрывающегося списка и нажмите «Панель инструментов».

Нажмите «Включить API и службы ».

Затем найдите «видение» в поле поиска. Нажмите на Google Cloud Vision API :

Нажмите « Включить », чтобы включить Cloud Vision API:

Подождите несколько секунд, пока он не включится. Вы увидите это, как только он будет включен:

Google Cloud Shell — это среда командной строки, работающая в облаке . Эта виртуальная машина на основе Debian загружена всеми необходимыми инструментами разработки ( gcloud , bq , git и другими) и предлагает постоянный домашний каталог размером 5 ГБ. Мы будем использовать Cloud Shell для создания запроса к Speech API.

Чтобы начать работу с Cloud Shell, нажмите «Активировать Google Cloud Shell». Снимок экрана 08.06.2015, 17:30:32.png значок в правом верхнем углу панели заголовка

Сеанс Cloud Shell открывается внутри нового фрейма в нижней части консоли и отображает приглашение командной строки. Подождите, пока не появится приглашение user@project:~$

Поскольку мы будем использовать curl для отправки запроса к Vision API, нам нужно сгенерировать ключ API для передачи в URL-адрес нашего запроса. Чтобы создать ключ API, перейдите в раздел «Учетные данные» API и сервисов в вашей облачной консоли:

В выпадающем меню выберите ключ API :

Затем скопируйте только что сгенерированный ключ.

Теперь, когда у вас есть ключ API, сохраните его в переменной среды, чтобы не вставлять значение вашего ключа API в каждый запрос. Это можно сделать в Cloud Shell. Обязательно замените <your_api_key> только что скопированным ключом.

export API_KEY=<YOUR_API_KEY>

Создание сегмента облачного хранилища

Есть два способа отправить изображение в Vision API для обнаружения изображения: отправив в API строку изображения в кодировке base64 или передав ему URL-адрес файла, хранящегося в Google Cloud Storage. Мы будем использовать URL-адрес облачного хранилища. Мы создадим корзину Google Cloud Storage для хранения наших изображений.

Перейдите к браузеру хранилища в облачной консоли для вашего проекта:

Затем нажмите Создать корзину . Дайте корзине уникальное имя (например, идентификатор проекта) и нажмите « Создать ».

Загрузите изображение в корзину

Щелкните правой кнопкой мыши следующее изображение пончиков, затем нажмите « Сохранить изображение как » и сохраните его в папке «Загрузки» как donuts.png .

Перейдите к только что созданному сегменту в обозревателе хранилища и щелкните Загрузить файлы . Затем выберите пончики.png .

Вы должны увидеть файл в своем ведре:

Затем отредактируйте разрешение изображения.

Щелкните Добавить элемент .

Добавьте новый Entity of Group и Name of allUsers :

Нажмите Сохранить .

Теперь, когда у вас есть файл в корзине, вы готовы создать запрос Vision API, передав ему URL-адрес этого изображения пончиков.

В среде Cloud Shell создайте файл request.json с приведенным ниже кодом, заменив my-bucket-name на имя созданного вами сегмента Cloud Storage. Вы можете создать файл с помощью одного из предпочитаемых вами редакторов командной строки (nano, vim, emacs) или использовать встроенный редактор Orion в Cloud Shell:

запрос.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "LABEL_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

Первая функция Cloud Vision API, которую мы рассмотрим, — обнаружение меток. Этот метод вернет список меток (слов) того, что находится на вашем изображении.

Теперь мы готовы вызывать Vision API с помощью curl:

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

Ваш ответ должен выглядеть примерно так:

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01dk8s",
          "description": "powdered sugar",
          "score": 0.9436922
        },
        {
          "mid": "/m/01wydv",
          "description": "beignet",
          "score": 0.7160288
        },
        {
          "mid": "/m/06_dn",
          "description": "snow",
          "score": 0.71219236
        },
        {
          "mid": "/m/02wvn_6",
          "mid": "/m/0bp3f6m",
          "description": "fried food",
          "score": 0.7075312
        },
        {
          "mid": "/m/02wvn_6",
          "description": "ricciarelli",
          "score": 0.5625
        },
        {
          "mid": "/m/052lwg6",
          "description": "baked goods",
          "score": 0.53270763
        }
      ]
    }
  ]
}

API смог определить конкретный тип пончиков (beignets), круто! Для каждой метки, найденной Vision API, он возвращает description с названием элемента. Он также возвращает score — число от 0 до 100, указывающее, насколько точно описание соответствует изображению. Среднее значение сопоставляется со mid значением элемента в сети знаний Google. Вы можете использовать mid при вызове API сети знаний, чтобы получить дополнительную информацию об элементе.

Помимо получения меток к тому, что находится на нашем изображении, Vision API также может искать в Интернете дополнительные сведения о нашем изображении. Через метод API webDetection мы получаем много интересных данных:

  • Список объектов, найденных на нашем изображении, на основе содержимого страниц с похожими изображениями.
  • URL-адреса изображений с полным и частичным совпадением, найденных в Интернете, а также URL-адреса этих страниц.
  • URL-адреса похожих изображений, например, при обратном поиске изображений.

Чтобы попробовать веб-обнаружение, мы будем использовать то же изображение бенье, что и выше, поэтому все, что нам нужно изменить, — это одну строку в нашем файле request.json (вы также можете отправиться в неизвестность и использовать совершенно другое изображение). В списке функций просто измените тип с LABEL_DETECTION на WEB_DETECTION . Теперь request.json должен выглядеть так:

запрос.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "WEB_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

Чтобы отправить его в Vision API, вы можете использовать ту же команду curl, что и раньше (просто нажмите стрелку вверх в Cloud Shell):

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

Давайте углубимся в ответ, начиная с webEntities . Вот некоторые объекты, возвращенные этим изображением:

 "webEntities": [
          {
            "entityId": "/m/01hyh_",
            "score": 0.7155,
            "description": "Machine learning"
          },
          {
            "entityId": "/m/01wydv",
            "score": 0.48758492,
            "description": "Beignet"
          },
          {
            "entityId": "/m/0105pbj4",
            "score": 0.3976,
            "description": "Google Cloud Platform"
          },
          {
            "entityId": "/m/02y_9m3",
            "score": 0.3782,
            "description": "Cloud computing"
          },
          ...
        ]

Это изображение повторно использовалось во многих презентациях наших API-интерфейсов Cloud ML, поэтому API обнаружил сущности «Машинное обучение», «Облачная платформа Google» и «Облачные вычисления».

Если мы проверим URL-адреса в fullMatchingImages , partialMatchingImages и pagesWithMatchingImages , мы заметим, что многие URL-адреса указывают на этот сайт лаборатории кода (супермета!).

Допустим, мы хотим найти другие изображения бенье, но не точно такие же изображения. Вот тут-то и пригодится часть ответа API, visuallySimilarImages . Вот несколько визуально похожих изображений, которые он нашел:

"visuallySimilarImages": [
          {
            "url": "https://igx.4sqi.net/img/general/558x200/21646809_fe8K-bZGnLLqWQeWruymGEhDGfyl-6HSouI2BFPGh8o.jpg"
          },
          {
            "url": "https://spoilednyc.com//2016/02/16/beignetszzzzzz-852.jpg"
          },
          {
            "url": "https://img-global.cpcdn.com/001_recipes/a66a9a6fc2696648/1200x630cq70/photo.jpg"
          },
          ...
]

Мы можем перейти к этим URL-адресам, чтобы увидеть похожие изображения:

Прохладный! А теперь вы, наверное, очень хотите бенье (извините). Это похоже на поиск по изображению в Google Images :

Но с Cloud Vision мы можем получить доступ к этой функции с помощью простого в использовании REST API и интегрировать ее в наши приложения.

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

Загрузить новое изображение

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

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

Обновление нашего запроса

Далее мы обновим наш файл request.json , чтобы включить URL-адрес нового изображения и использовать обнаружение лиц и ориентиров вместо обнаружения меток. Обязательно замените my-bucket-name именем нашей корзины Cloud Storage:

запрос.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/selfie.png"
          } 
        },
        "features": [
          {
            "type": "FACE_DETECTION"
          },
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

Вызов Vision API и анализ ответа

Теперь вы готовы вызывать Vision API с помощью той же команды curl, что и выше:

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

Давайте сначала посмотрим на объект faceAnnotations в нашем ответе. Вы заметите, что API возвращает объект для каждого лица, найденного на изображении, — в данном случае для трех. Вот сокращенная версия нашего ответа:

{
      "faceAnnotations": [
        {
          "boundingPoly": {
            "vertices": [
              {
                "x": 669,
                "y": 324
              },
              ...
            ]
          },
          "fdBoundingPoly": {
            ...
          },
          "landmarks": [
            {
              "type": "LEFT_EYE",
              "position": {
                "x": 692.05646,
                "y": 372.95868,
                "z": -0.00025268539
              }
            },
            ...
          ],
          "rollAngle": 0.21619819,
          "panAngle": -23.027969,
          "tiltAngle": -1.5531756,
          "detectionConfidence": 0.72354823,
          "landmarkingConfidence": 0.20047489,
          "joyLikelihood": "POSSIBLE",
          "sorrowLikelihood": "VERY_UNLIKELY",
          "angerLikelihood": "VERY_UNLIKELY",
          "surpriseLikelihood": "VERY_UNLIKELY",
          "underExposedLikelihood": "VERY_UNLIKELY",
          "blurredLikelihood": "VERY_UNLIKELY",
          "headwearLikelihood": "VERY_LIKELY"
        }
        ...
     }
}

boundingPoly дает нам координаты x,y вокруг лица на изображении. fdBoundingPoly — это поле меньшего размера, чем boundingPoly , кодирующее часть кожи лица. landmarks — это массив объектов для каждой черты лица (о некоторых вы, возможно, даже не знали!). Это говорит нам о типе ориентира, а также о трехмерном положении этого объекта (координаты x, y, z), где координата z — это глубина. Остальные значения дают нам больше деталей на лице, включая вероятность радости, печали, гнева и удивления. Вышеупомянутый объект предназначен для человека, который находится дальше всего на изображении — вы можете видеть, что он корчит глупое лицо, что объясняет joyLikelihood POSSIBLE .

Далее давайте landmarkAnnotations на часть нашего ответа, посвященную аннотациям:

"landmarkAnnotations": [
        {
          "mid": "/m/0c7zy",
          "description": "Petra",
          "score": 0.5403372,
          "boundingPoly": {
            "vertices": [
              {
                "x": 153,
                "y": 64
              },
              ...
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 30.323975,
                "longitude": 35.449361
              }
            }
          ]

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

Мы получаем mid ориентира, его имя ( description ) вместе с score достоверности. boundingPoly показывает область на изображении, где был идентифицирован ориентир. Ключ locations сообщает нам координаты широты и долготы этого ориентира .

Мы рассмотрели методы обнаружения меток, лиц и ориентиров в Vision API, но есть три других, которые мы не исследовали. Погрузитесь в документы , чтобы узнать о трех других:

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

Вы узнали, как анализировать изображения с помощью Vision API. В этом примере вы передали API URL вашего изображения в облачном хранилище Google. В качестве альтернативы вы можете передать строку вашего изображения в кодировке base64.

Что мы рассмотрели

  • Вызов Vision API с помощью curl путем передачи ему URL-адреса изображения в сегменте Cloud Storage.
  • Использование методов обнаружения меток, веб-сайтов, лиц и ориентиров Vision API.

Следующие шаги