@maryaTurova

Keras: как правильно отправить numpy?

Уважаемые! Что делаю не так?
На входе получаю картинку в base64.

Если сохраняю на диск с помощью PIL,то все работает
im = Image.open(io.BytesIO(base64.b64decode(data_obj['link'].split(',')[1])))
im.save('img.png')
im.close()

image = tf.keras.preprocessing.image.load_img(
    'img.png', target_size=(obj['size'], obj['size'])
)
input_arr = tf.keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr])
predictions = obj['main'].predict(input_arr)

result = obj['classes'][np.argmax(predictions[0])]

Но если отправить массив numpy:
nparr = np.fromstring(base64.b64decode(data_obj['link'].split(',')[1]), np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_UNCHANGED)

predictions = obj['main'].predict(np.array([img]))
    
result = obj['classes'][np.argmax(predictions[0])]

Получаю ошибку:
ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 3 but received input with shape [None, 116, 116, 4]
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ошибка говорит, что у тебя в картинке 4 канала вместо трёх.
Я думаю, дело в cv2.IMREAD_UNCHANGED. Зачастую RGB-изображения имеют неиспользуемый 4й байт в пикселе, для выравнивания адресов пикселей в памяти. IMREAD_UNCHANGED означает, что этот байт загружается как есть, вот и получается 4 канала.
Попробуй заменить на IMREAD_COLOR.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы