Работа с многомерным массивом в качестве вывода модели CoreML - PullRequest
0 голосов
/ 20 января 2019

Я обучил обнаружению объектов модели CoreML с использованием службы customvision.ai от Microsoft. Я экспортировал его, чтобы использовать в своем приложении для распознавания определенных объектов в режиме реального времени с помощью камеры. Однако модель CoreML выводит MultiArray типа double. Я понятия не имею, как расшифровать или использовать эти данные, так как я впервые работаю с многомерными массивами. Я пытался выяснить, что должна выводить пользовательская модель обнаружения объекта видения (например, CGRect или UIImage), поэтому я знаю, во что я пытаюсь конвертировать мой MultiArray, но не могу найти эту информацию где-либо на веб-сайте Microsoft. Похоже, что у Microsoft есть демонстрационное приложение для моделей классификации изображений, но ничего для моделей обнаружения объектов.

Чтобы понять, что может быть в многомерном массиве, я попытался распечатать его и получить этот результат ...

Double 1 x 1 x 40 x 13 x 13 array

Я также попытался напечатать элемент .strides многомерного массива и получил это ...

[6760, 6760, 169, 13, 1]

Я не знаю, является ли эта информация действительно полезной, просто хотел дать вам, ребята, все, что я сделал до сих пор.

Итак, мой вопрос в том, какую информацию хранит этот MultiArray (это что-то вроде UIImage или CGRect? Или что-то другое?) И как я могу преобразовать этот многомерный массив в полезный набор данных, которые я действительно могу использовать?

1 Ответ

0 голосов
/ 20 января 2019

Я не использовал службу customvision.ai, но раньше работал с моделями обнаружения объектов. Массив 13x13, скорее всего, представляет собой сетку, которая покрывает входное изображение. Для каждой ячейки в этом массиве - обычно соответствующей блоку 32x32 пикселей в исходном изображении - существует прогноз из 40 чисел.

Это немного зависит от того, какая модель customvision.ai использует то, что означают эти 40 чисел. Но, как правило, они содержат координаты одного или нескольких ограничивающих прямоугольников, а также вероятности классов.

В случае, если модель YOLO (что представляется вероятным, поскольку она также имеет выходную сетку 13x13), существует несколько прогнозов на ячейку. Каждое предсказание имеет 4 числа для описания ограничивающего прямоугольника, 1 число для описания вероятности того, что этот ограничивающий прямоугольник содержит объект, и num_classes чисел с вероятностями для различных классов.

Таким образом, в ячейке сетки есть (5 + num_classes) x num_predictions чисел. Если модель делает 5 прогнозов на ячейку сетки, и вы тренировались в 3 классах, вы получаете (5 + 3)*5 = 40 чисел на ячейку сетки.

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

Эти 40 чисел могут иметь или не иметь действительные координаты ограничивающего прямоугольника. Возможно, вам придется написать дополнительный код для «декодирования» этих номеров. Опять же, логика для этого зависит от типа модели.

Я предполагаю, что customvision.ai имеет некоторую документацию или пример кода о том, как это сделать.

Вы также можете прочитать больше об этой теме в нескольких моих сообщениях в блоге:

...