#javascript #angular #tensor #tensorflow.js #tensorflowjs-converter
Вопрос:
Пытаюсь предсказать с помощью TensorflowJS. Но на входном изображении выше отображается ошибка? Мое изображение имеет тип Uint8Array. Как я могу передать тип Uint8Array для создания тензора?
async predict(imageData: any) {
let img = tf.browser.fromPixels(imageData, 3).resizeBilinear([256, 256]) # problem showing here
img = imageData.reshape([256, 256, 3])
img = tf.cast(img, 'float32')
const segmentation = this.model.predict(img) as any
console.log('success')
}
loadImage(file: FileList) {
this.fileToUpload = file.item(0);
let reader = new FileReader();
reader.readAsDataURL(this.fileToUpload);
reader.onload = (event: any) => {
this.imageUrl = reader.result
this.predict(this.convertDataURIToBinary(this.imageUrl)); # passing Unit8Array image from here
}
}
Есть идеи, как я могу это преодолеть? Спасибо за ваше предложение.
Обновить
Решена эта проблема с помощью ‘@ViewChild(‘imageRef’) imageRef: ЭлементРеф;’ . Наконец, я преобразовал Unit8Array в данные изображения, а затем нарисовал на холсте с помощью putImageData.
Но столкнулся с проблемой в другой части. Поскольку я выполняю сегментацию изображений, результат прямо противоположен тому, что я сделал в python. Есть идеи?
В python я сделал — >
img_face = cv2.resize(frame,(256,256))
img_face = cv2.cvtColor(img_face, cv2.COLOR_BGR2RGB)
img_face = img_face / 255.0
img_face = img_face.astype(np.float32)
mask = model.predict(np.expand_dims(img_face , axis=0))[0]
И моя текущая часть js уже упомянута выше как функция predict ().
Ответ №1:
Если imageData
это Uint8Array, его можно легко преобразовать в тензор с помощью tf.tensor
tf.tensor(imageData)
Кроме того, при создании тензора можно указать ширину и высоту изображения
tf.tensor(imageData, [height, width, channels])
Теперь что касается обработки изображений, то в python вы выполняете
img_face / 255.0
Вы не делаете то же самое в js. вам нужно разделить тензор js на 255
Комментарии:
1. В этом случае его отображение при использовании >>> пусть img = tf.тензор(данные изображения, [256, 256, -1]) ->>> ОШИБКА Ошибка: Не пойман (в обещании): Ошибка: Тензор должен иметь форму,состоящую из положительных целых чисел, но получил форму [256,256, -1] также пытался использовать [256,256, 3], но произошла другая ошибка.
2. В любом случае, я решил эту проблему с помощью @ViewChild (напрямую используя изображение из Html). Но после предсказания модели у меня есть тензор объекта изображения(добавлена его часть для редактирования вопросов). Есть идеи, как я могу показать его в HTML в виде изображения?
3. В этом случае изображение не является Uint8Array, как вы сказали, это скорее элемент HTMLElement.
4. Если вы хотите отобразить тензор на изображение, вы можете использовать
tf.browser.toPixels
5. Uint8Array(50424) [ 255, 216, 255, 224, 0, 16, 74, 70, 73, 70, … ] это был мой массив. В любом случае после использования tf.browser.toPixels его отображение >>> Не обнаружено (в обещании) Ошибка: toPixels поддерживает только тензоры 2 или 3 ранга, получил ранг 4. Моя форма тензорного массива была [1,256,256,1]. Как снизить ранг здесь, чтобы сделать 4 до 3 ? ! Спасибо