将 Base64 图像转换为张量

Jay*_*ash 3 image-processing object-detection node.js tensorflow tensorflow.js

我将图像作为 base64 字符串发送到 Node Express 服务器,以使用张量流分析对象检测。如何使用 Node js 中的 cocossd 模型将 Base64 图像更改为张量以进行对象检测。

edk*_*ked 6

服务器端 NodeJs

可以将 base64 字符串转换为二进制,然后使用以下命令将其读取为张量tf.node

 const b = Buffer.from(base64str, 'base64')
    // get the tensor
 const t = tf.node.decodeImage(b)
Run Code Online (Sandbox Code Playgroud)

如果请求中未发送其他属性/值,则最好在 post 请求或 websocket 中直接以二进制形式发送图像。在这种情况下,就不需要从base64服务器端重新进行转换

浏览器端

const b = atob(base64str)
let byteNumbers = new Array(b.length);
for (let i = 0; i < b.length; i++) {
    byteNumbers[i] = b.charCodeAt(i);
}
let tensor = tf.tensor(byteNumbers)
Run Code Online (Sandbox Code Playgroud)

第一个选项是同步的。对于大图像,它可能会冻结主线程。为了缓解这种情况,可以在网络工作者中完成此操作。

另一个选项是创建一个图像元素并将其 href 属性设置为base64str,然后使用tf.browser.fromPixels

function load(url){
  return new Promise((resolve, reject) => {
    const im = new Image()
        im.crossOrigin = 'anonymous'
        im.src = 'url'
        im.onload = () => {
          resolve(im)
        }
   })
}

// use the load function inside an async function   

(async() => {
     const image = await load(url)
     let tensor = await tf.browser.fromPixels(image)
   })()
Run Code Online (Sandbox Code Playgroud)