Как построить входной тензор массива uint8 для прогнозирования обнаружения объектов в мл движке - PullRequest
0 голосов
/ 17 октября 2018

Я хочу делать онлайн-прогнозы обнаружения объектов (или выведения) из уже существующей модели в движке Google ML.Но я не могу построить запрос JSON.

Модель более быстрая_rcnn_inception_resnet_v2_atrous_coco_2017_11_08 из зоопарка модели TF.Входные данные - это изображения, выходной класс, bb, оценка и т. Д.массив NumPy

encoded_contents = np.array(image.getdata()).reshape(
        (im_height, im_width, 3)).astype(np.uint8)

Изменить размер изображенияя не могу его построить, потому что

TypeError(repr(o) + " is not JSON serializable")
TypeError: array([[[164, 191, 220],
[190, 157, 114],
[190, 157, 114]]], dtype=uint8) is not JSON serializable

Если я преобразую массив numpy в список с помощью метода tolist (), файл json займет 3 мегабайта, а ML-движок отклонит его «message»: «Запросразмер полезной нагрузки превышает ограничение: 1572864 байта. ",

Я отправлю этот json-файл в ml-engine предикат в виде файла json.

gcloud ml-engine predict --model=pellaires --version=pellaires14 --json- 
instances=request.json > response.yaml

1 Ответ

0 голосов
/ 17 октября 2018

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

Я бы порекомендовал либо "Tensors Packed as Byte Strings", либо "Compressed Image Data".

ОБНОВЛЕНИЕ 10/19/2018

Чтобы использовать эти подходы, вам нужно будет изменить график.Если вы можете реэкспортировать модель, это будет проще всего.Вместо:

images = tf.placeholder(dtype=tf.uint8, shape=[None, None, None, 3])

Вы бы использовали:

raw_byte_strings = tf.placeholder(dtype=tf.string, shape=[None])
decode = lambda raw_byte_str: tf.decode_raw(raw_byte_str, tf.uint8)
images = tf.map_fn(decode, raw_byte_strings, dtype=tf.uint8)
...