0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用OpenVINO? ElectronJS中創(chuàng)建桌面應(yīng)用程序

英特爾物聯(lián)網(wǎng) ? 來源:英特爾物聯(lián)網(wǎng) ? 2024-11-25 11:35 ? 次閱讀

最近,我完成了一個(gè) demo 演示,展示了 OpenVINO 在 Node.js 框架中的強(qiáng)大功能。得益于與 Electron.js 的集成,該演示不僅能夠高效地執(zhí)行神經(jīng)網(wǎng)絡(luò)推理,還提供了交互式的用戶體驗(yàn)。

1

應(yīng)用程序概覽:一種簡單的背景虛化方法

這個(gè)演示展示了如何在 Node.js 環(huán)境中使用 OpenVINO 工具包實(shí)現(xiàn)背景虛化,并通過 Electron.js 創(chuàng)建的直觀桌面界面進(jìn)行呈現(xiàn)。啟動應(yīng)用程序后,您會看到一個(gè)帶有黑色占位符的界面。要激活攝像頭,只需從檢測到的設(shè)備列表中選擇您喜歡的視頻源并點(diǎn)擊“開始”。

edbc63e0-a8b8-11ef-93f3-92fbcf53809c.png

完成此步驟后,您應(yīng)該會在界面中的框內(nèi)看到來自攝像頭的實(shí)時(shí)視頻流。

最初,您的畫面將顯示為未經(jīng)過任何虛化處理的原始圖像。要啟用背景虛化功能,請通過指定的切換開關(guān)打開推理模式。該應(yīng)用還允許您選擇推理設(shè)備,可以在操作前或操作過程中進(jìn)行設(shè)置。當(dāng)您在會話中首次選擇設(shè)備時(shí),可能會出現(xiàn)短暫的延遲,因?yàn)槟P托枰M(jìn)行編譯。

在攝像頭畫面上方,您會看到一個(gè)推理時(shí)間顯示器,顯示最近50幀的平均推理時(shí)間。同時(shí),還會顯示每秒處理(或推理)的幀數(shù),讓您了解性能表現(xiàn)。

在應(yīng)用運(yùn)行期間,您可以隨時(shí)停止攝像頭或推理,切換視頻源,或更改推理設(shè)備。

2

項(xiàng)目架構(gòu)

完整代碼可以在 OpenVINO Build & Deploy 倉庫中找到。該 Electron 應(yīng)用項(xiàng)目分為幾個(gè)關(guān)鍵部分:

GitHub - openvinotoolkit/openvino_build_deploy: Pre-built components and code samples to help you build and deploy production-grade AI applications with the OpenVINO Toolkit from Intel

界面(Interface):

包括定義界面視覺效果的 HTML 和 CSS 文件,以及控制功能的 renderer.js 文件。

OpenVINO 任務(wù)(OpenVINO Jobs):

后端組件,位于 ov-jobs.js 文件中,包含推理、前處理、后處理和背景虛化的相關(guān)函數(shù)。

主程序(Main):

main.js 文件負(fù)責(zé)啟動應(yīng)用程序,設(shè)置必要參數(shù),并處理中斷等操作。

預(yù)加載(Preload):

preload.js 文件作為主程序與界面組件之間的橋梁,啟用后端功能并處理用戶觸發(fā)的中斷。

Node 模塊(Node Modules):

程序所需的外部庫和模塊列在 package.json 文件中,同時(shí)包含其他必要的開發(fā)信息。要安裝這些模塊,只需在主目錄運(yùn)行以下命令:

npm install

保持清晰的項(xiàng)目架構(gòu)至關(guān)重要,因?yàn)?OpenVINO 的 Node.js 庫只能在后端運(yùn)行。如果將其導(dǎo)入到界面層會導(dǎo)致錯(cuò)誤。因此,最佳實(shí)踐是將 OpenVINO 的導(dǎo)入限制在 ov-jobs.js 文件中。

3

它是如何工作的?

背景虛化功能使用了一個(gè)來自 TensorFlow 的分割模型,名為 “TensorFlow_Lite_Frontend_IR”,該模型已被轉(zhuǎn)換為 OpenVINO 的 IR 格式。此模型要求輸入尺寸為 1x3x256x256,因此在預(yù)處理步驟中,需要將圖像調(diào)整為正方形(無需填充)。如果圖像不是 RGB 格式,還需要將其顏色表示轉(zhuǎn)換為 RGB 格式。

const sharp = require('sharp');
// originalImg is a sharp object.
async function preprocess(originalImg) {
  const inputSize = { w: 256, h: 256 };
  const inputImg = await originalImg
    .resize(inputSize.w, inputSize.h, { fit: 'fill' })
    .removeAlpha() // converting RGBA to RGB
    .raw()
    .toBuffer();
  const resizedImageData = new Uint8ClampedArray(inputImg.buffer);
  const tensorData = Float32Array.from(resizedImageData, x => x / 255);
  const shape = [1, inputSize.w, inputSize.h, 3];
  return new ov.Tensor(ov.element.f32, shape, tensorData);

該模型作為分類器工作,將圖像中的每個(gè)像素分配到六個(gè)類別之一,其中類別 0 代表背景。在推理后,輸出會經(jīng)過后處理生成一個(gè)掩碼,其中 0 表示背景(需要進(jìn)行虛化),1 表示其他元素(需要保持清晰)。隨后,該掩碼會被調(diào)整為與原始圖像尺寸匹配。

程序運(yùn)行時(shí)采用兩個(gè)主要線程:一個(gè)線程從攝像頭捕獲幀,根據(jù)掩碼對背景進(jìn)行虛化處理,并將處理后的結(jié)果顯示在屏幕上。另一個(gè)線程“借用”一幀圖像,運(yùn)行推理以更新掩碼,確保攝像頭的畫面保持流暢,即使某些設(shè)備上的推理需要較長時(shí)間。

4

JavaScript 中

使用 OpenVINO 的基本功能

發(fā)現(xiàn)可用來進(jìn)行推理的設(shè)備:

const { addon: ov } = require('openvino-node');
const core = new ov.Core();
const devices = core.getAvailableDevices();

讀入和編譯模型:

const { addon: ov } = require('openvino-node');
const core = new ov.Core();
const modelPath = "path/to/your/model";
const model = await core.readModel(modelPath);
const device = "AUTO"; // or "GPU", "CPU" and others
const compiledModel = await core.compileModel(model, device);

運(yùn)行編譯后的模型:

// have compiledModel and inputTensor prepared
let inferRequest = compiledModel.createInferRequest();
inferRequest.setInputTensor(inputTensor);
inferRequest.infer() // inference
const outputLayer = compiledModel.outputs[0]; // only one output in this scenario
const resultTensor = inferRequest.getTensor(outputLayer); // your inference result

虛化步驟:

這是最簡單的虛化圖像的方式:

捕獲一幀圖像
從攝像頭捕獲當(dāng)前幀。

復(fù)制并虛化圖像
創(chuàng)建原始圖像的副本,使用 sharp.blur() 對整個(gè)副本進(jìn)行虛化處理(替代方案:OpenCV 或卷積操作)。

獲取分割模型生成的掩碼
在獨(dú)立線程中運(yùn)行分割模型,獲取當(dāng)前幀的掩碼。

應(yīng)用掩碼到虛化圖像
將虛化圖像的所有像素值與掩碼相乘,保留需要虛化的區(qū)域。

生成“反掩碼”
計(jì)算掩碼的反值(即 1 - mask),生成“非虛化區(qū)域掩碼”。

應(yīng)用“反掩碼”到原始圖像
將原始圖像的像素值與“反掩碼”相乘,保留需要保持清晰的區(qū)域。

融合兩張圖像
將虛化后的圖像和清晰區(qū)域的圖像進(jìn)行融合,生成最終圖像。

在最終的應(yīng)用程序代碼中,多個(gè)操作被整合在一起,充分利用了 Sharp 庫的功能。以下是使用 Sharp 實(shí)現(xiàn)的方法:

1.根據(jù)掩碼裁剪原始圖像:

const sharp = require('sharp');
const person = await sharp(outputMask, {
    raw: {
      channels: 3,
      width: inputSize.w,
      height: inputSize.h,
    }
  })
    .resize(width, height, { fit: 'fill' })
    .unflatten()
    .composite([{
      input: image.data,
      raw: {
        channels: 4,
        width,
        height,
      },
      blend: 'in',
    }])
    .toBuffer();

2.對副本進(jìn)行虛化處理,并將其與裁剪后的原始圖像合并(復(fù)合):

const blurSize = Math.floor(widthOfImage * 0.01)
const blurredImage = await sharp(imageToBlur.data, {
  raw: { channels: 4, width, height }, // back to RGBA
})
  .blur(blurSize)
  .composite([{
    input: person,
    raw: { channels: 4, width, height },
    blend: 'atop'
  }])
  .raw()
  .toBuffer();

5

虛化面臨的挑戰(zhàn)

圖像虛化是一項(xiàng)耗時(shí)的操作,對性能影響較大,尤其是當(dāng)它是圖像顯示線程的一部分時(shí),這直接關(guān)系到用戶體驗(yàn)。沒有人希望視頻流出現(xiàn)卡頓。


一種優(yōu)化方法是在一開始就將圖像調(diào)整為最終顯示的大小。較小的圖像處理速度更快,從而提高性能。

起初,我們嘗試使用 OpenCV 的虛化功能(通過 opencv-wasm 模塊)。然而事實(shí)證明,其速度太慢,甚至比模型推理還慢,這促使我們尋找替代方案。

我們曾設(shè)想創(chuàng)建一個(gè)專門用于虛化的輕量化模型。該模型以圖像幀和掩碼作為輸入,執(zhí)行“虛化過程”部分描述的數(shù)學(xué)操作,并通過深度卷積(Depthwise Convolution)實(shí)現(xiàn)虛化。我們使用 TensorFlow 構(gòu)建了這個(gè)模型,并將其轉(zhuǎn)換為 OpenVINO 格式。

重要說明:OpenVINO 從 2024.4 版本開始度卷積操作。

盡管這種方法具有潛力,但由于深度卷積速度較慢且優(yōu)化不足,最終被我們放棄。

最終,我們發(fā)現(xiàn) Sharp 庫在此操作中表現(xiàn)最佳,因此將其作為項(xiàng)目中的解決方案。

6

總結(jié)

如果遵循以下關(guān)鍵指南,使用 Electron.js 和 OpenVINO 創(chuàng)建桌面應(yīng)用程序是非常簡單的:

1.前后端功能分離:

確保將后端功能與前端功能分開,并記住 OpenVINO 只能在后端使用。

2.JavaScript API 的局限性:

并非所有 Python 中可用的 OpenVINO 方法都已在 JavaScript 中實(shí)現(xiàn)。然而,當(dāng)前的 API 已足以完成大多數(shù)任務(wù)。

3.閱讀文檔:

許多常見問題的答案都可以在文檔中找到。參考 OpenVINO Node.js API 文檔以獲取更多信息。

4.檢查庫兼容性:

某些 JavaScript 庫可能無法很好地與 Electron 配合使用。在這些情況下,您可能需要尋找替代版本或定制分支。

別忘了親自體驗(yàn)一下 "Hide Your Mess Behind" 應(yīng)用程序!您可以從代碼倉庫運(yùn)行該應(yīng)用程序,也可以下載適用于 Windows(exe)或 Linux(deb、rpm)的可執(zhí)行版本。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3268

    瀏覽量

    57704
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    201

原文標(biāo)題:開發(fā)者實(shí)戰(zhàn)|如何使用 OpenVINO? 在 ElectronJS 中創(chuàng)建桌面應(yīng)用程序

文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    桌面應(yīng)用程序可以使用廣播255.255.255.255嗎

    應(yīng)用程序會偵聽并發(fā)送一個(gè)請求(使用廣播)來改變IP到相同的網(wǎng)絡(luò)范圍。例如,這是很好的工作,但我的疑問是:在桌面應(yīng)用程序,我可以使用廣播255.255.255.255,或者我應(yīng)該
    發(fā)表于 02-26 15:27

    如何創(chuàng)建 UEFI LCD與運(yùn)行 LCD 應(yīng)用程序(2)

    創(chuàng)建 UEFI LCD 應(yīng)用程序、運(yùn)行 LCD 應(yīng)用程序(第二部分)
    的頭像 發(fā)表于 06-22 01:50 ?3067次閱讀

    如何創(chuàng)建 UEFI LCD與運(yùn)行 LCD 應(yīng)用程序(1)

    創(chuàng)建 UEFI LCD 應(yīng)用程序、運(yùn)行 LCD 應(yīng)用程序(第一部分)
    的頭像 發(fā)表于 06-22 04:24 ?3408次閱讀

    使用OpenCL應(yīng)用程序的英特爾SDK創(chuàng)建代碼

    使用適用于OpenCL應(yīng)用程序的英特爾SDK創(chuàng)建,構(gòu)建和調(diào)試OpenCL代碼
    的頭像 發(fā)表于 10-30 06:26 ?3483次閱讀

    如何使用Xilinx SDK創(chuàng)建Linux應(yīng)用程序,并進(jìn)行開發(fā)和調(diào)試

    了解如何使用Xilinx SDK創(chuàng)建Linux應(yīng)用程序。 我們還將重點(diǎn)介紹和演示支持Linux應(yīng)用程序開發(fā)和調(diào)試的不同方面的SDK功能。 整個(gè)過程快速而簡單。
    的頭像 發(fā)表于 11-20 07:03 ?1.1w次閱讀

    何使用Xilinx軟件開發(fā)套件XSDK創(chuàng)建簡單的應(yīng)用程序

    了解如何使用Xilinx軟件開發(fā)套件(XSDK)應(yīng)用程序模板創(chuàng)建簡單的應(yīng)用程序。 本視頻將引導(dǎo)您完成創(chuàng)建“Hello,World!”,
    的頭像 發(fā)表于 11-26 06:59 ?3959次閱讀

    怎樣創(chuàng)建樹莓派上的Web應(yīng)用程序 并使用Flask Web Framework控制伺服電機(jī)

    在這篇文章,您將學(xué)習(xí)如何創(chuàng)建Raspberry Pi上的Web應(yīng)用程序,使用Flask Web Framework控制伺服電機(jī),以創(chuàng)建Web應(yīng)用程
    的頭像 發(fā)表于 07-26 15:27 ?6608次閱讀

    如何創(chuàng)建Windows 10 Arduino應(yīng)用程序

    Microsoft將全力投入Windows 10,最終實(shí)現(xiàn)了擁有可跨平臺運(yùn)行的應(yīng)用程序的夢想。結(jié)合對Arduino的官方支持,您可以使用一個(gè)功能強(qiáng)大的新工具:能夠輕松創(chuàng)建具有與現(xiàn)實(shí)世界硬件連接的通用Windows應(yīng)用程序的功能。
    的頭像 發(fā)表于 12-03 08:53 ?2735次閱讀

    Fliqlo桌面時(shí)鐘軟件應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Fliqlo桌面時(shí)鐘軟件應(yīng)用程序免費(fèi)下載
    發(fā)表于 03-30 08:00 ?0次下載

    創(chuàng)建一個(gè)簡單的人臉識別桌面應(yīng)用程序

    錯(cuò)誤也是常有的。 本文是基于虹軟人臉識別SDK 3.0Windows(X86),C/C++的demo,封裝后輸出的一個(gè)簡單的可直接體驗(yàn)的桌面應(yīng)用程序,初次接觸者可以快速體驗(yàn)人臉識別功能,便于做算法選型、調(diào)研及上級匯報(bào)! 2.應(yīng)用程序
    的頭像 發(fā)表于 09-15 17:10 ?1896次閱讀

    用于創(chuàng)建新固件應(yīng)用程序的軟件工具Keil IDE

    用于創(chuàng)建新固件應(yīng)用程序的軟件工具Keil IDE
    發(fā)表于 06-06 08:09 ?4次下載
    用于<b class='flag-5'>創(chuàng)建</b>新固件<b class='flag-5'>應(yīng)用程序</b>的軟件工具Keil IDE

    【從0開始創(chuàng)建AWTK應(yīng)用程序創(chuàng)建應(yīng)用程序并在模擬器運(yùn)行

    AWTK是基于C語言開發(fā)的跨平臺GUI框架。本系列文章介紹如何從0開始創(chuàng)建AWTK應(yīng)用程序,包括搭建開發(fā)調(diào)試環(huán)境、使用AWTK創(chuàng)建Hello工程并在模擬器上運(yùn)行、將AWTK應(yīng)用程序移植
    的頭像 發(fā)表于 12-01 08:24 ?518次閱讀
    【從0開始<b class='flag-5'>創(chuàng)建</b>AWTK<b class='flag-5'>應(yīng)用程序</b>】<b class='flag-5'>創(chuàng)建</b><b class='flag-5'>應(yīng)用程序</b>并在模擬器運(yùn)行

    如何快速下載OpenVINO Notebooks的AI大模型

    OpenVINO Notebooks是Jupyter Notebook形式的OpenVINO范例程序大集合,方便開發(fā)者快速學(xué)習(xí)并掌握OpenVINO推理
    的頭像 發(fā)表于 12-12 14:40 ?1131次閱讀
    如何快速下載<b class='flag-5'>OpenVINO</b> Notebooks<b class='flag-5'>中</b>的AI大模型

    OpenAI推出ChatGPT桌面應(yīng)用程序

    OpenAI 近日宣布,備受期待的 ChatGPT 桌面應(yīng)用程序現(xiàn)已正式發(fā)布。在官方公告,OpenAI 表示他們首先會將這款應(yīng)用提供給 Plus 用戶群體,并特別針對 macOS 系統(tǒng)推出。這是該公司為了滿足用戶對更便捷、更
    的頭像 發(fā)表于 05-14 11:51 ?1026次閱讀

    使用OpenVINO GenAI API在C++構(gòu)建AI應(yīng)用程序

    許多桌面應(yīng)用程序是使用 C++ 開發(fā)的,而將生成式AI(GenAI)功能集成到這些應(yīng)用程序可能會很具有挑戰(zhàn)性,尤其是因?yàn)槭褂孟?Hugging Face 這樣的 Python 庫的復(fù)
    的頭像 發(fā)表于 10-12 09:36 ?383次閱讀
    使用<b class='flag-5'>OpenVINO</b> GenAI API在C++<b class='flag-5'>中</b>構(gòu)建AI<b class='flag-5'>應(yīng)用程序</b>