別系統(tǒng):從數(shù)據(jù)集訓(xùn)練到PyQt5部署實(shí)踐)
做道路隱患識(shí)別這個(gè)項(xiàng)目最初的出發(fā)點(diǎn)很樸素城市道路管理的巡檢工作強(qiáng)度大、死角多單靠人工掃街式巡查漏檢率其實(shí)相當(dāng)高。而基于YOLOv8的道路隱患識(shí)別與城市路況安全識(shí)別系統(tǒng)正好可以把這個(gè)流程自動(dòng)化——把攝像頭或巡檢車采集的畫面交給模型實(shí)時(shí)分析自動(dòng)框出坑洼、裂縫、破損井蓋、異物等隱患目標(biāo)再配上PyQt5桌面界面讓非算法背景的巡檢人員也能直接點(diǎn)開就用。這篇文章就圍繞這套系統(tǒng)的完整落地過程展開從數(shù)據(jù)集建設(shè)、模型訓(xùn)練到PyQt5界面封裝和打包部署把每一步的關(guān)鍵決策和踩坑點(diǎn)都攤開來講。不管是想復(fù)現(xiàn)這套方案還是打算在類似的視覺檢測項(xiàng)目里找思路這篇都值得花幾分鐘讀完。1. 項(xiàng)目定位與方案選型為什么是YOLOv8加PyQt51.1 道路隱患識(shí)別到底在解決什么問題道路隱患識(shí)別聽起來是個(gè)很泛的概念實(shí)際上落到工程上需求非常具體。一類是路面結(jié)構(gòu)類問題比如坑洼、裂縫、井蓋破損、路面積水另一類是環(huán)境與設(shè)施類問題比如施工區(qū)域未圍擋、路障倒伏、交通標(biāo)志損壞、路面散落異物。這些目標(biāo)尺寸差異極大小到十幾厘米的裂縫大到幾米寬的施工區(qū)而且在真實(shí)場景里往往受到光照、陰影、遮擋的干擾這對檢測模型的魯棒性要求非常高。從應(yīng)用角度看這套系統(tǒng)最常見的落地形態(tài)有三種巡檢車錄制視頻后批量分析、固定點(diǎn)位攝像頭實(shí)時(shí)監(jiān)測、以及用行車記錄儀或手機(jī)拍攝的照片做單張研判。我做的這個(gè)項(xiàng)目把這三種輸入方式全部納入支持范圍模型推理和界面操作統(tǒng)一封裝本質(zhì)上就是“一個(gè)模型服務(wù)多個(gè)入口”的架構(gòu)。為什么要做這個(gè)系統(tǒng)而不直接用商業(yè)方案核心原因是成本與定制問題。市面上的道路檢測平臺(tái)要么按年收費(fèi)偏高要么對特定隱患類別的識(shí)別能力不匹配。自建一套YOLOv8方案數(shù)據(jù)完全可控、類別可以隨時(shí)增刪、同時(shí)能夠離線部署到巡檢終端上這在項(xiàng)目交付和后續(xù)擴(kuò)展上都有明顯優(yōu)勢。1.2 選型思考模型框架與界面方案的取舍模型這塊我直接選了YOLOv8沒有糾結(jié)。原因有三條第一YOLOv8在速度和精度的平衡上做得相當(dāng)成熟對于道路隱患這種需要實(shí)時(shí)反饋的場景推理幀率必須壓得住第二它的訓(xùn)練、驗(yàn)證、導(dǎo)出流程高度一體化一條命令就能完成數(shù)據(jù)訓(xùn)練到模型導(dǎo)出的完整鏈路工程效率高第三它內(nèi)置了多種數(shù)據(jù)增強(qiáng)策略和優(yōu)化器調(diào)度策略默認(rèn)配置已經(jīng)能跑出不錯(cuò)的基線效果后續(xù)再針對具體類別做優(yōu)化。補(bǔ)充一個(gè)對比點(diǎn)有人可能會(huì)問為什么不選YOLOv5或者更輕量的方案YOLOv8相比之下主干網(wǎng)絡(luò)換成了C2f結(jié)構(gòu)特征提取能力更強(qiáng)同時(shí)檢測頭采用anchor-free設(shè)計(jì)省去了大量anchor超參的調(diào)參工作。對于坑洼、裂縫這類形狀不規(guī)則的目標(biāo)anchor-free的回歸方式更友好。實(shí)際訓(xùn)練時(shí)我也發(fā)現(xiàn)相同epoch下YOLOv8的收斂速度比v5快一截。界面這塊選PyQt5核心考量是“離線可用、開箱即用”。用Web方案就得搭后端、管理瀏覽器環(huán)境對于部署在巡檢車或者街道辦電腦上的場景來說太笨重。PyQt5直接做成桌面程序雙擊啟動(dòng)讀取攝像頭或者視頻文件就能出結(jié)果不需要額外安裝依賴。而且PyQt5的QThread多線程機(jī)制和OpenCV配合很順暢能把推理任務(wù)丟到后臺(tái)線程界面保持流暢這點(diǎn)對實(shí)時(shí)預(yù)覽尤其重要。2. 數(shù)據(jù)集建設(shè)與標(biāo)注規(guī)范識(shí)別效果的天花板在這里2.1 隱患類別定義與樣本收集策略這個(gè)項(xiàng)目里我把道路隱患分成7個(gè)核心類別坑洼、裂縫、井蓋破損、路面積水、施工區(qū)域、路障/錐筒、路面散落物。為什么定這7類因?yàn)樗鼈兪浅鞘械缆费矙z中訴求最集中、樣本相對容易獲取的目標(biāo)。類別定義這事非常關(guān)鍵類別太粗模型學(xué)不到區(qū)分度類別太細(xì)樣本數(shù)量就容易不夠。如果你自己復(fù)現(xiàn)建議先從5到8類做起跑通全流程后再擴(kuò)展。樣本收集路徑我梳理了四條按性價(jià)比排序行車記錄儀視頻抽幀這是最穩(wěn)定的來源一段城市道路行駛視頻就能抽幾百張覆蓋不同光線和角度的畫面。手機(jī)隨手拍坑洼、裂縫、井蓋這類常見隱患通勤路上就能拍到大量素材。網(wǎng)絡(luò)開源數(shù)據(jù)集可以補(bǔ)充部分公開的道路損壞數(shù)據(jù)集但要注意類別定義和標(biāo)注風(fēng)格是否和你的需求一致不一致時(shí)寧可自己重標(biāo)。視頻監(jiān)控截圖固定視角的樣本對攝像頭場景適配很關(guān)鍵能提升模型在不同視角下的泛化能力。樣本數(shù)量方面我的經(jīng)驗(yàn)是每類目標(biāo)至少要有800張基礎(chǔ)樣本之后再根據(jù)驗(yàn)證集的表現(xiàn)針對性補(bǔ)數(shù)據(jù)。這里特別提醒數(shù)量不是唯一指標(biāo)多樣性同樣重要。如果800張里700張是白天晴天拍的模型到了陰雨天或者逆光場景下檢測率會(huì)明顯掉所以收數(shù)據(jù)時(shí)要有意識(shí)地覆蓋不同時(shí)段、不同天氣、不同道路等級(jí)。2.2 標(biāo)注工具與YOLO標(biāo)注格式詳解標(biāo)注工具我用的是LabelImg和AnyLabeling。LabelImg老牌穩(wěn)定適合純手工標(biāo)注AnyLabeling支持加載預(yù)訓(xùn)練模型做自動(dòng)標(biāo)注輔助對于井蓋、錐筒這類輪廓規(guī)則的物體先用模型預(yù)標(biāo)一遍再人工修正效率能提升一大截。標(biāo)注完成后記得導(dǎo)出成YOLO格式也就是每個(gè)圖像對應(yīng)一個(gè)同名txt文件。YOLO格式的標(biāo)注邏輯必須徹底理解否則后續(xù)訓(xùn)練時(shí)會(huì)栽跟頭。txt文件中每一行代表一個(gè)目標(biāo)格式是class_id x_center y_center width height前三個(gè)值都好理解關(guān)鍵點(diǎn)是坐標(biāo)全部是歸一化值也就是除以圖像寬高后的比例取值范圍0到1。舉個(gè)例子一張1280x720的圖像里某個(gè)坑洼目標(biāo)的包圍框左上角坐標(biāo)是(320, 180)右下角是(640, 540)那么歸一化后的中心、寬高分別是x_center (320 640) / 2 / 1280 0.375y_center (180 540) / 2 / 720 0.5width (640 - 320) / 1280 0.25height (540 - 180) / 720 0.5得到的標(biāo)注行就是0 0.375 0.5 0.25 0.5。注意類別id從0開始計(jì)數(shù)和數(shù)據(jù)集YAML中names列表的順序一一對應(yīng)。標(biāo)注質(zhì)量直接決定模型上限。我在項(xiàng)目里定了三條硬性規(guī)范第一包圍框必須緊貼目標(biāo)可見區(qū)域不用把陰影、反光等背景包進(jìn)去第二目標(biāo)被嚴(yán)重遮擋且可見面積不足30%時(shí)可以跳過不標(biāo)避免給模型傳遞錯(cuò)誤信息第三對裂縫這種細(xì)長目標(biāo)寧可標(biāo)短一些、分成多段也不要標(biāo)一個(gè)大框把周圍路面全部包住否則會(huì)引入大量無意義背景。2.3 數(shù)據(jù)增強(qiáng)策略與訓(xùn)練集劃分YOLOv8在訓(xùn)練時(shí)會(huì)自動(dòng)應(yīng)用Mosaic、隨機(jī)透視、HSV擾動(dòng)、隨機(jī)平移縮放等一系列增強(qiáng)手段。Mosaic增強(qiáng)會(huì)把4張圖拼接成一張訓(xùn)練相當(dāng)于變相擴(kuò)大batch對提升小目標(biāo)檢測能力幫助很大。但有一個(gè)坑要注意如果數(shù)據(jù)集中小目標(biāo)非常多比如遠(yuǎn)處的小坑洼Mosaic過度會(huì)加劇小目標(biāo)特征被壓縮的問題導(dǎo)致訓(xùn)練初期loss波動(dòng)劇烈。我的處理方式是保留默認(rèn)Mosaic開關(guān)但把訓(xùn)練epochs適當(dāng)前置先跑50輪觀察一下驗(yàn)證集的mAP變化如果發(fā)現(xiàn)小目標(biāo)類別遲遲不漲再考慮關(guān)閉Mosaic重訓(xùn)。訓(xùn)練集劃分上我按照82%訓(xùn)練、9%驗(yàn)證、9%測試的比例分配。劃分時(shí)要保證同一來源的視頻抽幀不要全部落在訓(xùn)練集或者驗(yàn)證集里否則會(huì)高估模型泛化能力。建議按視頻來源分組劃分比如來源A的視頻幀全部進(jìn)訓(xùn)練集來源B的幀全部進(jìn)驗(yàn)證集這樣評估結(jié)果才真實(shí)可信。3. 訓(xùn)練全流程從數(shù)據(jù)配置到模型評估3.1 環(huán)境準(zhǔn)備與依賴安裝訓(xùn)練環(huán)境我用的組合是Python 3.10、PyTorch 2.x、CUDA 11.8。安裝YOLOv8訓(xùn)練庫這一步很簡單但有幾個(gè)前提要確認(rèn)PyTorch版本和CUDA驅(qū)動(dòng)必須匹配。pip install ultralytics torch torchvision --index-url https://download.pytorch.org/whl/cu118裝完后建議先跑一個(gè)快速驗(yàn)證yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg如果能看到檢測結(jié)果輸出說明GPU環(huán)境、推理鏈路都是通的再進(jìn)入訓(xùn)練階段。這一步能省掉后面排查環(huán)境問題的不少時(shí)間。3.2 數(shù)據(jù)YAML配置與核心訓(xùn)練參數(shù)訓(xùn)練前需要準(zhǔn)備一個(gè)數(shù)據(jù)集配置文件YOLOv8通過這個(gè)YAML文件找到圖片和標(biāo)注文件的位置并定義類別列表。我的配置長這樣path: D:/datasets/road_hazard train: images/train val: images/val test: images/test names: 0: pothole 1: crack 2: manhole_cover_damage 3: standing_water 4: construction_zone 5: traffic_cone 6: debris其中path寫數(shù)據(jù)集根目錄train和val寫相對于根目錄的圖片文件夾路徑。注意圖片和對應(yīng)的txt標(biāo)注文件名必須完全一致YOLOv8會(huì)自動(dòng)在同名目錄下查找標(biāo)注文件。訓(xùn)練命令我分成基礎(chǔ)版和完整版兩個(gè)層級(jí)。基礎(chǔ)版直接跑yolo train modelyolov8s.pt dataroad_hazard.yaml epochs100 imgsz640 batch16完整版則把關(guān)鍵參數(shù)顯式寫清楚yolo train modelyolov8s.pt dataroad_hazard.yaml epochs120 imgsz640 batch16 device0 optimizerAdamW lr00.001 patience20 seed42 workers8選yolov8s而不是yolov8n是考慮到道路隱患目標(biāo)在畫面中通常不會(huì)特別大稍微大一點(diǎn)的模型能保留更多特征細(xì)節(jié)不選yolov8m或更大是怕推理速度跟不上界面的實(shí)時(shí)預(yù)覽需求。如果你部署的機(jī)器顯卡比較弱可以退回yolov8n速度會(huì)快一截精度大概掉2到3個(gè)點(diǎn)。3.3 訓(xùn)練過程監(jiān)控與評估指標(biāo)解讀訓(xùn)練啟動(dòng)后YOLOv8會(huì)在命令行打印每一輪的loss、精度、召回率和mAP指標(biāo)同時(shí)生成results.png曲線圖和weights權(quán)重文件。我習(xí)慣在訓(xùn)練跑到20輪左右就去看一次驗(yàn)證集上的表現(xiàn)這時(shí)候如果mAP50還在快速上漲說明學(xué)習(xí)率設(shè)置合理如果曲線從第10輪就開始平臺(tái)期那就要考慮是不是學(xué)習(xí)率偏大或者數(shù)據(jù)量不足。評估指標(biāo)上道路隱患場景我最看重兩個(gè)mAP50和Recall。mAP50反映的是檢測框與真實(shí)框IoU超過0.5時(shí)的平均精度適合評估目標(biāo)是否被找到Recall則衡量漏檢率。在安全隱患場景中漏檢一個(gè)坑洼可能導(dǎo)致車輛受損所以我會(huì)在訓(xùn)練后專門檢查各類別的Recall低于0.85的類別優(yōu)先補(bǔ)數(shù)據(jù)重訓(xùn)。模型訓(xùn)練完成后YOLOv8會(huì)在當(dāng)前目錄下生成runs/detect/train文件夾里面包含best.pt和last.pt。best.pt是驗(yàn)證集上表現(xiàn)最好的權(quán)重后續(xù)推理和部署都用它。我建議把best.pt單獨(dú)復(fù)制到項(xiàng)目根目錄下的models文件夾避免和訓(xùn)練日志混在一起。3.4 過擬合、類別不平衡與專項(xiàng)優(yōu)化道路隱患數(shù)據(jù)集的類別不均衡問題非常普遍比如裂縫和坑洼樣本容易收集而井蓋破損、散落物這類相對少見。YOLOv8默認(rèn)的損失函數(shù)對類別不平衡有一定容忍度但嚴(yán)重失衡時(shí)還是會(huì)出現(xiàn)大類精度高、小類基本檢測不到的情況。我的處理策略分三步第一步確認(rèn)各類別數(shù)量分布如果某類樣本數(shù)少于最豐富類別的三分之一先采集補(bǔ)充數(shù)據(jù)而不是調(diào)參數(shù)第二步在訓(xùn)練時(shí)對低頻類別提高損失權(quán)重做法是修改數(shù)據(jù)配置中對應(yīng)的類實(shí)例權(quán)重或者在損失函數(shù)上做類別加權(quán)第三步適當(dāng)增加epochs讓少數(shù)類有更多擬合機(jī)會(huì)配合早停機(jī)制防止過擬合。過擬合的判斷方法很簡單訓(xùn)練loss持續(xù)下降但驗(yàn)證集mAP不升反降或者驗(yàn)證loss明顯反彈。應(yīng)對手段按優(yōu)先級(jí)排列增加數(shù)據(jù)增強(qiáng)強(qiáng)度、增加數(shù)據(jù)量、降低模型復(fù)雜度、加大權(quán)重衰減。我在項(xiàng)目里遇到過一次過擬合最后是增加了隨機(jī)擦除和亮度擾動(dòng)扛過去的單純調(diào)正則效果不明顯。4. PyQt5界面集成把模型變成能用的工具4.1 界面整體布局與交互設(shè)計(jì)PyQt5界面設(shè)計(jì)的核心訴求是“讓不懂算法的人也能操作”。我采用QMainWindow作為主窗口整體布局分成三塊左側(cè)大區(qū)域是實(shí)時(shí)畫面顯示區(qū)使用QLabel承載圖像幀右側(cè)是控制面板包含輸入源選擇按鈕、檢測開關(guān)、置信度閾值滑塊底部是狀態(tài)欄顯示當(dāng)前幀數(shù)、檢測目標(biāo)數(shù)量和處理耗時(shí)。輸入源支持三種本地圖片、視頻文件、攝像頭。攝像頭輸入對巡檢場景最關(guān)鍵代碼上我調(diào)用OpenCV的VideoCapture(0)獲取默認(rèn)攝像頭畫面。如果測試時(shí)發(fā)現(xiàn)攝像頭打不開或者畫面是黑色的先檢查設(shè)備索引部分筆記本的前置攝像頭索引是0外接USB攝像頭可能是1或者更大。我的界面里把設(shè)備索引做成可配置項(xiàng)省去反復(fù)修改代碼的麻煩。窗口交互上有兩個(gè)細(xì)節(jié)值得提一下。第一置信度閾值滑塊實(shí)時(shí)生效因?yàn)橥评砭€程每幀都會(huì)讀取當(dāng)前的閾值設(shè)定無需重啟第二檢測計(jì)數(shù)區(qū)域?qū)崟r(shí)顯示各類別數(shù)量這個(gè)對巡檢人員很實(shí)用一眼就能看出當(dāng)前畫面里主要問題是什么。4.2 推理線程設(shè)計(jì)避免界面卡死的關(guān)鍵這是整個(gè)界面開發(fā)里最容易出問題的部分。如果直接在PyQt5的主線程里執(zhí)行模型推理畫面刷新和按鈕響應(yīng)都會(huì)卡頓因?yàn)橥评碓贕PU上可能只要幾十毫秒但加上圖像預(yù)處理、結(jié)果后處理和繪制總耗時(shí)一拖界面就明顯掉幀了。解決方法是把推理任務(wù)全部丟進(jìn)QThread子線程。線程結(jié)構(gòu)我拆成兩個(gè)類CaptureThread負(fù)責(zé)讀取視頻幀DetectThread負(fù)責(zé)YOLOv8推理。兩者通過信號(hào)和槽通信DetectThread拿到幀后推理把結(jié)果框繪制在圖像副本上再通過signal把處理后的圖像發(fā)送給主界面刷新QLabel。這樣主線程只負(fù)責(zé)UI刷新永遠(yuǎn)不會(huì)被阻塞。推理線程的核心代碼邏輯如下class DetectThread(QThread): frame_ready pyqtSignal(QImage) def __init__(self): super().__init__() self.model YOLO(models/best.pt) self.conf_thres 0.45 self.running True def run(self): while self.running: # 從共享隊(duì)列獲取幀 frame get_latest_frame() if frame is None: continue results self.model.predict(frame, confself.conf_thres, verboseFalse) # 繪制檢測框、提取檢測信息 annotated draw_boxes(frame, results) # 轉(zhuǎn)換為QImage發(fā)送到界面 self.frame_ready.emit(convert_to_qimage(annotated))這里有一個(gè)我自己踩過的坑使用model.predict時(shí)如果每幀都傳verboseTrue控制臺(tái)會(huì)被刷爆而且打印操作本身會(huì)拖慢推理速度。所以正式應(yīng)用里必須把verbose關(guān)掉。4.3 結(jié)果繪制與檢測信息展示檢測框繪制我采用的是OpenCV繪制加圖片格式轉(zhuǎn)換的方案不直接用QPainter在界面上畫。原因很簡單OpenCV的rectangle、putText接口在批量繪制多個(gè)框時(shí)處理效率更穩(wěn)定而且和推理結(jié)果的數(shù)據(jù)結(jié)構(gòu)直接兼容。繪制邏輯的關(guān)鍵點(diǎn)在于坐標(biāo)轉(zhuǎn)換。YOLOv8返回的boxes.xyxy是原始圖像坐標(biāo)系下的像素坐標(biāo)可以直接拿來在圖像上畫框。但如果你在界面顯示時(shí)對圖像做了縮放就需要同步把框坐標(biāo)也做等比變換否則會(huì)出現(xiàn)“顯示的框和實(shí)際目標(biāo)位置對不上”的問題。類別標(biāo)簽的展示我做了顏色區(qū)分用顏色列表映射每個(gè)類別同類別目標(biāo)畫相同顏色的框左上角標(biāo)注類別名和置信度數(shù)值。置信度顯示是有講究的只顯示百分比數(shù)字會(huì)太單調(diào)我加了一個(gè)小進(jìn)度條式的底色塊視覺上更直觀。5. 打包部署與常見問題排查5.1 PyInstaller打包細(xì)節(jié)整套系統(tǒng)開發(fā)完成后最終交付形態(tài)是一個(gè)雙擊就能運(yùn)行的桌面程序。我用PyInstaller打包基礎(chǔ)命令很簡單pyinstaller --noconsole --onefile main.py但這只是表象實(shí)際打包過程中有幾個(gè)暗坑必須處理。首先模型文件best.pt不會(huì)自動(dòng)包含進(jìn)打包產(chǎn)物需要在spec文件中把模型文件添加為data資源并修改代碼中模型加載的路徑使它兼容打包后的臨時(shí)目錄結(jié)構(gòu)。常用做法是import sys import os def resource_path(relative_path): base_path getattr(sys, _MEIPASS, os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path) model YOLO(resource_path(models/best.pt))其次PyQt5的插件文件在打包時(shí)偶爾會(huì)丟失表現(xiàn)為程序啟動(dòng)后無法顯示圖像窗口或者視頻解碼失敗。解決方法是打包時(shí)顯式添加PyQt5和OpenCV的hook或者在spec文件中動(dòng)態(tài)庫的收集配置上避免遺漏。打包產(chǎn)物體積這一塊因?yàn)閅OLOv8模型權(quán)重加上PyTorch運(yùn)行時(shí)整體在600MB到1GB之間是正常的。如果想瘦身可以先把模型導(dǎo)出為ONNX格式再用ONNX Runtime推理體積能小很多但需要額外處理非極大值抑制的代碼工程復(fù)雜度會(huì)上升。第一次交付我建議直接用PyTorch Runtime打包穩(wěn)定壓倒一切。5.2 高頻問題速查表在開發(fā)調(diào)試和用戶反饋的過程中我整理了下面這張高頻問題表遇到類似情況可以照著排查現(xiàn)象可能原因處理辦法訓(xùn)練時(shí)報(bào)CUDA out of memorybatch size過大或顯卡顯存不足batch size減半或imgsz從640降到512訓(xùn)練時(shí)loss一直不下降學(xué)習(xí)率設(shè)置不合適或數(shù)據(jù)標(biāo)注錯(cuò)誤檢查標(biāo)注文件坐標(biāo)是否越界、類別id是否正確驗(yàn)證集mAP很低但訓(xùn)練集很高過擬合增加數(shù)據(jù)增強(qiáng)、補(bǔ)充樣本或降低模型復(fù)雜度界面推理卡頓推理在主線程、未使用QThread把推理邏輯遷移到子線程主線程只負(fù)責(zé)UI攝像頭畫面打不開設(shè)備索引錯(cuò)誤或攝像頭被占用設(shè)置設(shè)備索引變量釋放被占用的攝像頭資源打包后程序啟動(dòng)閃退缺少動(dòng)態(tài)庫或模型路徑錯(cuò)誤使用resource_path加載模型檢查打包日志小目標(biāo)裂縫檢測不到輸入分辨率不足或小目標(biāo)樣本少imgsz上調(diào)至768補(bǔ)充裂縫近景樣本5.3 性能優(yōu)化與效率提升建議系統(tǒng)跑通后我發(fā)現(xiàn)實(shí)際使用中最影響體驗(yàn)的是推理幀率和CPU占用。常規(guī)情況下yolov8s在GPU上推理大約20到40毫秒一幀看起來夠用但如果部署電腦顯卡差一點(diǎn)就會(huì)掉到200毫秒以上這時(shí)可以考慮幾個(gè)優(yōu)化方向第一個(gè)方向是把模型導(dǎo)出為半精度FP16在支持FP16的GPU上能獲得接近一倍的速度提升對精度影響很小。第二個(gè)方向是檢查輸入圖像是否過大攝像頭分辨率如果默認(rèn)是1920x1080可以先等比縮放到1280再做推理既能提升速度又不會(huì)明顯降低小目標(biāo)檢測精度。第三個(gè)方向是控制界面刷新頻率不要每處理一幀就立刻刷新畫面可以固定30毫秒刷新一次把最新的結(jié)果幀顯示出來實(shí)際觀感就是流暢的實(shí)時(shí)視頻。如果后續(xù)想進(jìn)一步提升性能還可以考慮TensorRT加速。YOLOv8官方提供了TensorRT導(dǎo)出支持在英偉達(dá)顯卡上推理速度能再快兩三倍。不過TensorRT部署會(huì)增加一定的環(huán)境配置復(fù)雜度建議在系統(tǒng)穩(wěn)定運(yùn)行后再引入。我個(gè)人在實(shí)際操作中的體會(huì)是這種檢測系統(tǒng)模型的精度往往不是最大的瓶頸數(shù)據(jù)質(zhì)量和工程穩(wěn)定性的影響更大。第一次跑通訓(xùn)練和界面可能只需要幾天但要讓模型在各種路況下都穩(wěn)定判斷數(shù)據(jù)迭代才是真正的持久戰(zhàn)。如果你還沒開始動(dòng)手建議先按我上面的流程拿一個(gè)小規(guī)模數(shù)據(jù)集跑通端到端再逐步擴(kuò)充類別和樣本量。后續(xù)想擴(kuò)展的話這套界面框架可以很輕松地對接其他YOLO系列模型甚至改成頭盔佩戴檢測、車牌識(shí)別之類的新任務(wù)換掉數(shù)據(jù)和權(quán)重就行整體改動(dòng)量很小。