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

Предпосылка

Пожалуйста, обратитесь к предыдущему блогу для установки OCaml, Owl и т. д. Если вы еще не пробовали Owl, я рекомендую использовать Docker-образ Owl. В качестве предварительного условия убедитесь, что инструмент ImageMagick установлен:

sudo apt-get install imagemagick

Кроме того, подготовьте одно изображение на своем компьютере. Это может быть любой распространенный формат изображения (jpg, png, gif и т. д.) и размер. Если вы не уверены, какое изображение использовать, вот один из вариантов (изображение панды из предыдущего блога):

wget -O panda.png https://goo.gl/dnyjh7

API

infer: служба, которая выполняет задачи распознавания изображений по клиентским изображениям. Он принимает строку, указывающую расположение локального образа. Его возвращаемое значение представляет собой массив размером 1x1000 N, каждый элемент которого представляет собой число с плавающей запятой от 0 до 1, указывающее на возможность принадлежности изображения к одному из 1000 классов от ImageNet.

to_json: преобразование предполагаемого результата в необработанную строку JSON.

Параметр:

  • top: значение int, указывающее первые N наиболее вероятных меток для возврата. Значение по умолчанию — 5.

to_tuples: преобразование полученного результата в массив кортежей, каждый кортеж содержит имя метки («класс», строка) и вероятность («реквизит», число с плавающей запятой, от 0 до 1) целевого изображения. в этом классе.

Параметр:

  • top: значение int, указывающее первые N наиболее вероятных меток для возврата. Значение по умолчанию — 5.

Пример

Вот простой пример использования этого API:

Код прост: 1) разверните службу InceptionV3 на своем компьютере с помощью Zoo, 2) выберите изображение на своем компьютере и 3) распознавание изображений.

Чтобы удовлетворить различные требования пользователей, сервис поддерживает 3 вида возвращаемых значений. По умолчанию возвращаемое значение — это Ndarray 1x1000 в Owl:

val labels : Owl_algodiff.S.arr =
  
            C0          C1               C998        C999 
R0 2.72124E-05 2.91834E-05  ...   3.38798E-05  5.04353E-05

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

[
  {
    "class": "giant panda,
     panda,
     panda bear,
     coon bear,
     Ailuropoda melanoleuca",
    "prop":  0.961965441704
  },
  {
    "class": "lesser panda,
     red panda,
     panda,
     bear cat,
     cat bear,
     Ailurus fulgens",
    "prop":  0.00117377145216
  },
  {
    "class": "space shuttle",
    "prop":  0.000592212367337
  },
  {
    "class": "soccer ball",
    "prop":  0.000403530168114
  },
  {
    "class": "indri,
     indris,
     Indri indri,
     Indri brevicaudatus",
    "prop":  0.000263019668637
  } 
]

Вы также можете получить массив кортежей, используя to_tuples :

val labels : (string * float) array =
[|
  ("giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", 0.961965441703796387);
  ("lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", 0.0011737714521586895);
  ("space shuttle", 0.000592212367337197065);
  ("soccer ball", 0.000403530168114230037);
  ("indri, indris, Indri indri, Indri brevicaudatus", 0.000263019668636843562)
|]

Сравните с Google API

С помощью этого API пользователь может писать код, очень похожий на код, использующий Google Vision API:

import io
import os

# Imports the Google Cloud client library
from google.cloud import vision
from google.cloud.vision import types

# Instantiates a client
client = vision.ImageAnnotatorClient()

# The name of the image file to annotate
file_name = os.path.join(
    os.path.dirname(__file__),
    'resources/panda.jpg')

# Loads the image into memory
with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = types.Image(content=content)

# Performs label detection on the image file
response = client.label_detection(image=image)
labels = response.label_annotations

print('Labels:')
for label in labels:
    print(label.description)

Конечно, еще многое предстоит сделать для улучшения текущего API, например, поддержки дополнительных функций и RESTful-запросов/ответов (которые скоро будут представлены в следующих сообщениях). Текущий сервис также использует ImageMagick для преобразования предоставленного изображения в формат ppm, который будет храниться в том же каталоге, что и исходное изображение — в некоторых случаях это может быть не идеальным решением. Но я надеюсь, что этот пример уже показал некоторые из принципов дизайна, которые мы учитываем: выразительность и удобство использования для пользователей.

Код сервиса InceptionV3 находится на Gist. А здесь — веб-демонстрация этого сервиса классификации изображений на платформе Owl. Пожалуйста, не стесняйтесь проверить их!