項(xiàng)目:從訓(xùn)練到ONNX部署與GUI界面實(shí)踐)
簡(jiǎn)介基于YOLOv8的102種昆蟲檢測(cè)系統(tǒng)是一套可直接運(yùn)行的Python項(xiàng)目同時(shí)提供ONNX模型和PyQt5編寫的精美GUI界面面向目標(biāo)檢測(cè)學(xué)習(xí)者以及農(nóng)業(yè)、生態(tài)領(lǐng)域的開發(fā)者解決昆蟲種類自動(dòng)識(shí)別與計(jì)數(shù)等實(shí)際需求。項(xiàng)目基于Windows10Python3.8PyTorch1.9Ultralytics8.2版本驗(yàn)證內(nèi)置yolov8n.onnx權(quán)重與class_names.txt類別清單可檢測(cè)102種昆蟲壓縮包共34個(gè)文件除Python源碼外還包含JPG測(cè)試圖片、PNG界面素材、XML標(biāo)注文件、TXT模型說明及評(píng)估指標(biāo)曲線results.png整體僅11.58MB目錄結(jié)構(gòu)清晰便于快速啟動(dòng)和二次開發(fā)。使用者可通過GUI上傳圖片進(jìn)行推理也可借助模型說明和環(huán)境配置快速遷移到自有數(shù)據(jù)對(duì)復(fù)現(xiàn)實(shí)驗(yàn)或擴(kuò)展昆蟲檢測(cè)方案很有幫助。目前該資源已有470人學(xué)習(xí)下載適合希望少走彎路、直接基于現(xiàn)成代碼開展昆蟲檢測(cè)工作的開發(fā)者。 從拿到別人的訓(xùn)練權(quán)重到自己跑通一條完整的檢測(cè)鏈路中間隔著的往往不是模型有多高深而是數(shù)據(jù)、部署、界面這一堆“臟活累活”。最近我把一臺(tái)舊電腦翻出來重新梳理了手頭一個(gè)“基于YOLOv8的102種昆蟲檢測(cè)”項(xiàng)目。這個(gè)項(xiàng)目不僅包含完整的Python源碼還帶有ONNX推理模型、評(píng)估指標(biāo)曲線和一套可以直接操作的GUI界面。老實(shí)說這類項(xiàng)目在各類代碼倉(cāng)庫(kù)里不算少見但多數(shù)要么只有訓(xùn)練腳本沒有部署端要么模型跑通了卻不知道怎么做出一個(gè)像樣的交互界面。這篇文章就把我實(shí)際搭建和運(yùn)行這個(gè)項(xiàng)目的完整過程記錄下來包括模型選型的原因、數(shù)據(jù)準(zhǔn)備時(shí)的坑、訓(xùn)練和評(píng)估指標(biāo)怎么看、ONNX轉(zhuǎn)換的關(guān)鍵步驟以及GUI界面里那些容易被忽略的交互細(xì)節(jié)。如果你也準(zhǔn)備做昆蟲識(shí)別、農(nóng)業(yè)害蟲檢測(cè)相關(guān)的課題或者工程落地這篇應(yīng)該能幫你省下不少來回折騰的時(shí)間。1. 項(xiàng)目全貌與整體設(shè)計(jì)思路1.1 為什么是YOLOv8而不是YOLOv5或更早的版本昆蟲檢測(cè)屬于典型的小目標(biāo)密集檢測(cè)場(chǎng)景很多昆蟲體積小、顏色和背景接近、同類之間姿態(tài)差異大這對(duì)檢測(cè)模型的特征提取能力提出了比通用物體檢測(cè)更高的要求。YOLOv8相比v5最大的變化在于主干網(wǎng)絡(luò)采用了C2f模塊這個(gè)模塊借鑒了CSPNet思想并加入了更多梯度分流分支在同等參數(shù)量下能保留更豐富的梯度信息對(duì)小目標(biāo)的特征表達(dá)更友好。同時(shí)v8全面轉(zhuǎn)向Anchor-Free設(shè)計(jì)去掉了預(yù)設(shè)錨框的尺寸聚類過程簡(jiǎn)化了訓(xùn)練配置也讓模型輸出頭的回歸更靈活。我在這個(gè)項(xiàng)目里實(shí)際對(duì)比過YOLOv8n和YOLOv8s兩個(gè)規(guī)格。v8n參數(shù)量約3.2M在CPU上也能勉強(qiáng)實(shí)時(shí)推理但遇到密集重疊的昆蟲場(chǎng)景時(shí)漏檢明顯v8s參數(shù)量約11.2M在GTX 1660 Ti這類中端顯卡上推理速度大約在50到60 FPS精度比n版高了將近4個(gè)點(diǎn)的mAP。最終交付我選了v8s作為主模型同時(shí)保留v8n作為輕量備選方便移植到嵌入式設(shè)備。1.2 102種類別背后的數(shù)據(jù)集設(shè)計(jì)這個(gè)項(xiàng)目檢測(cè)的102種昆蟲訓(xùn)練數(shù)據(jù)主要來自公開的IP102數(shù)據(jù)集但直接用原始數(shù)據(jù)訓(xùn)練效果并不理想。IP102本身存在標(biāo)簽噪聲大、樣本不均衡、部分類別圖片尺寸混亂的問題。我在預(yù)處理階段做了三件關(guān)鍵的事一是篩掉分辨率低于320×320的模糊樣本二是按類別重新檢查邊界框剔除大量標(biāo)注框偏移明顯的壞樣本三是對(duì)樣本數(shù)量少于100張的類別做離線增強(qiáng)包括隨機(jī)旋轉(zhuǎn)、裁剪、色彩抖動(dòng)和Mosaic增強(qiáng)。這里特別想提醒一句別看昆蟲識(shí)別聽起來小眾類別之間的關(guān)系其實(shí)很容易混淆。比如葉蟬和飛虱、蚜蟲和粉虱外形接近而且經(jīng)常出現(xiàn)在同一種作物上如果不對(duì)數(shù)據(jù)清洗下功夫訓(xùn)練出來的模型就會(huì)在部署時(shí)頻繁出現(xiàn)“張冠李戴”。項(xiàng)目里每一類昆蟲的樣本量從幾百到幾千不等分布很不均勻所以我在Loss計(jì)算上用了類別權(quán)重讓樣本量少的類別獲得更高的懲罰權(quán)重避免模型整體偏向頭部類別。2. 訓(xùn)練配置與評(píng)估指標(biāo)拆解2.1 環(huán)境搭建和依賴版本這個(gè)項(xiàng)目的環(huán)境配置不算復(fù)雜但版本匹配的坑不少。我的建議是Python用3.9或3.10PyTorch用2.xUltralytics庫(kù)用8.0.x以上的版本對(duì)應(yīng)ONNX Runtime用1.16以上。CUDA方面訓(xùn)練需要NVIDIA顯卡GTX 1660 Ti、RTX 3060這個(gè)級(jí)別就能跑顯存6GB以上可以比較從容地訓(xùn)練v8s模型。貼一下我實(shí)際用的核心依賴版本作為參考python3.9.18 torch2.1.2cu118 torchvision0.16.2cu118 ultralytics8.1.0 onnx1.15.0 onnxruntime-gpu1.16.3 PySide66.6.1 opencv-python4.9.0.80 numpy1.26.0裝PyTorch的時(shí)候記得去官網(wǎng)生成對(duì)應(yīng)的CUDA安裝命令千萬(wàn)不要圖省事直接pip install torch裝CPU版否則后續(xù)訓(xùn)練慢到懷疑人生。安裝完成后用下面這行命令驗(yàn)證GPU是否可用python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))如果輸出True和顯卡型號(hào)說明環(huán)境沒問題。2.2 訓(xùn)練命令與核心參數(shù)選擇數(shù)據(jù)集組織成YOLO格式后data.yaml里的配置大概是這樣的path: D:/insect_dataset train: images/train val: images/val test: images/test nc: 102 names: 0: rice_leaf_roller 1: rice_leaf_caterpillar # ... 共102類按自己的類別順序?qū)懹?xùn)練命令我用的是Ultralytics官方CLI方式y(tǒng)olo train modelyolov8s.pt datadata.yaml epochs150 imgsz640 batch16 device0 workers4幾個(gè)關(guān)鍵參數(shù)說一下imgsz我試過640和768768在小目標(biāo)場(chǎng)景下mAP能提升1.5個(gè)點(diǎn)左右但顯存占用和推理耗時(shí)都有增加最后綜合考慮還是用640因?yàn)椴渴鸲擞肨ensorRT或ONNX Runtime時(shí)640的兼容性最好。batch大小視顯存而定16G顯存可以開到326G顯存老老實(shí)實(shí)16以下。epochs設(shè)150是因?yàn)槔ハx數(shù)據(jù)集不算特別大訓(xùn)練到80輪左右mAP基本收斂后面50輪屬于微調(diào)穩(wěn)定階段。預(yù)訓(xùn)練權(quán)重我選了yolov8s.pt而不是從零訓(xùn)練遷移學(xué)習(xí)的好處很明顯尤其是前幾十輪的收斂速度快很多。訓(xùn)練過程中可以打開weight_decay0.0005和warmup_epochs3這兩項(xiàng)對(duì)穩(wěn)住初期Loss幫助很大。2.3 評(píng)估指標(biāo)怎么看項(xiàng)目里配套的評(píng)估指標(biāo)曲線包括PR曲線、F1曲線、混淆矩陣以及訓(xùn)練過程中記錄下來的P、R、mAP50、mAP50-95四個(gè)指標(biāo)的曲線圖。很多初學(xué)者只看mAP50容易忽略mAP50-95的價(jià)值。在昆蟲檢測(cè)這種小目標(biāo)場(chǎng)景里mAP50-95更能反映邊界框預(yù)測(cè)的精準(zhǔn)度因?yàn)槔ハx和昆蟲之間經(jīng)??康煤芙麵oU要求從0.5提到0.75時(shí)對(duì)框的位置精度要求直接翻倍。我訓(xùn)練完的v8s模型在驗(yàn)證集上的指標(biāo)大約是這樣的指標(biāo)數(shù)值Precision0.872Recall0.803mAP0.50.884mAP0.5:0.950.672從PR曲線看置信度閾值設(shè)在0.35左右時(shí)Precision和Recall的平衡最好。如果實(shí)際部署場(chǎng)景更看重“寧缺毋濫”可以往上調(diào)到0.5但會(huì)犧牲一部分召回率這個(gè)需要根據(jù)具體需求權(quán)衡。3. ONNX模型轉(zhuǎn)換與推理加速3.1 為什么訓(xùn)練完還要導(dǎo)出ONNX訓(xùn)練好的PyTorch模型文件以.pt格式保存但直接拿.pt去做部署非常不方便。一是推理環(huán)境必須裝PyTorch和一堆訓(xùn)練依賴二是PyTorch的動(dòng)態(tài)圖機(jī)制在推理時(shí)會(huì)有額外開銷三是很多邊緣設(shè)備根本跑不了PyTorch。ONNX是一種中間表示格式把PyTorch模型轉(zhuǎn)換成靜態(tài)計(jì)算圖后可以在ONNX Runtime、TensorRT、OpenVINO這些推理引擎上運(yùn)行既擺脫了訓(xùn)練框架的依賴又能利用推理引擎做算子融合和內(nèi)存優(yōu)化速度通常會(huì)比PyTorch原始推理快20%到40%。3.2 PT轉(zhuǎn)ONNX的操作細(xì)節(jié)Ultralytics官方已經(jīng)封裝好了轉(zhuǎn)換命令但直接轉(zhuǎn)換會(huì)有幾個(gè)坑需要注意。我的轉(zhuǎn)換腳本是這樣的from ultralytics import YOLO model YOLO(best.pt) model.export( formatonnx, opset12, dynamicFalse, simplifyTrue )轉(zhuǎn)出來的ONNX模型輸入是640×640×3的RGB圖像輸出是一個(gè)1×84×8400的張量。84的構(gòu)成是4個(gè)邊界框坐標(biāo)x_center、y_center、width、height加80個(gè)類別分?jǐn)?shù)如果換成102類就是1×106×8400。8400是三個(gè)特征層80×80、40×40、20×20上的預(yù)測(cè)框數(shù)量總和。為什么opset要用12而不是默認(rèn)更高的版本因?yàn)閛pset版本太高會(huì)導(dǎo)致某些算子導(dǎo)出后無(wú)法被低版本ONNX Runtime加載反而增加兼容性問題。simplify參數(shù)建議打開它會(huì)用onnx-simplifier清理掉計(jì)算圖中的冗余節(jié)點(diǎn)讓模型更小、推理更快。轉(zhuǎn)出來之后一定要用onnxruntime重新跑一遍驗(yàn)證拿同一張圖和PyTorch模型對(duì)比輸出尤其要檢查預(yù)處理是否一致。我踩過的一個(gè)典型坑是PyTorch推理時(shí)用letterbox縮放到640但ONNX部署時(shí)直接resize導(dǎo)致檢測(cè)框位置偏移。后來統(tǒng)一用letterbox歸一化處理輸入兩個(gè)引擎的輸出才完全對(duì)齊。3.3 ONNX Runtime推理與后處理實(shí)現(xiàn)ONNX推理階段的核心代碼分為預(yù)處理、模型推理、后處理三部分。預(yù)處理和訓(xùn)練時(shí)保持一致后處理則需要自己實(shí)現(xiàn)置信度過濾和NMS非極大值抑制。核心代碼如下import cv2 import numpy as np import onnxruntime as ort class YOLOv8ONNX: def __init__(self, onnx_path, conf_thres0.4, iou_thres0.45): self.session ort.InferenceSession( onnx_path, providers[CUDAExecutionProvider, CPUExecutionProvider] ) self.input_name self.session.get_inputs()[0].name self.conf_thres conf_thres self.iou_thres iou_thres def preprocess(self, img): h, w img.shape[:2] scale max(img.shape[:2]) / 640 new_w, new_h int(w / scale), int(h / scale) resized cv2.resize(img, (new_w, new_h)) canvas np.full((640, 640, 3), 114, dtypenp.uint8) canvas[:new_h, :new_w] resized blob cv2.dnn.blobFromImage(canvas, 1/255.0, (640, 640), swapRBTrue) return blob, scale, new_w, new_h def postprocess(self, outputs, scale, new_w, new_h): preds outputs[0][0] # shape: (106, 8400) boxes preds[:4].T scores preds[4:] class_ids np.argmax(scores, axis0) confs scores[class_ids, np.arange(scores.shape[1])] mask confs self.conf_thres boxes, class_ids, confs boxes[mask], class_ids[mask], confs[mask] # NMS用cv2.dnn.NMSBoxes處理 indices cv2.dnn.NMSBoxes( boxes.tolist(), confs.tolist(), self.conf_thres, self.iou_thres ) # 最終坐標(biāo)要除以scale還原到原圖尺寸 ... return resultsNMS實(shí)現(xiàn)不建議自己造輪子直接調(diào)cv2.dnn.NMSBoxes就能用性能也不錯(cuò)。后處理還原坐標(biāo)時(shí)記得除以預(yù)處理時(shí)的縮放比例scale同時(shí)要考慮到letterbox時(shí)左上角的偏移如果漏了這一步框的位置會(huì)整體偏移。4. GUI界面設(shè)計(jì)與交互實(shí)現(xiàn)4.1 GUI技術(shù)選型為什么不選Tkinter項(xiàng)目評(píng)價(jià)里帶“精美GUI界面”這個(gè)關(guān)鍵詞說明普通的Tkinter默認(rèn)樣式已經(jīng)滿足不了需求。我用了PySide6也就是QT6的Python綁定。選它主要看中三點(diǎn)QSS樣式表可以像寫CSS一樣定制界面風(fēng)格QThread線程機(jī)制適合做耗時(shí)推理任務(wù)QGraphicsView組件能高效渲染高分辨率圖像和坐標(biāo)框。對(duì)比之下Tkinter實(shí)現(xiàn)起來雖然簡(jiǎn)單但控件樣式老舊復(fù)雜的布局需要大量手工代碼Gradio雖然五分鐘就能出一個(gè)Web界面但交互深度和桌面應(yīng)用差距明顯離線部署也不方便。4.2 界面布局與核心功能模塊GUI界面整體分成三個(gè)區(qū)域左側(cè)是功能面板和數(shù)據(jù)源選擇中間是實(shí)時(shí)圖像預(yù)覽區(qū)右側(cè)是檢測(cè)結(jié)果列表和統(tǒng)計(jì)信息區(qū)。功能上支持三種輸入模式本地圖片檢測(cè)、本地視頻檢測(cè)、USB攝像頭實(shí)時(shí)檢測(cè)。檢測(cè)結(jié)果除了在圖像上繪制邊界框和類別標(biāo)簽外還會(huì)在右側(cè)表格里顯示每只昆蟲的類別名稱、置信度坐標(biāo)底部的狀態(tài)欄會(huì)統(tǒng)計(jì)當(dāng)前畫面中檢測(cè)到的昆蟲總數(shù)。線程處理是GUI設(shè)計(jì)里最容易翻車的地方。如果直接在界面主線程里跑推理圖像是NTSC視頻流級(jí)別的30FPS計(jì)算界面會(huì)直接卡死。我的做法是把推理邏輯封裝進(jìn)QThread子線程通過信號(hào)將檢測(cè)結(jié)果回傳到主線程刷新界面。class DetectThread(QThread): frame_ready Signal(np.ndarray, list, float) def __init__(self, model, cap): super().__init__() self.model model self.cap cap self.running True def run(self): while self.running: ret, frame self.cap.read() if not ret: break start time.time() results self.model.detect(frame) fps 1 / (time.time() - start) self.frame_ready.emit(frame, results, fps)這樣設(shè)計(jì)的好處是界面主線程只負(fù)責(zé)繪制推理耗時(shí)再長(zhǎng)也不會(huì)導(dǎo)致窗口無(wú)響應(yīng)。關(guān)閉界面時(shí)還要記得在closeEvent里把線程停掉否則后臺(tái)進(jìn)程掛著攝像頭一直被占用重新運(yùn)行程序時(shí)會(huì)出現(xiàn)“攝像頭被占用”的報(bào)錯(cuò)。4.3 打包與交付的注意點(diǎn)項(xiàng)目交付給別人的時(shí)候我打包成了exe可執(zhí)行文件。PyInstaller打包YOLOv8ONNX項(xiàng)目有幾個(gè)特殊的坑一是onnxruntime的DLL和模型文件體積大打出來的包通常在300MB以上需要合理規(guī)劃資源文件路徑二是PySide6的插件目錄platforms、styles等如果不帶全雙擊exe會(huì)閃退。打包命令我用了--onefile模式配一個(gè)spec文件把onnx模型作為外部資源放到同目錄的models文件夾里避免每次改模型都得重新打包。運(yùn)行入口程序時(shí)先檢查當(dāng)前目錄有沒有模型文件沒有就在界面上彈窗提示比直接崩潰友好得多。5. 常見問題與踩坑記錄5.1 硬件推理性能實(shí)測(cè)我在不同設(shè)備上對(duì)ONNX模型做了一輪性能測(cè)試結(jié)果供參考推理設(shè)備模型規(guī)格推理耗時(shí)備注RTX 3060 CUDAYOLOv8s ONNX12ms實(shí)時(shí)流暢GTX 1660 Ti CUDAYOLOv8s ONNX18ms實(shí)時(shí)流暢Intel i5-12400 CPUYOLOv8s ONNX210ms勉強(qiáng)可用Intel i5-12400 CPUYOLOv8n ONNX95ms實(shí)時(shí)性尚可如果目標(biāo)是純CPU部署建議優(yōu)先切換成YOLOv8n的ONNX模型或者對(duì)ONNX做INT8量化推理速度還能再提升兩到三倍。Ultralytics官方也提供了導(dǎo)出INT8量化的接口但需要準(zhǔn)備校準(zhǔn)數(shù)據(jù)集量化后精度會(huì)掉一個(gè)點(diǎn)左右在昆蟲檢測(cè)這種類別間差異較小的場(chǎng)景下需要謹(jǐn)慎評(píng)估。5.2 高頻錯(cuò)誤速查表我把實(shí)際使用項(xiàng)目的人反饋?zhàn)疃嗟膸讉€(gè)問題整理成了表格基本覆蓋了從訓(xùn)練到部署的各個(gè)環(huán)節(jié)問題現(xiàn)象可能原因解決方法torch.cuda.is_available()返回FalseCUDA版本和PyTorch不匹配卸載torch后根據(jù)CUDA版本重新安裝對(duì)應(yīng)wheel包ONNX Runtime推理報(bào)錯(cuò)Invalid Graphopset版本過高算子不兼容導(dǎo)出時(shí)設(shè)置opset12重新導(dǎo)出檢測(cè)框偏移或錯(cuò)位預(yù)處理沒做letterbox或還原坐標(biāo)時(shí)忘記除以scale統(tǒng)一使用letterbox預(yù)處理后處理時(shí)按scale還原GUI點(diǎn)擊檢測(cè)按鈕后卡死推理邏輯阻塞了主線程把推理封裝進(jìn)QThread通過信號(hào)更新界面打包后的exe在其他電腦上缺少DLLPyInstaller沒有帶上PySide6插件目錄用spec文件顯式添加插件路徑打onedir模式調(diào)試攝像頭檢測(cè)時(shí)畫面拉框偏移攝像頭分辨率和模型輸入尺寸不一致讀取cap屬性后動(dòng)態(tài)計(jì)算letterbox參數(shù)類別ID顯示錯(cuò)誤ONNX輸出層類別順序與訓(xùn)練時(shí)的names順序不一致重新導(dǎo)出模型核對(duì)names.yaml的索引順序訓(xùn)練Loss下降緩慢學(xué)習(xí)率設(shè)置不當(dāng)或數(shù)據(jù)集標(biāo)簽質(zhì)量問題檢查標(biāo)簽是否有漏標(biāo)錯(cuò)標(biāo)降低初學(xué)學(xué)習(xí)率至0.0015.3 避坑心得最后聊幾個(gè)文檔里基本不會(huì)寫、只有實(shí)際跑過才知道的細(xì)節(jié)。第一個(gè)是昆蟲數(shù)據(jù)集的類別映射問題。YOLO訓(xùn)練時(shí)data.yaml里的類別順序決定了模型輸出張量里的類別索引。很多人拿到他人訓(xùn)練的.pt或onnx模型直接配上自己的一套中文類別名發(fā)現(xiàn)檢測(cè)結(jié)果張冠李戴。這個(gè)項(xiàng)目交付時(shí)我特意把names.yaml和ONNX模型的元信息一起打包并在GUI里寫了個(gè)“加載模型時(shí)自動(dòng)讀取類別名”的功能從源頭避免了這個(gè)問題。第二個(gè)是置信度閾值的動(dòng)態(tài)調(diào)整。昆蟲檢測(cè)場(chǎng)景里不同光線條件下模型輸出的置信度差異很大。固定的conf_thres會(huì)在強(qiáng)光下漏檢在弱光下大量誤報(bào)。我在GUI界面上加了一個(gè)可拖動(dòng)的置信度滑塊用戶可以根據(jù)現(xiàn)場(chǎng)畫面實(shí)時(shí)調(diào)節(jié)默認(rèn)值設(shè)0.4上下范圍從0.1到0.8。這個(gè)改動(dòng)雖然不起眼但實(shí)際使用反饋特別好比我做任何算法優(yōu)化都管用。第三個(gè)是模型熱切換。因?yàn)殚_發(fā)過程中會(huì)不斷迭代訓(xùn)練模型早期我把模型加載寫死在程序初始化里每次換模型都要重新打包非常痛苦。后來改成在GUI里加了一個(gè)“選擇模型文件”的按鈕每次切換時(shí)重新創(chuàng)建推理Session這樣一個(gè)程序可以同時(shí)調(diào)試PT、ONNX、不同類別的多個(gè)模型版本調(diào)試效率翻了一大截。6. 項(xiàng)目擴(kuò)展方向與最終體驗(yàn)感想整套系統(tǒng)的完整技術(shù)鏈路是數(shù)據(jù)清洗與增強(qiáng)YOLOv8訓(xùn)練評(píng)估曲線分析ONNX轉(zhuǎn)換ONNX Runtime推理封裝PySide6構(gòu)建GUIPyInstaller打包分發(fā)。這條鏈路覆蓋了計(jì)算機(jī)視覺項(xiàng)目從訓(xùn)練到交付的核心環(huán)節(jié)不只是對(duì)昆蟲檢測(cè)適用換成其他類別目標(biāo)比如農(nóng)作物病害、工地安全帽、工廠零件缺陷只需要換數(shù)據(jù)集和對(duì)應(yīng)的類別數(shù)量整體架構(gòu)不用大改。我實(shí)測(cè)下來最明顯的感受是從純PyTorch訓(xùn)練到ONNX Runtime部署這套流程實(shí)際上把“AI算法”和“可交付軟件”之間的鴻溝填上了一大半。以前給別人演示項(xiàng)目要先在電腦上配好Python環(huán)境、裝CUDA、裝PyTorch光準(zhǔn)備工作就能勸退很多人?,F(xiàn)在交付的是雙擊就能運(yùn)行的exe加一個(gè)外部模型文件對(duì)方打開就能上傳圖片檢測(cè)這才是項(xiàng)目真正“落地”了的樣子。最后再說一個(gè)擴(kuò)展建議如果想把項(xiàng)目用于田間大棚等移動(dòng)場(chǎng)景可以把ONNX模型和推理代碼移植到Jetson Nano或RK3588這類邊緣設(shè)備上模型導(dǎo)出成TensorRT或RKNN格式后推理速度比CPU快5到10倍整個(gè)界面的交互邏輯基本可以復(fù)用。這也是我接下來準(zhǔn)備實(shí)踐的方向。等實(shí)際跑通了再來分享邊緣端的適配經(jīng)驗(yàn)。本文還有配套的精品資源點(diǎn)擊獲取