Логический массив Numpy в Tensorflow - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь сделать вывод о массиве изображений в тензорном потоке для задачи классификации, поэтому результаты будут представлены в виде массива со значениями от 0 до 1. В настоящее время у меня есть веб-интерфейс, из которого изображения в формате Base64После этого сервер обрезает небольшую область изображения, сохраняет ее на диск, а затем снова загружает изображение в тензорный поток, чтобы сделать вывод.Тем не менее, я хотел бы уменьшить число операций ввода-вывода на диск и, следовательно, преобразовать массив пустых изображений непосредственно в тензор, а затем выполнить вывод, не сохраняя сначала на диск.В этот момент я могу преобразовать массив NumPy в тензор и успешно вывести его, однако результаты достоверности несколько отличаются от того, что я получу, когда изображение будет сохранено на диск.

Загрузка файла иВывод, (который работает, как и ожидалось):

def predict(self, file_name):
    input_name = "file_reader"
    file_reader = tf.read_file('images/' + file_name, input_name)
    if file_name.endswith(".png"):
        image_reader = tf.image.decode_png(file_reader, channels=3, name="png_reader")
    elif file_name.endswith(".gif"):
        image_reader = tf.squeeze(tf.image.decode_gif(file_reader, name="gif_reader"))
    elif file_name.endswith(".bmp"):
        image_reader = tf.image.decode_bmp(file_reader, name="bmp_reader")
    else:
        print('file_reader -> {}'.format(file_reader))
        image_reader = tf.image.decode_jpeg(file_reader, channels=3, name="jpeg_reader")
    float_caster = tf.cast(image_reader, tf.float32)
    dims_expander = tf.expand_dims(float_caster, 0)
    resized = tf.image.resize_bilinear(dims_expander, [self.input_layer_size, self.input_layer_size])
    normalized = tf.divide(tf.subtract(resized, [0]), [128])
    sess = tf.InteractiveSession()
    result = sess.run(normalized)
    sess.close()
    del sess
    return result

Ниже приведены результаты, которые я получаю для разных изображений:

[5.3e-08, 0.0, 0.0, 0.0, 0.999999404, 1.0, 1e-09, 0.228272051, 6.2e-08, 0.995405078, 1.0, 1.0, 0.999997616, 2.2e-08, 0.0, 0.000580777, 1.5233e-05, 0.0]

Вывод из массива numpy (который не работаеткак и ожидалось):

def predict_numpy_image(self, raw_image):
    r, g, b = np.array(raw_image).T
    raw_image = np.array([b, g, r]).transpose()
    tensor_image = tf.convert_to_tensor(raw_image, dtype=tf.float32)
    dims_expander = tf.expand_dims(tensor_image, 0)
    resized = tf.image.resize_bilinear(dims_expander, [self.input_layer_size, self.input_layer_size])
    normalized = tf.divide(tf.subtract(resized, [0]), [128])
    sess = tf.InteractiveSession()
    result = sess.run(normalized)
    sess.close()
    del sess
    return result

Ниже приведены результаты, которые я получаю для разных изображений:

[9.9e-08, 1e-09, 0.0, 0.0, 0.999943137, 1.0, 1e-09, 0.174775824, 3.4e-08, 0.997927666, 1.0, 1.0, 0.999979138, 4.2e-08, 0.0, 0.005487741, 1.8515e-05, 0.0]

Я не уверен, почему две функции дают разные выходы.Это потому, что данные, на которые я делаю выводы, отличаются?Или это потому, что данные, однажды сохраненные / загруженные с помощью tenorflow, отличаются от данных непосредственно из массива numpy.

Просто для справки ниже показано, как я обрезаю изображение, и массив Numpy image, который я передаюдля 2-й функции (Foregnet_Numpy_image):

height, width, channels = img.shape
x = int(region[j][0] * width)
y = int(region[j][1] * height)
w = int(region[j][2] * width)
h = int(region[j][3] * height)
crop_img = img[y:y + h, x:x + w]
predict_numpy_image(crop_img)

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

PS Извинения, если использовали какую-то неверную терминологию, все еще совершенно новую для тензорного потока и ML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...