:從訓(xùn)練到部署全流程解析)
簡介這是一套面向計算機(jī)視覺畢設(shè)與課程設(shè)計的基于YOLOv8的智能門禁系統(tǒng)完整實現(xiàn)內(nèi)置訓(xùn)練、驗證與可視化界面模塊支持快速部署與二次修改。資源包共97個文件壓縮后約24.21MB以Python源碼為主約70個py腳本覆蓋模型訓(xùn)練、檢測推理、工具封裝與界面服務(wù)另含已訓(xùn)練模型權(quán)重pt、目標(biāo)檢測配置xml、說明文檔txt及操作演示mp4目錄按檢測服務(wù)、模型訓(xùn)練、UI頁面等模塊分隔便于按需取用。訓(xùn)練模塊可輸出混淆矩陣、F1分?jǐn)?shù)曲線、精確率-召回率曲線、標(biāo)簽分布圖及驗證集預(yù)測結(jié)果等關(guān)鍵指標(biāo)圖表適合答辯展示與效果評估可視化頁面降低了調(diào)用門檻部署說明與操作演示能幫助快速復(fù)現(xiàn)即使基礎(chǔ)一般也能較快上手。目前已有52人學(xué)習(xí)下載適合計算機(jī)、人工智能、自動化等相關(guān)專業(yè)的在校生用于畢設(shè)、課設(shè)或初期項目演示。1. 基于YOLOv8的智能門禁系統(tǒng)拿到源碼包先別急著跑很多人看到“智能門禁系統(tǒng)”這個名字第一反應(yīng)是“是不是又是人臉識別”。但真正的項目重心落在目標(biāo)檢測和行為分析上以 YOLOv8 為主檢測器配一個五類檢測服務(wù)模塊、視頻批量檢測腳本以及一個可視化操作界面串起一條從數(shù)據(jù)集準(zhǔn)備、模型訓(xùn)練到推理展示的完整鏈路。對正在準(zhǔn)備畢設(shè)、課設(shè)或找練手項目的計算機(jī)視覺方向?qū)W生來說這套源碼的價值是它把“算法、前后端工程、訓(xùn)練產(chǎn)物”放在同一個包內(nèi)你能直接看一套“能跑完”的方案長什么樣而不是對著零散的教程拼湊。下文按我拆這個包的經(jīng)驗從源碼結(jié)構(gòu)講到部署、訓(xùn)練、評估再到常見坑和邊緣設(shè)備部署思路。2. 從源碼結(jié)構(gòu)到運行鏈路門禁系統(tǒng)的模塊劃分與數(shù)據(jù)流2.1 主入口與檢測服務(wù)main.py、five_type_det_service.py 各管什么先把根目錄這幾個 Python 文件的作用理清你后面改代碼才有方向。main.py 是程序入口負(fù)責(zé)初始化可視化界面并調(diào)度檢測流程讀取輸入、調(diào)用模型推理、把結(jié)果渲染到界面。單獨拆出來的 five_type_det_service.py 是五類檢測服務(wù)模塊它把“模型輸出”和“界面展示”解耦——服務(wù)層拿檢測框和類別界面層只管畫出來。這樣設(shè)計的好處很直接你要換模型權(quán)重或者改檢測類別只需要動服務(wù)層界面代碼基本不用碰避免改一處崩一處的連鎖反應(yīng)。detect.py 和 Detection_video.py 是另外兩條推理鏈路。detect.py 處理單張圖片或單幀輸入適合快速驗證模型效果Detection_video.py 針對離線視頻做逐幀檢測并把結(jié)果寫回視頻文件平時我在驗證數(shù)據(jù)集效果時都用它跑一段視頻比一張張截圖直觀得多。train_mode.py 則是訓(xùn)練入口把訓(xùn)練態(tài)和推理態(tài)分開意味著你可以在同一套代碼里做“訓(xùn)練—驗證—部署”的閉環(huán)演示答辯時想現(xiàn)場重訓(xùn)一個小數(shù)據(jù)集也不用切換到別的倉庫。my_func.py 是自定義工具函數(shù)集合通常是做了一些項目特定的預(yù)處理、后處理邏輯比如把檢測結(jié)果整理成界面需要的格式。這些文件互相之間通過函數(shù)調(diào)用而非復(fù)制代碼來共享邏輯整體耦合度不高。初看這套結(jié)構(gòu)我建議按“入口 → 服務(wù) → 工具”的順序讀main.py 調(diào) five_type_det_service.py服務(wù)層調(diào) my_func.py 和 utils讀代碼時不要一頭扎進(jìn) utils 出不來。2.2 utils 工具鏈訓(xùn)練閉環(huán)里的每個環(huán)節(jié)都在這里根目錄的 utils 看起來像一堆散文件實際上是整套 YOLO 訓(xùn)練和推理的支撐庫。loss.py 定義損失函數(shù)augmentations.py 做數(shù)據(jù)增強(qiáng)包括 Mosaic、隨機(jī)仿射等策略metrics.py 負(fù)責(zé)計算 mAP、precision、recall 等指標(biāo)autoanchor.py 會在訓(xùn)練前自動掃描數(shù)據(jù)集重新計算適合你數(shù)據(jù)集的錨框尺寸general.py 是通用工具比如標(biāo)簽格式轉(zhuǎn)換、邊框格式轉(zhuǎn)換這類操作dataloaders.py 負(fù)責(zé)把數(shù)據(jù)集加載成訓(xùn)練批次plots.py 則在每個 epoch 后把訓(xùn)練曲線、混淆矩陣、標(biāo)簽分布圖等畫出來保存。對使用這套資源的人來說不需要把每個文件都讀透但有幾個文件的打開頻率會很高。plots.py 是制圖主力摘要里提到的“核心指標(biāo)曲線圖、混淆矩陣、F1 分?jǐn)?shù)曲線、精確率-召回率曲線、驗證集預(yù)測結(jié)果、標(biāo)簽分布圖”都來自它。訓(xùn)練完去 runs/train/exp 目錄找 results.png 和 confusion_matrix.png能直觀判斷模型在哪些類別上互相混淆。dataloaders.py 關(guān)系到數(shù)據(jù)加載速度如果訓(xùn)練時發(fā)現(xiàn) GPU 利用率拉不上去數(shù)據(jù)讀取線程數(shù)是這里調(diào)。autoanchor.py 則是新手最容易忽略的一環(huán)——換了自己的數(shù)據(jù)集錨框尺寸可能完全不適配讓它在訓(xùn)練前自動計算一輪比手動猜靠譜得多。還有一個容易誤解的文件是 callbacks.py。它負(fù)責(zé)在訓(xùn)練的不同階段觸發(fā)自定義邏輯比如日志記錄、模型保存等。如果你想讓訓(xùn)練中途做一次驗證或者保存最優(yōu)權(quán)重都是它管的。這套 utils 結(jié)構(gòu)只要動過一個文件就要注意其他文件是否依賴它的導(dǎo)出接口比如 general.py 里改了一個函數(shù)簽名可能連帶 plots.py 報錯改之前先用 grep 查一下調(diào)用關(guān)系。2.3 config 目錄與多模型對比RTMDet、Faster-RCNN、RTMPose 的角色config 目錄下有三個 OpenMMLab 風(fēng)格的配置rtmdet_m_8xb32-300e_coco.py、faster-rcnn_r50_fpn_2x_coco.py、rtmpose-m_8xb64-270e_coco-wholebody-256x192.py。這基本是畢設(shè)里常見的“多模型對比實驗”配置。用 RTMDet、Faster R-CNN 作為目標(biāo)檢測對比方案用 RTMPose 做姿態(tài)估計的輔助線索來證明 YOLOv8 在精度、速度和工程復(fù)雜度上的綜合優(yōu)勢。若你基礎(chǔ)足夠可以在這套配置基礎(chǔ)上跑對比實驗直接修改數(shù)據(jù)路徑和類別數(shù)就行不必從零搭環(huán)境。RTMPose 是人體姿態(tài)估計模型用于提取骨架關(guān)鍵點。門禁場景里單靠檢測框有時候分不清“人正常行走”和“人摔倒”這類狀態(tài)差異姿態(tài)關(guān)鍵點可以提供第二路線索。雖然推理主引擎是 YOLOv8但存在姿態(tài)線索輔助分析的設(shè)計意圖。所以你在寫課程設(shè)計報告時別只寫“我用 YOLOv8 做檢測”可以按“目標(biāo)檢測 姿態(tài)信息輔助”的框架來描述系統(tǒng)的整體技術(shù)路線。從工程角度看這套多模型配置還帶來一個好處答辯時就算被問到“你為什么不選 Faster R-CNN”你也可以直接回答“我對比過Faster R-CNN 在同等數(shù)據(jù)量下 mAP 接近但推理速度慢RTMDet 速度快但小目標(biāo)召回不如 YOLOv8”這就是一個完整的算法選型論證而不是空口說“大家都用 YOLO”。3. 部署運行從環(huán)境準(zhǔn)備到界面彈出的完整步驟3.1 環(huán)境準(zhǔn)備先把 torch 和 ultralytics 版本對準(zhǔn)部署這套項目第一步永遠(yuǎn)是環(huán)境。YOLOv8 的訓(xùn)練和推理基于 ultralytics 庫底層用 PyTorch。常見做法是創(chuàng)建一個獨立的 conda 環(huán)境Python 版本選 3.8 到 3.10 之間避免 3.11 以上某些依賴還沒跟上。torch 版本建議 2.0 以上ultralytics 選和模型權(quán)重生成時接近的版本避免權(quán)重加載時報“unexpected key”這類玄學(xué)錯誤。創(chuàng)建一個干凈的虛擬環(huán)境并安裝依賴conda create -n yolov8-door python3.9 conda activate yolov8-door pip install ultralytics torch torchvision --index-url https://download.pytorch.org/whl/cu118這段命令的關(guān)鍵點有兩個。第一ultralytics 和 torch 一起裝讓 pip 自動解析依賴關(guān)系第二--index-url 指定了 CUDA 11.8 版本的 torch 源如果你機(jī)器上的顯卡驅(qū)動支持更高版本也可以換成 cu121 或 cu124。裝完后先在命令行驗證python -c import torch; print(torch.__version__, torch.cuda.is_available())輸出里 cuda 那一項必須是 True否則后面訓(xùn)練一定跑不起來。這一步別省略很多同學(xué)卡在“代碼跑不了”半天最后發(fā)現(xiàn)是 torch 裝成了 CPU 版。如果這里輸出的 cuda 是 False原因通常是 torch 版本和顯卡驅(qū)動不匹配按你機(jī)器的驅(qū)動版本重新選擇 cu 版本即可。除了 torch 和 ultralytics常見依賴還有 opencv-python、numpy、matplotlib、pandas。ultralytics 安裝時會自動帶上一部分但 opencv 建議單獨裝版本較新的因為舊的 opencv 在某些視頻格式上會解碼失敗。安裝完依賴后可以把項目根目錄放進(jìn)一個全英文路徑比如 D:\yolov8-door避免后面讀取數(shù)據(jù)集時出現(xiàn)路徑編碼問題。3.2 權(quán)重文件怎么選best.pt、yolov8n.pt、yolo11n.pt 的分工資源包里自帶三個權(quán)重文件它們的用途完全不同。best.pt 是作者在自有數(shù)據(jù)集上訓(xùn)練好的最優(yōu)權(quán)重這個就是你做推理演示、跑可視化界面時應(yīng)該用的模型yolov8n.pt 是 ultralytics 官方預(yù)訓(xùn)練的 nano 版本權(quán)重適合從頭訓(xùn)練你自己的數(shù)據(jù)集時作為初始權(quán)重yolo11n.pt 是更新版的 YOLO11 家族權(quán)重如果你想把主干換成新版可以在訓(xùn)練時指定這個文件。三個文件的大小差異也大yolov8n.pt 大約 6MB 左右best.pt 取決于訓(xùn)練類別數(shù)通常十幾 MB。推理時優(yōu)先用 best.pt因為它見過項目數(shù)據(jù)集里的實際分布檢測類別和數(shù)量都是按門禁場景對齊的。如果你用 yolov8n.pt 直接推理大概率檢測結(jié)果里全是 COCO 的 80 類目標(biāo)而不是項目需要的類別這一點新手經(jīng)常踩坑。權(quán)重選擇的影響面比較大所以我習(xí)慣在啟動任何腳本前先看一眼 README.txt 里對權(quán)重路徑的約定。這個包里的 README.txt 是作者整理的部署說明里面通常會寫清楚默認(rèn)權(quán)重文件名和對應(yīng)的調(diào)用位置先讀兩分鐘能省下后面一小時的排查時間。3.3 啟動可視化界面main.py 的完整啟動方式環(huán)境就緒、權(quán)重就位后直接啟動主程序python main.py只要能正常彈出 UI 窗口且不報錯說明依賴環(huán)境和路徑都沒問題。界面設(shè)計上通常會有“選擇視頻/圖片”“開始檢測”“停止”這類按鈕以及實時顯示檢測結(jié)果的區(qū)域。檢測請求通過 UI 控件觸發(fā)底層再調(diào)用 five_type_det_service.py 完成推理再把結(jié)果傳回界面刷新幀。啟動失敗時先看命令行輸出的異常堆棧90% 的情況是下面三種一是模型路徑錯誤導(dǎo)致加載權(quán)重失敗二是某個依賴缺失比如 PyQt5 或者 opencv 沒有裝三是設(shè)備相關(guān)的問題比如電腦沒有可用 GPU代碼又強(qiáng)制指定了 cuda:0。如果是第三種把代碼里設(shè)備相關(guān)的參數(shù)改成 cpu 或者改到正確的 GPU 編號即可。我這里說的設(shè)備參數(shù)可以在 main.py 或 five_type_det_service.py 里搜 device 關(guān)鍵字找到。3.4 離線視頻檢測Detection_video.py 參數(shù)與驗證方法可視化界面適合演示批量驗證效果時我更推薦用 Detection_video.py。常見調(diào)用方式如下python Detection_video.py --source ./abnoenal_video_five_type_test/gB_9_s5_2019-03-07T16;31;4801;00_rgb_body_005.mp4 --weights best.pt --conf 0.5--source 指定視頻路徑--weights 指定權(quán)重文件--conf 是置信度閾值。置信度建議先設(shè) 0.5如果檢測框漏掉太多正樣本再往下降到 0.3如果誤檢太多就往上升到 0.7。大部分畢設(shè)場景下0.4 到 0.6 之間是相對穩(wěn)妥的范圍。視頻文件路徑里有分號和加號這類特殊字符在 Windows 命令行里記得用引號包住整個路徑否則會被解析成多個參數(shù)。檢測完成后腳本一般會在輸出目錄生成帶檢測框的視頻文件可以直接用播放器打開確認(rèn)效果。如果這一段落里生成的結(jié)果視頻正常說明整條推理鏈路已經(jīng)通了接下來可以放心地做訓(xùn)練和評估。4. 訓(xùn)練自己的數(shù)據(jù)集從標(biāo)簽整理到指標(biāo)曲線解讀4.1 數(shù)據(jù)集的目錄結(jié)構(gòu)images 與 labels 的對應(yīng)關(guān)系用 YOLOv8 訓(xùn)練自己的數(shù)據(jù)集第一步不是寫代碼而是把文件結(jié)構(gòu)擺好。最常見的組織方式是在項目根目錄建 dataset 文件夾里面按 train、val、test 劃分每個集合同時有 images 和 labels 兩個子目錄圖片和同名 txt 標(biāo)簽一一對應(yīng)。我給一個最小可用的目錄結(jié)構(gòu)作為參照dataset/ ├── train/ │ ├── images/ │ │ ├── img_001.jpg │ │ └── img_002.jpg │ └── labels/ │ ├── img_001.txt │ └── img_002.txt ├── val/ │ ├── images/ │ └── labels/ └── dataset.yamldataset.yaml 是 YOLO 訓(xùn)練的數(shù)據(jù)描述文件內(nèi)容一般長這樣path: ./dataset train: train/images val: val/images nc: 5 names: [class1, class2, class3, class4, class5]這里的 nc 必須和 labels 里的最大類別編號對齊。labels 的每一行是“類別編號 cx cy w h”四項數(shù)值都?xì)w一化到 0~1類別編號從 0 開始。如果某個 txt 里的編號是 4而 names 只有三項訓(xùn)練時就會報“標(biāo)簽越界”。這個 yaml 文件我一般會放在 dataset 目錄下而不是項目根目錄這樣 path 相對位置不容易寫錯。資源包自帶的數(shù)據(jù)集已經(jīng)是整理好的格式你直接訓(xùn)練不會遇到結(jié)構(gòu)問題。但如果是自己標(biāo)注務(wù)必用 labelImg 或 labelme 導(dǎo)出 YOLO 格式注意保存時圖片和 txt 文件名要完全一致。最容易犯的錯是標(biāo)完一張圖txt 文件被工具改名或放到了別的目錄導(dǎo)致訓(xùn)練時一張圖片對應(yīng)不到標(biāo)簽。4.2 啟動訓(xùn)練train_mode.py 的超參數(shù)與顯存調(diào)優(yōu)數(shù)據(jù)集就緒后用 train_mode.py 啟動訓(xùn)練。常見做法是先在命令行確認(rèn)幾個關(guān)鍵參數(shù)再執(zhí)行訓(xùn)練命令python train_mode.py --data dataset/dataset.yaml --weights yolov8n.pt --epochs 100 --batch-size 16 --imgsz 640 --device 0--epochs 是訓(xùn)練輪數(shù)畢設(shè)數(shù)據(jù)集規(guī)模通常幾百到幾千張100 輪足夠看到明顯收斂--batch-size 受顯存限制6GB 顯存跑 640 分辨率時 16 是常見值顯存不夠就降到 8 或 4--imgsz 是輸入分辨率訓(xùn)練 640推理也用 640不要訓(xùn)練 640 推理 320會造成性能波動--device 0 表示第一塊 GPU。訓(xùn)到一半想確認(rèn)進(jìn)度不一定要等訓(xùn)練結(jié)束。YOLO 訓(xùn)練過程會在 runs/train/exp 目錄下實時生成 results.png里面包含損失曲線、精確率、召回率、mAP 的變化圖。每個 epoch 結(jié)束時你都可以打開這個圖看趨勢如果 loss 已經(jīng)趨于平坦提前終止也不會影響最終權(quán)重。如果顯存確實不夠最常見的補(bǔ)救方式是混合精度訓(xùn)練和梯度累積。ultralytics 訓(xùn)練時可以加 amp 參數(shù)開啟混合精度或者減小 batch 同時增加訓(xùn)練輪數(shù)彌補(bǔ)。GTX 1660Ti 這類 6GB 顯存卡跑 yolov8n 是沒問題的只要不把 batch 和 imgsz 同時拉滿就不會出現(xiàn) CUDA out of memory。4.3 看懂訓(xùn)練產(chǎn)物混淆矩陣、F1曲線、PR曲線與驗證集預(yù)測訓(xùn)練結(jié)束時runs/train/exp 目錄下會有一批自動生成的圖表文件這些就是答辯時最好的效果證明材料。混淆矩陣展示每個真實類別被預(yù)測成哪個類別的比例對角線上越亮說明分類越準(zhǔn)F1 分?jǐn)?shù)曲線與精確率-召回率曲線則展示不同置信度閾值下的精度與召回權(quán)衡mAP50 是多數(shù)論文中報告的核心數(shù)值。review 這些圖表時有一個判斷技巧如果混淆矩陣?yán)飪蓚€類長期互相混淆比如 class1 大量被預(yù)測成 class2就要回到數(shù)據(jù)集里檢查這兩類樣本是否高度相似或者標(biāo)注框是否有大量重疊。如果 PR 曲線面積很小說明模型整體欠擬合優(yōu)先考慮增加訓(xùn)練輪數(shù)而不是調(diào)整閾值。若你不需要看這些圖表訓(xùn)練完直接拿 best.pt 去推理也可以但答辯時能展示這些圖說服力完全不一樣。驗證集預(yù)測結(jié)果通常也保存在 runs/detect 目錄我自己習(xí)慣挑三五張最具代表性的圖放在論文里一張正常場景、一張邊界案例、一張困難案例配上表格里的 mAP 數(shù)據(jù)就足以說明模型的泛化能力。5. 部署與訓(xùn)練踩坑實錄五個高頻問題及排查方法5.1 現(xiàn)象torch.cuda.is_available() 返回 False剛拿到源碼跑訓(xùn)練時最常遇到的情況代碼報“CUDA not available”但任務(wù)管理器里明明能看到顯卡。原因十有八九是 torch 版本與 CUDA 驅(qū)動不匹配更準(zhǔn)確地說torch 編譯時的 CUDA 版本高于你機(jī)器驅(qū)動支持的版本或者直接裝成了 CPU 版。解決方法是先查驅(qū)動支持的 CUDA 版本再安裝對應(yīng)版本的 torch。我一般用 nvidia-smi 查看驅(qū)動版本然后到 PyTorch 官網(wǎng)選擇對應(yīng) cu 版本的安裝命令裝完再驗證一次 torch.cuda.is_available()。這條檢查鏈我已經(jīng)形成肌肉記憶了。5.2 現(xiàn)象中文路徑導(dǎo)致界面啟動后加載不出數(shù)據(jù)Windows 下把項目放在“D:\項目\基于YOLOv8的智能門禁系統(tǒng)”這類目錄運行 main.py 時經(jīng)常報文件未找到或者界面打開后視頻列表是空的。原因是 OpenCV 和部分 Python 路徑處理庫對中文編碼支持不完整標(biāo)點符號和中文目錄名在讀取時會被轉(zhuǎn)成亂碼。解決方法是把整個項目移到純英文路徑比如 D:\yolov8-door-system并且保證數(shù)據(jù)集路徑、權(quán)重路徑都不含中文。這個坑在畢設(shè)答辯演示現(xiàn)場最容易翻車提前檢查一遍就能避免。5.3 現(xiàn)象顯存不足訓(xùn)練中途報 CUDA out of memory6GB 顯存跑 640 分辨率、batch-size 32 時訓(xùn)練到一半幾乎必崩。原因是模型權(quán)重、梯度、優(yōu)化器狀態(tài)和激活值都壓在顯存里batch 太大直接超出物理顯存。解決的次序是先把 batch-size 降到 8再把 imgsz 從 640 降到 512最后開啟混合精度。如果降完還是不夠檢查是否有其他進(jìn)程占用了 GPU用 nvidia-smi 查看顯存占用把后臺的訓(xùn)練腳本清理掉。5.4 現(xiàn)象訓(xùn)練時提示標(biāo)簽文件為空或類別編號越界自己標(biāo)注數(shù)據(jù)集的時候訓(xùn)練到一半報 AssertionError說某張圖片的標(biāo)簽文件找不到或者類別編號超過 nc。原因通常是標(biāo)注工具的導(dǎo)出格式不是 YOLO 格式或者導(dǎo)出后 txt 文件是空的。解決方法是先抽幾個 txt 文件檢查內(nèi)容每行必須是“class_id x_center y_center width height”五個數(shù)值類別編號從 0 開始且小于 yaml 里的 nc。用 labelImg 重新導(dǎo)出一份 YOLO 格式并且掃一遍標(biāo)簽?zāi)夸浿形募笮榱愕?txt刪掉對應(yīng)圖片或補(bǔ)標(biāo)。還有一個常見連帶問題標(biāo)簽文件放置目錄不匹配檢查 images/labels 的目錄層級是否和 dataset.yaml 里 path 規(guī)則一致。5.5 現(xiàn)象視頻檢測結(jié)果沒有畫框或保存失敗Detection_video.py 跑完后輸出視頻里沒有檢測框或者直接提示保存路徑不存在。原因分兩類一是權(quán)重路徑寫錯加載成了預(yù)訓(xùn)練權(quán)重檢測出的類別和項目類別不一致二是輸出目錄不存在腳本又沒有自動創(chuàng)建目錄。解決方法是檢查命令行里 --weights 是否指向 best.pt 而不是 yolov8n.pt同時在腳本里搜 output 相關(guān)代碼確保輸出目錄存在且有寫權(quán)限。這類問題通常不是算法問題而是腳本參數(shù)的細(xì)節(jié)排查時優(yōu)先看日志是否打印了置信度結(jié)果。如果打印了一堆檢測框但視頻沒有框再看畫框函數(shù)是否被條件判斷跳過。6. 進(jìn)階把 YOLOv8 門禁模型部署到 RK3588 邊緣設(shè)備6.1 模型導(dǎo)出與 RKNN 格式轉(zhuǎn)換如果你不滿足于跑電腦端的演示可以把這套模型移植到 RK3588 這種帶 NPU 的邊緣設(shè)備上這是當(dāng)前做落地方案的趨勢也是畢設(shè)答辯的加分項。先在 PC 端把 best.pt 導(dǎo)出為 ONNXyolo export modelbest.pt formatonnx opset12導(dǎo)出時指定 opset12 是為了兼容 RKNN-Toolkit2 的解析能力。然后使用 RKNN-Toolkit2 把 ONNX 轉(zhuǎn)換成 RKNN 格式量化方式一般用 int8因為 NPU 對 int8 算子的支持最完整。轉(zhuǎn)換腳本核心邏輯大致是讀入 ONNX、配置量化數(shù)據(jù)集、執(zhí)行轉(zhuǎn)換并導(dǎo)出 .rknn 文件。搞到 RK3588 板子上之后推理邏輯與 PC 端基本一致加載 .rknn 模型傳入經(jīng)過同樣預(yù)處理letterbox、歸一化的圖像拿到檢測框后做后處理。需要注意的是板端 NPU 對輸入尺寸有固定約束例如要求長寬為 16 的倍數(shù)因此預(yù)處理時要把圖像 resize 到符合約束的尺寸而不是隨意設(shè)一個分辨率。6.2 邊緣部署的三個驗證步驟部署到板子后不要急著接攝像頭先用三段驗證把鏈路打通第一步用單張圖片推理確認(rèn)檢測框位置和 PC 端一致第二步用一段測試視頻推理確認(rèn)幀率至少達(dá)到實時或準(zhǔn)實時要求第三步再接入攝像頭流或 RTSP 流檢查連續(xù)運行穩(wěn)定性和內(nèi)存占用。int8 量化后精度通常會有幾個百分點的下降如果門禁場景對精度要求高可以先做混合量化只把部分層保留為 fp16。從那以后我每次部署邊緣設(shè)備都強(qiáng)制先走一遍“導(dǎo)出 ONNX → 轉(zhuǎn) RKNN → 板端跑圖驗證”的完整流程不再跳過中間步驟直達(dá)攝像頭踩了幾次坑之后發(fā)現(xiàn)的規(guī)律希望幫到你。本文還有配套的精品資源點擊獲取