Хорошо, я признаю, что название немного клише, но следуя предыдущему блогу о распознавании изображений с помощью 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. Пожалуйста, не стесняйтесь проверить их!