NPU邊緣推理識物系統

目錄

NPU邊緣推理識物系統

一、項目簡介

二、硬件介紹

三、軟件設計

1、底層NPU推理代碼

2、應用層QT顯示代碼

四、項目成果展示


NPU邊緣推理識物系統

一、項目簡介

物品分類是計算機視覺的重要技術,本項目的核心是:使用NPU(神經網絡處理器或神經網絡處理單元)進行本地推理計算識別。相比與傳統的識別技術,NPU邊緣推理識別不需要依賴網絡和云端,它在本地SoC(System on Chip片上系統)上就可以高效、快速地處理AI任務。NPU在AI推理計算上比CPU更專業和高效,比GPU更省電。

二、硬件介紹

本項目使用的是NXP(恩智浦)推出的i.MX93,i.MX93處理器集成的NPU,搭載了 ARM 自研的 Ethos-U65。Ethos-U65 神經處理單元(NPU)是 ARM 為了在面積受限的嵌入式和物聯網設備的情況下加速機器學習推理而設計。

項目開發板使用的是正點原子推出的ATK-DLIMX93 開發板

開發板實物展示

硬件層面雖然正點原子設計的接口很多,但是我們只使用了SoC中的NPU和屏幕進行效果展示。后期考慮接入攝像頭設備。

注意:正點原子沒有提供i.MX93的核心板原理圖,如果想要自己設計出核心板需要借鑒NXP(恩智浦)官方提供的評估板原理圖資料進行復刻。

三、軟件設計

首先聲明,我們項目的所有操作都是基于Linux操作系統來進行的,所以我們要對i.MX93上面燒錄Linux操作系統之后再能進行后續軟件開發。

1、底層NPU推理代碼

底層NPU推理識別流程圖

底層控制NPU推理識別Python代碼

'''
項目所有文件名 : main4.py
作者 : SELSL
版本 : V1.0
描述 : 使用NPU推理得出圖片類型
其他 : 無
論壇 : 無
日志 : 初版 V1.0 2025/8/8 SELSL創建
'''
?
#導入依賴庫
#用于加載和運行 .tflite 格式的模型
import tflite_runtime.interpreter as tflite
#用于處理數組和數值計算
import numpy as np
#(OpenCV): 用于視頻捕獲、圖像處理和保存圖像
import cv2
#用于測量代碼執行時間
import time
#用于解析命令行參數
import argparse
#將模型輸出的類別索引映射為人類可讀的類別名稱
from labels import label2string
?
#定義模型路徑和解析命令行參數
#指定了 .tflite 模型文件的路徑
MODEL_PATH = "../vela_models/ssd_mobilenet_v1_quant_vela.tflite"
?
parser = argparse.ArgumentParser()
parser.add_argument('-i','--input',default='/dev/video0',help='input to be classified')
parser.add_argument('-d','--delegate',default='',help='delegate path')
args = parser.parse_args()
?
#設置圖片輸入
if args.input.isdigit():cap_input = int(args.input)
else:cap_input = args.input
vid = cv2.VideoCapture(cap_input)
?
#加載和初始化 TFLite 模型
if args.delegate:ext_delegate = [tflite.load_delegate(args.delegate)]interpreter = tflite.Interpreter(model_path=MODEL_PATH, experimental_delegates=ext_delegate)
else:interpreter = tflite.Interpreter(model_path=MODEL_PATH)
interpreter.allocate_tensors()
?
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
height = input_details[0]['shape'][1]
width = input_details[0]['shape'][2]
?
#初始化性能計數器和讀取照片
total_fps = 0
total_time = 0
?
ret, frame = vid.read()
if frame is None:print("Can't read frame from source file", args.input)exit(0)
?
saved = False
?
#主循環
while ret:total_fps += 1loop_start = time.time()
?#圖像預處理img = cv2.resize(frame, (width, height)).astype(np.uint8)input_data = np.expand_dims(img, axis=0)interpreter.set_tensor(input_details[0]['index'], input_data)#執行推理invoke_start = time.time()interpreter.invoke()invoke_end = time.time()
?#獲取和處理推理結果boxes = interpreter.get_tensor(output_details[0]['index'])[0]labels = interpreter.get_tensor(output_details[1]['index'])[0]scores = interpreter.get_tensor(output_details[2]['index'])[0]number = interpreter.get_tensor(output_details[3]['index'])[0]
?#后處理與可視化if int(number) > 0 and not saved:for i in range(int(number)):if scores[i] > 0.5:box = [boxes[i][0], boxes[i][1], boxes[i][2], boxes[i][3]]x0 = max(2, int(box[1] * frame.shape[1]))y0 = max(2, int(box[0] * frame.shape[0]))x1 = int(box[3] * frame.shape[1])y1 = int(box[2] * frame.shape[0])
?cv2.rectangle(frame, (x0, y0), (x1, y1), (255, 0, 0), 2)cv2.putText(frame, label2string[labels[i]], (x0, y0 + 13),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)print(f"Detected object: ({x0},{y0})-({x1},{y1}) label:{label2string[labels[i]]} score:{scores[i]:.2f}")
?cv2.imwrite('test.bmp', frame)print("Detection result saved as test.bmp")saved = True
?#性能計算與顯示loop_end = time.time()total_time += (loop_end - loop_start)
?fps = int(total_fps / total_time)invoke_time = int((invoke_end - invoke_start) * 1000)print(f"Processing frame {total_fps}: FPS={fps}, Inference time={invoke_time}ms")
?#檢查退出ret, frame = vid.read()if cv2.waitKey(1) & 0xFF == ord('q'):break
?
vid.release()

2、應用層QT顯示代碼

QT應用層代碼流程圖

顯示圖像框架預覽

QT核心代碼預覽

/***************************************************************
項目所有文件名 : mainwindow.h main.c mainwindow.c mainwindow.ui
作者 : SELSL
版本 : V1.0
描述 : 使用NPU推理得出圖片類型
其他 : 無
論壇 : 無
日志 : 初版 V1.0 2025/8/8 SELSL創建
***************************************************************/
#include "mainwindow.h"
#include "ui_mainwindow.h"
?
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
?//設置工作路徑,方便后續操作圖片處理命令QDir::setCurrent("/usr/bin/eiq-examples-git/object_detection");//創建QProcess對象,方便后期進行命令執行process = new QProcess;
?
}
?
MainWindow::~MainWindow()
{delete process;delete imageLabel;delete imageLabel2;delete ui;
}
?
//關閉窗口
void MainWindow::on_pushButton_2_pressed()
{close();
}
?
//打開對象圖片,并顯示
void MainWindow::on_toolButton_clicked()
{//使用QFileDialog中的getOpenFileName獲取要進行目標檢測的圖片地址QString imageName = QFileDialog::getOpenFileName(this, tr("請選擇圖片"), "/usr/bin/eiq-examples-git/object_detection");//輸出圖片地址是否正確qDebug() << imageName;//把圖片地址放入QLineEdit組件中,方便用戶查看ui->lineEdit->setText(imageName);//創建QLabel標簽對象,為放置圖片做準備imageLabel = new QLabel;//把圖片放入QImage對象中QImage image(imageName);//把圖片放入QPixmap處理,在放入QLabel中imageLabel->setPixmap(QPixmap::fromImage(image));//最終把圖片展示在界面的QScrollArea組件中,顯示出要識別的圖片,方便用戶直觀的查看圖片。ui->sa_object->setWidget(imageLabel);
}
?
//開始目標采集,并顯示
void MainWindow::on_pushButton_clicked()
{//輸出當前的工作目錄qDebug() << QDir::currentPath();//使用 NPU 推理進行目標檢測的終端命令QString command1 = QString("python3 main4.py -i ");QString command2 = QString(ui->lineEdit->text());QString command3 = QString(" -d /usr/lib/libethosu_delegate.so");QString command = command1 + command2 + command3;//輸出驗證終端命令是否正確qDebug() << command;//開始使用NPU 推理進行目標檢測process->start("/bin/sh", QStringList() << "-c" << command);//等待使用NPU推理進行目標檢測完成process->waitForFinished();
?//輸出NPU推理目標檢測完成后的輸出信息QString output = process->readAllStandardOutput();qDebug() << output;
?//得到NPU推理得出的目標圖片地址QString imageName = QString("/usr/bin/eiq-examples-git/object_detection/test.bmp");//輸出圖片地址是否正確qDebug() << imageName;
?//創建QLabel標簽對象,為放置圖片做準備imageLabel2 = new QLabel;//把圖片放入QImage對象中QImage image(imageName);//把圖片放入QPixmap處理,在放入QLabel中imageLabel2->setPixmap(QPixmap::fromImage(image));//向目標QScrollArea展示推理得出的目標圖片ui->sa_result->setWidget(imageLabel2);
}

注意:QT應用層代碼有mainwindow.h main.c mainwindow.c mainwindow.ui,這里只顯示了最核心的部分mainwindow.c,其他代碼請向項目成員SELSL獲取。

四、項目成果展示

代碼預覽展示

調試階段性結果展示

最終結果演示

注意:這個項目我們采用的是官方提供的免費開源模型,開源的,你懂的,就是能用,但是效果沒有自己訓練的模型或買的模型效果好,所以有一部分物體識別達不到先要的效果,包括本團隊后期使用NPU進行的人臉識別推理,同一個人識別出不同的效果的現象。這不是代碼的問題也NPU的問題,而是模型上的問題。

我們的NPU算力達到了6TOPs,在移動終端設備上是一個比較快的水準,當然向上與GPU幾百的算力相比還是稍顯遜色,但是相比于功耗來說,我們的NPU的功耗是遠遠低于GPU的功耗。這里通過上面的調試推理過程也可以看到推理時間大概在4ms左右,這也是一個很快的推理速度,相比與傳統的把圖片上傳至云端耗時操作好點的,特別是在實時性要求比較高的場所,NPU邊緣推理是一個很好的解決方案。

資料獲取:https://download.csdn.net/download/2403_82436914/91888061

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96030.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# WinForm分頁控件實現與使用詳解

C# WinForm分頁控件實現與使用詳解概述在WinForms應用程序開發中&#xff0c;數據分頁是常見的需求。本文將介紹如何實現一個功能完整的分頁控件&#xff0c;并在窗體中如何使用該控件進行數據分頁展示。分頁控件實現核心屬性與字段public partial class PageControl : UserCon…

高級 ACL 有多強?一個規則搞定 “IP + 端口 + 協議” 三重過濾

一、實驗拓撲及描述 二、實驗需求 1、完成拓撲中各設備的基礎配置&#xff0c;使得全網互通&#xff1b; 2、在上一個需求的基礎上&#xff0c;在路由器上部署高級ACL&#xff0c;使得Client1無法訪問Server的HTTP服務&#xff0c;但是PC1依然能夠訪問服務器及其他節點&#xf…

支持多材質密度設置的金屬重量計算使用指南

傳統手工計算各種型材&#xff08;如鋼管、角鋼、鋼板等&#xff09;的重量繁瑣且容易出錯。 它的體積小巧&#xff0c;不足100KB&#xff0c;運行不占內存&#xff0c;綠色免安裝&#xff0c;雙擊即開&#xff0c;使用便捷。 可計算鋼管、鋼板、型鋼、角鋼等常見型材的重量&a…

在Spring Boot中使用H2數據庫

好處 程序啟動時自動創建數據庫數據表。 使用步驟 引入依賴&#xff1a; <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId&…

Day21_【機器學習—決策樹(2)—ID3樹 、C4.5樹、CART樹】

一、ID3 決策樹1. 核心思想使用信息增益&#xff08;Information Gain&#xff09;作為特征選擇的標準&#xff0c;遞歸地構建決策樹。2. 特征選擇標準信息增益&#xff08;IG&#xff09;&#xff1a;選擇使信息增益最大的特征進行劃分。3. 優點算法簡單&#xff0c;易于理解。…

2025計算機視覺新技術

CLIP / BLIP-3 類「視覺-語言大模型」 ? 是什么&#xff1a;讓網絡自己學會“看圖說話”&#xff0c;zero-shot 就能分類、檢測、檢索。 ? 能干什么&#xff1a;不寫訓練代碼&#xff0c;直接一句中文 prompt 就把商品圖分成 500 類。 ? 落地難度&#xff1a;★☆☆&#xf…

[光學原理與應用-431]:非線性光學 - 能生成或改變激光波長的物質或元件有哪些?

要生成或改變激光波長&#xff0c;可依賴增益介質、非線性光學元件、調諧元件及特殊激光器設計&#xff0c;以下是一些關鍵物質和元件及其作用機制&#xff1a;一、增益介質&#xff1a;波長的“決定者”增益介質是激光器的核心&#xff0c;其原子或分子的能級結構直接決定輸出…

接口權限驗證有哪些方式

接口權限驗證是保障 API 安全的核心機制&#xff0c;常見的方式有以下幾類&#xff0c;適用于不同場景和安全需求&#xff1a; 1. 基于令牌&#xff08;token&#xff09;的驗證 &#xff08;1&#xff09;JWT&#xff08;JSON Web Token&#xff09; 原理&#xff1a; 服務器驗…

Go開發的自行托管代理加速服務:支持Docker與GitHub加速

HubProxy&#xff1a;一站式解決Docker與GitHub訪問難題的輕量級代理服務作為開發者&#xff0c;我們經常遇到這些問題&#xff1a;Docker鏡像拉取速度慢得讓人抓狂&#xff0c;GitHub Release文件下載到一半斷開&#xff0c;或者某些境外容器倉庫完全無法訪問。最近發現的hubp…

用Python打造逼真的照片桌面:從拖拽到交互的完整實現

在這個數字化時代&#xff0c;我們經常需要處理大量的照片和圖片文件。今天我將帶你一步步實現一個功能豐富的照片桌面程序&#xff0c;讓你可以像在真實桌面上擺放照片一樣操作數字圖片。這個程序使用wxPython構建&#xff0c;支持拖拽、調整大小、刪除等交互功能。C:\pythonc…

《sklearn機器學習——模型的持久性》joblib 和 pickle 進行模型保存和加載

模型持久性在 Scikit-learn 中的應用詳解 模型持久性的基本概念 在機器學習領域&#xff0c;模型持久性是指將訓練好的模型保存到磁盤或數據庫中&#xff0c;以便在后續的預測任務中能夠直接使用&#xff0c;而無需重新訓練模型。這一過程不僅提高了模型的可重用性&#xff0c;…

前端-組件化開發

目錄 一.組件化 二.根組件 三.App.vue文件&#xff08;單文件組件&#xff09;的三個組成部分 四.普通組件的注冊和使用&#xff1a; 1.普通組件的創建 2.局部注冊 3.全局注冊 &#x1f9e0; 補充小技巧&#xff1a; &#x1f4a1; 關于組件名&#xff08;第一個參數&…

UNIX/macOS路由表查詢原理與實現

&#x1f310; UNIX/macOS路由表查詢原理與實現&#x1f4cc; 功能全景圖 #mermaid-svg-mz6rxrQ73xinNsqc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mz6rxrQ73xinNsqc .error-icon{fill:#552222;}#mermaid-svg…

Python爬蟲實戰:研究Style sheets模塊,構建電商平臺筆記本電腦銷售數據采集和分析系統

1. 引言 1.1 研究背景 在數字經濟時代,互聯網蘊含的海量數據已成為企業決策與學術研究的核心資源。網絡爬蟲技術通過自動化請求、解析網頁,能夠高效提取公開數據,為市場分析、競品研究等場景提供基礎支撐。Python 憑借其豐富的生態庫(如 Requests、BeautifulSoup、Pandas…

lesson55:CSS導航組件全攻略:從基礎導航條到動態三級菜單與伸縮菜單實現

目錄 一、CSS導航條&#xff1a;構建基礎導航系統 1.1 語義化HTML結構 1.2 現代Flexbox布局實現 1.3 核心技術解析 二、三級菜單&#xff1a;構建多層級導航體系 2.1 嵌套HTML結構 2.2 多級菜單CSS實現 2.3 關鍵技術解析 三、伸縮菜單&#xff1a;實現動態交互導航 3…

Linux基礎知識(二)

文件操作1. 怎么理解 I/O 重定向&#xff1f; 2. /dev/null 是什么&#xff0c;有什么用途&#xff1f; 3. 解釋下列命令的結果&#xff1a;&> /dev/null 、2>> file 4. 怎么理解管道&#xff1f;管道和重定向有什么區別&#xff1f; 5. 在什么情況下需要使用 tee…

Ribbon和LoadBalance-負載均衡

Ribbon和LoadBalance-負載均衡 Ribbon 和 Spring Cloud LoadBalancer (SCL) 都是 Spring Cloud 生態中實現客戶端負載均衡的核心組件&#xff0c;但它們在定位、架構、實現和功能上有顯著區別。以下是詳細的對比分析&#xff1a; ?1. 核心定位與背景??Ribbon:??起源于 ?N…

【數據可視化-107】2025年1-7月全國出口總額Top 10省市數據分析:用Python和Pyecharts打造炫酷可視化大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Java中的字符串

字符串 String Java編譯器對String類型有特殊處理&#xff0c;可用使用"…"來表示一個字符串。實際上字符串在String內部是通過一個數組表示的。 Java中字符串的一個重要特點是不可變。這種不可變性是通過內部的private final char[]字段&#xff0c;以及沒有任何修改…

ragflow MCP 調用核心提示詞解析:邏輯閉環與優化方向

大家好&#xff5e;我是你們的提示詞工程師朋友&#xff0c;今天想跟大家聊聊開源項目 ragflow 里&#xff0c;MCP調用體系中的兩個關鍵提示詞。最近在研究調用工具和提示詞撰寫之間的平衡態。這倆家伙在信息處理和問題解決里作用不小&#xff0c;既有讓人眼前一亮的優勢?&…