Ошибка: пиксели, переданные в tf.browser.fromPixels (), должны быть либо элементом HTMLImageElement

#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 ? ! Спасибо