境搭建實(shí)戰(zhàn):Ubuntu+PyTorch+CUDA避坑指南)
如果你也是那種“裝個(gè)環(huán)境裝到懷疑人生”的人這篇內(nèi)容就是寫(xiě)給你看的。YOLO本身是個(gè)極其成熟的框架Ultralytics把訓(xùn)練和推理做到了開(kāi)箱即用的程度但真正攔住大多數(shù)人的從來(lái)不是算法而是環(huán)境本身。Ubuntu、PyTorch、CUDA、顯卡驅(qū)動(dòng)這四個(gè)詞排列組合起來(lái)能產(chǎn)生無(wú)數(shù)種報(bào)錯(cuò)方式而且很多報(bào)錯(cuò)信息長(zhǎng)得一模一樣原因卻完全不同。我前前后后在十幾臺(tái)不同配置的機(jī)器上搭過(guò)YOLO實(shí)戰(zhàn)環(huán)境從物理機(jī)到WSL2再到無(wú)頭服務(wù)器都踩過(guò)一遍這篇就把最穩(wěn)的路線和最典型的坑一次性講清楚。1. 環(huán)境選型先把版本矩陣搞清楚比直接敲命令重要十倍1.1 這90%的報(bào)錯(cuò)到底錯(cuò)在哪很多人一上來(lái)就跑去下載Ubuntu鏡像、安裝驅(qū)動(dòng)、裝CUDA toolkit、裝cuDNN、裝PyTorch然后發(fā)現(xiàn)每一步都能卡住。實(shí)際上這些步驟里有相當(dāng)一部分是多余的甚至是報(bào)錯(cuò)的主要來(lái)源。先說(shuō)一個(gè)最核心的認(rèn)知PyTorch官方發(fā)布的GPU版本里已經(jīng)自帶了CUDA runtime庫(kù)。也就是說(shuō)你用pip或者conda安裝torch的時(shí)候和你平時(shí)熟知的CUDA toolkit并不是同一個(gè)東西。真正影響PyTorch能否跑GPU的不是你裝沒(méi)裝CUDA toolkit而是你的NVIDIA顯卡驅(qū)動(dòng)版本是否足夠新。驅(qū)動(dòng)版本決定的是“你這個(gè)驅(qū)動(dòng)能支持到多新的CUDA”而PyTorch自帶的CUDA runtime決定的是“這個(gè)torch包要求驅(qū)動(dòng)至少支持到什么版本”。只要驅(qū)動(dòng)的支持新度PyTorch包的要求就能跑。所以你在系統(tǒng)里輸入nvidia-smi右上角看到的CUDA Version含義是“當(dāng)前驅(qū)動(dòng)最高支持的CUDA版本”它只是一個(gè)上限值不代表你系統(tǒng)里裝了那個(gè)版本的CUDA toolkit。裝不裝toolkit對(duì)PyTorch來(lái)說(shuō)其實(shí)無(wú)所謂。這也是為什么網(wǎng)上很多教程會(huì)讓你“先裝CUDA再裝PyTorch”結(jié)果反而把環(huán)境搞亂了的根本原因。干凈做法是裝一個(gè)足夠新的NVIDIA驅(qū)動(dòng)然后用pip直接裝帶CUDA支持的torch其余什么都不要裝。1.2 系統(tǒng)怎么選物理機(jī) / WSL2 / 虛擬機(jī)如果你手頭是一臺(tái)帶NVIDIA顯卡的機(jī)器最常見(jiàn)的方案有三種優(yōu)缺點(diǎn)非常明顯方案優(yōu)點(diǎn)缺點(diǎn)適合場(chǎng)景物理機(jī)裝Ubuntu性能最好兼容性最穩(wěn)單系統(tǒng)重裝成本高影響日常使用專(zhuān)用訓(xùn)練機(jī)器、長(zhǎng)期跑實(shí)驗(yàn)Windows WSL2不用放棄WindowsGPU直通成熟對(duì)新手來(lái)說(shuō)WSL2本身有一點(diǎn)學(xué)習(xí)成本平時(shí)用Windows辦公偶爾跑深度學(xué)習(xí)VMware/VirtualBox虛擬機(jī)完全隔離不怕搞壞宿主機(jī)幾乎無(wú)法做GPU加速只能CPU推理學(xué)習(xí)Linux命令、跑非常小的模型測(cè)試我個(gè)人最推薦的是第二種WSL2。它不僅保留了Windows的日常體驗(yàn)而且底層就是一個(gè)真正的Ubuntu內(nèi)核nvidia-smi、torch.cuda.is_available()全部可以直接用性能損耗非常小。WSL2里裝驅(qū)動(dòng)的方式也比較特殊Windows側(cè)裝好顯卡驅(qū)動(dòng)就行了WSL2內(nèi)部不需要再裝驅(qū)動(dòng)。如果你堅(jiān)持物理機(jī)裝Ubuntu建議直接裝Ubuntu 22.04 LTS代號(hào)Jammy或者24.04 LTS。20.04稍老部分新顯卡在舊內(nèi)核上需要手動(dòng)搞驅(qū)動(dòng)會(huì)比較折騰。VMware虛擬機(jī)里裝Ubuntu做做系統(tǒng)練手完全沒(méi)問(wèn)題但真的想用它訓(xùn)練模型別抱期待CPU跑YOLOv8n一張圖可能都要好幾秒。1.3 版本搭配參考表在寫(xiě)任何命令之前先確定一套經(jīng)過(guò)驗(yàn)證的組合。以下是我在不同機(jī)器上實(shí)測(cè)過(guò)、穩(wěn)定到可以放心抄作業(yè)的組合組件推薦版本說(shuō)明Ubuntu22.04 LTS / 24.04 LTS長(zhǎng)期支持版?zhèn)}庫(kù)源穩(wěn)定NVIDIA驅(qū)動(dòng)545或更新越新越省心舊驅(qū)動(dòng)容易觸發(fā)CUDA版本過(guò)舊警告Python3.10.x 或 3.11.xUltralytics支持性最好3.12部分?jǐn)U展編譯會(huì)麻煩一點(diǎn)PyTorch2.xCUDA 11.8或12.1配套包優(yōu)先選擇cu121版綜合生態(tài)最成熟Ultralytics最新release保持pip update即可新版會(huì)增加模型和功能關(guān)于熱詞里提到的“python 3.10.11 pytorch 2.8.0 cuda 12.1組合包”這確實(shí)是一個(gè)驗(yàn)證過(guò)很好的組合。3.10這個(gè)Python版本對(duì)大部分C擴(kuò)展的兼容性都非常好不會(huì)出現(xiàn)3.12那種“什么都要重新編譯”的問(wèn)題CUDA 12.1則是當(dāng)前PyTorch生態(tài)里兼容性最好的一個(gè)檔位既不會(huì)太老失去新特性也不會(huì)太新導(dǎo)致部分庫(kù)沒(méi)跟上。2. 從零搭建Ubuntu環(huán)境的完整實(shí)操流程2.1 安裝NVIDIA驅(qū)動(dòng)物理機(jī)/WSL2兩條路線先看WSL2路線最簡(jiǎn)單。在Windows PowerShell里執(zhí)行wsl --install -d Ubuntu-22.04裝完重啟進(jìn)入U(xiǎn)buntu終端直接輸入nvidia-smi。如果Windows側(cè)驅(qū)動(dòng)正常你會(huì)直接看到顯卡信息列表。WSL2內(nèi)部不需要任何額外驅(qū)動(dòng)操作這一條是微軟和NVIDIA已經(jīng)做好的事別再自己瞎折騰。物理機(jī)路線稍微復(fù)雜一點(diǎn)。Ubuntu裝好系統(tǒng)后先用系統(tǒng)自帶的開(kāi)源驅(qū)動(dòng)開(kāi)機(jī)。然后執(zhí)行sudo apt update sudo apt install ubuntu-drivers-common ubuntu-drivers devices最后一條命令會(huì)列出顯卡推薦安裝的驅(qū)動(dòng)版本比如nvidia-driver-545。然后直接自動(dòng)裝sudo ubuntu-drivers autoinstall sudo reboot重啟后執(zhí)行nvidia-smi驗(yàn)證。如果看到類(lèi)似“Driver Version: 545.23.08”并且列出了GPU型號(hào)驅(qū)動(dòng)就緒。這里有個(gè)經(jīng)驗(yàn)不要手動(dòng)去NVIDIA官網(wǎng)下載.run結(jié)尾的驅(qū)動(dòng)包來(lái)裝那東西在Ubuntu上容易把系統(tǒng)的驅(qū)動(dòng)管理搞亂而且每次內(nèi)核升級(jí)之后驅(qū)動(dòng)就失效一次。用系統(tǒng)源里的驅(qū)動(dòng)省心得多。2.2 安裝Anaconda或Miniconda并創(chuàng)建虛擬環(huán)境驅(qū)動(dòng)搞定之后下一步是Python環(huán)境隔離。強(qiáng)烈建議用conda不要直接用系統(tǒng)自帶的python3否則以后項(xiàng)目多了會(huì)互相踩腳。Miniconda輕量很多夠用。下載腳本wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回車(chē)加yes裝完后重開(kāi)終端或者source ~/.bashrc。檢查一下conda --version然后創(chuàng)建名為yolo的獨(dú)立環(huán)境Python用3.10conda create -n yolo python3.10 -y conda activate yolo看到命令行前面出現(xiàn)(yolo)就對(duì)了。Python版本這里不要貪新3.10是當(dāng)前最穩(wěn)妥的選擇。3.12在很多深度學(xué)習(xí)擴(kuò)展上雖然也能裝但經(jīng)常要現(xiàn)場(chǎng)編譯耗時(shí)而且容易缺依賴報(bào)錯(cuò)。2.3 安裝GPU版PyTorch的兩種方式激活yolo環(huán)境后有兩種裝法推薦pippip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121這個(gè)命令裝的是CUDA 12.1配套的PyTorch全家桶。如果你在下載過(guò)程中特別慢或者超時(shí)可以把下載源換成清華的PyTorch wheel鏡像pip install torch torchvision torchaudio --index-url https://mirrors.tuna.tsinghua.edu.cn/pytorch-wheels/cu121用conda方式也可以但conda默認(rèn)的PyTorch源版本更新往往滯后而且處理依賴時(shí)容易拖家?guī)Э谘b上一堆不需要的東西。我實(shí)測(cè)下來(lái)pip方式更干凈、更快出問(wèn)題也更好排查。裝完后驗(yàn)證GPU是否真正可用這是整個(gè)搭建過(guò)程中最重要的檢查點(diǎn)python -c import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))期望輸出類(lèi)似2.8.0cu121 True NVIDIA GeForce RTX 4090。如果你看到True那么恭喜最難的部分已經(jīng)結(jié)束了。這里插一個(gè)熱詞里提到的點(diǎn)兒在WSL2里寫(xiě)代碼如果你想要接近macOS的體驗(yàn)字體非常關(guān)鍵。Windows Terminal Cascadia Code配WSL2或者VS Code Remote配上JetBrains Mono整體觀感比默認(rèn)的Courier New強(qiáng)太多了。這個(gè)雖然是小事但每天對(duì)著終端代碼的人會(huì)明白字體帶來(lái)的幸福感。2.4 安裝Ultralytics并完成首次推理繼續(xù)在當(dāng)前環(huán)境里pip install ultralytics如果你的pip源比較慢還是那句老話臨時(shí)指定鏡像pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple安裝完成后可以先跑一個(gè)最簡(jiǎn)單的推理驗(yàn)證全鏈路yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg第一次運(yùn)行會(huì)自動(dòng)下載yolov8n.pt權(quán)重文件。如果你發(fā)現(xiàn)卡在下載權(quán)重這一步不用硬等直接瀏覽器打開(kāi)https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt手動(dòng)下載放到當(dāng)前目錄即可。命令跑完程序會(huì)在目錄下生成runs/detect/predict文件夾里面就是標(biāo)注好檢測(cè)框的結(jié)果圖。到這一步你的YOLO環(huán)境已經(jīng)完整可用從圖像輸入到模型推理到結(jié)果輸出整條鏈路走通了。3. 準(zhǔn)備自己的數(shù)據(jù)集標(biāo)注、轉(zhuǎn)換與目錄規(guī)范3.1 數(shù)據(jù)集目錄結(jié)構(gòu)實(shí)戰(zhàn)中你不會(huì)永遠(yuǎn)拿官方bus.jpg測(cè)試訓(xùn)練自己的模型才是核心。YOLO的數(shù)據(jù)集目錄有嚴(yán)格規(guī)范一共三層datasets/ mydata/ images/ train/ val/ labels/ train/ val/ data.yaml關(guān)鍵點(diǎn)只有一個(gè)images和labels兩個(gè)目錄互相對(duì)應(yīng)訓(xùn)練集圖片放在images/train對(duì)應(yīng)的標(biāo)注txt必須放在labels/train。文件名需要完全一致比如0001.jpg配0001.txt。我見(jiàn)過(guò)太多人把圖片和標(biāo)注文件放混或者images和labels目錄名寫(xiě)錯(cuò)訓(xùn)練腳本直接飄紅“No labels found”。data.yaml內(nèi)容很簡(jiǎn)單指定路徑和類(lèi)別path: /home/yourname/datasets/mydata train: images/train val: images/val names: 0: dog 1: cat注意names的索引必須從0開(kāi)始這一點(diǎn)在下面標(biāo)注部分還會(huì)提到因?yàn)檫@里錯(cuò)一下你的模型整個(gè)訓(xùn)練周期的mAP都會(huì)是0。3.2 標(biāo)注工具實(shí)操LabelImg、Labelme、X-AnyLabeling標(biāo)注工具有很多我的建議是做目標(biāo)檢測(cè)用LabelImg做實(shí)例分割用Labelme或X-AnyLabeling。LabelImg是老牌工具安裝簡(jiǎn)單pip install labelimg labelimg打開(kāi)后設(shè)置“PascalVOC”或“YOLO”格式然后逐張框選目標(biāo)。保存為YOLO格式時(shí)LabelImg會(huì)直接生成格式為class_id cx cy w h的txt文件坐標(biāo)都是歸一化的0到1之間的小數(shù)。這里有兩個(gè)新手幾乎必踩的坑類(lèi)別ID是從0開(kāi)始的。你標(biāo)注的第一類(lèi)物體是0第二類(lèi)是1不是從1數(shù)起。cx、cy是中心點(diǎn)坐標(biāo)占圖片寬高的比例不是左上角坐標(biāo)。如果你標(biāo)注的是天然大尺寸圖片比如衛(wèi)星圖、無(wú)人機(jī)拍的照片訓(xùn)練時(shí)小目標(biāo)效果會(huì)非常差。YOLO本身對(duì)輸入尺寸有限制一般默認(rèn)640x640大圖直接扔進(jìn)去就會(huì)被壓到看不清楚。常見(jiàn)做法是把大圖切塊后訓(xùn)練。熱詞里問(wèn)到“yolo切割只能切矩形圖片嗎”這里解釋一下常規(guī)切片sliding window確實(shí)只能切矩形patch因?yàn)槟P洼斎刖褪蔷匦螐埩康珜?duì)特殊需求你可以用切片推理庫(kù)比如SAHI在推理階段做重疊patch推理訓(xùn)練階段也可以先用矩形切片把數(shù)據(jù)集預(yù)處理成標(biāo)準(zhǔn)圖塊不需要硬塞原始大圖。3.3 KITTI標(biāo)注格式轉(zhuǎn)YOLO格式很多人做自動(dòng)駕駛相關(guān)項(xiàng)目會(huì)拿到KITTI格式的數(shù)據(jù)集。KITTI標(biāo)注的txt格式是Car 0.00 0 0.00 720.00 180.00 1000.00 320.00 0.00 0.00 0.00 0.00 0.00 0.00前面是類(lèi)別名、截?cái)喑潭取⒄趽醭潭鹊群竺娓氖莤1 y1 x2 y2左上角和右下角的像素坐標(biāo)。轉(zhuǎn)YOLO格式時(shí)需要把像素坐標(biāo)轉(zhuǎn)換成歸一化的中心點(diǎn)坐標(biāo)轉(zhuǎn)換代碼如下import os # x1, y1, x2, y2 是像素坐標(biāo) def kitti_to_yolo(img_w, img_h, x1, y1, x2, y2): dw 1.0 / img_w dh 1.0 / img_h x_center (x1 x2) / 2.0 y_center (y1 y2) / 2.0 w x2 - x1 h y2 - y1 return x_center * dw, y_center * dh, w * dw, h * dh注意KITTI里的類(lèi)別是字符串比如Car、Pedestrian轉(zhuǎn)換時(shí)需要先映射成整數(shù)ID。自己做一個(gè)類(lèi)別到ID的字典比如{Car: 0, Pedestrian: 1, Cyclist: 2}然后逐行轉(zhuǎn)換。搞不清楚這一步訓(xùn)練出來(lái)的模型在驗(yàn)證階段mAP一定會(huì)是0因?yàn)闃?biāo)簽文件里只要有一個(gè)非法類(lèi)別ID整個(gè)文件的解析就會(huì)異常。這類(lèi)格式轉(zhuǎn)換腳本網(wǎng)上很多但最好自己寫(xiě)一遍明白每一步在干嘛排查問(wèn)題時(shí)心里才有數(shù)。3.4 訓(xùn)練命令與關(guān)鍵參數(shù)數(shù)據(jù)集準(zhǔn)備好后訓(xùn)練就是一個(gè)命令的事yolo detect train data/home/yourname/datasets/mydata/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0幾個(gè)參數(shù)的解釋modelyolov8n.pt這個(gè)命令會(huì)基于預(yù)訓(xùn)練權(quán)重繼續(xù)訓(xùn)練finetune收斂速度遠(yuǎn)快于從零開(kāi)始。如果你是做自定義數(shù)據(jù)集想從零訓(xùn)練改成modelyolov8n.yaml。epochs訓(xùn)練輪數(shù)小數(shù)據(jù)集50-100輪足夠大數(shù)據(jù)集可以跑到300。batch受顯存限制。顯存不夠時(shí)優(yōu)先降低batch再考慮降低imgsz不要一開(kāi)始就把輸入分辨率調(diào)低否則小目標(biāo)的檢測(cè)精度會(huì)明顯下降。device0指定第0號(hào)GPU。如果只有CPU改成devicecpu但速度會(huì)慢到讓你懷疑人生。ampTrue自動(dòng)混合精度訓(xùn)練Ultralytics默認(rèn)開(kāi)啟建議保留顯存占用能明顯下降基本不影響精度。訓(xùn)練過(guò)程中日志會(huì)顯示每個(gè)epoch的box_loss、cls_loss、dfl_loss和mAP指標(biāo)。如果發(fā)現(xiàn)mAP50一直卡著不動(dòng)或者掉點(diǎn)優(yōu)先檢查數(shù)據(jù)集標(biāo)注質(zhì)量而不是調(diào)模型超參數(shù)。數(shù)據(jù)問(wèn)題導(dǎo)致模型學(xué)不到東西這個(gè)方向錯(cuò)了再怎么調(diào)參都沒(méi)用。4. 高頻環(huán)境報(bào)錯(cuò)排查我用一張速查表解決90%的問(wèn)題4.1 安裝與驗(yàn)證階段的典型報(bào)錯(cuò)這部分是環(huán)境搭建的重災(zāi)區(qū)直接把最常見(jiàn)問(wèn)題和排查方法列成了一張表建議收藏遇到問(wèn)題就對(duì)照著查報(bào)錯(cuò)信息原因解決辦法RuntimeError: Found no NVIDIA driver on your system驅(qū)動(dòng)沒(méi)有正常安裝執(zhí)行nvidia-smi若提示NVIDIA-SMI has failed則重裝驅(qū)動(dòng)UserWarning: CUDA initialization: The NVIDIA driver on your system is too old驅(qū)動(dòng)版本過(guò)舊低于PyTorch包要求升級(jí)系統(tǒng)驅(qū)動(dòng)到550系列以上torch.cuda.is_available()返回False可能是PyTorch裝成了CPU版也可能是驅(qū)動(dòng)問(wèn)題用pip list檢查torch版本正常情況應(yīng)顯示cu121后綴ImportError: libGL.so.1: cannot open shared object file系統(tǒng)缺少OpenGL運(yùn)行庫(kù)sudo apt install libgl1 libglib2.0-0下載yolov8n.pt超時(shí)網(wǎng)絡(luò)訪問(wèn)GitHub不穩(wěn)定瀏覽器手動(dòng)下載權(quán)重文件放到當(dāng)前目錄pip install ultralytics報(bào)編譯錯(cuò)誤Python版本過(guò)新導(dǎo)致C擴(kuò)展編譯失敗換Python 3.10避免3.12以上的版本4.2 訓(xùn)練階段的典型報(bào)錯(cuò)報(bào)錯(cuò)信息原因解決辦法No labels found in /.../train/labels標(biāo)簽?zāi)夸浡窂讲粚?duì)或者標(biāo)注文件為空檢查data.yaml的train和val路徑檢查labels目錄是否存在CUDA out of memory顯存不足減小batch如果batch已是2再考慮降低imgsz或換更小的yolov8n模型Assertion index 0 failed標(biāo)簽類(lèi)別ID越界檢查標(biāo)注txt里第一列數(shù)字是否都在data.yaml的names范圍內(nèi)訓(xùn)練mAP一直為0標(biāo)簽格式錯(cuò)誤中心點(diǎn)坐標(biāo)沒(méi)歸一化或類(lèi)別從1開(kāi)始重新檢查標(biāo)注文件確保cx cy w h都是0~1小數(shù)class從0開(kāi)始AttributeError: NoneType object has no attribute shape圖片路徑中存在損壞或無(wú)法讀取的文件檢查images目錄刪掉可能為空的圖片確認(rèn)圖片不是WebP或其他異常格式4.3 環(huán)境自檢腳本與備份技巧踩坑踩多了以后我總結(jié)出一個(gè)習(xí)慣每次搭完新環(huán)境先把一段自檢腳本跑一遍能一次性確認(rèn)所有核心組件是否正常。貼個(gè)精簡(jiǎn)版#!/bin/bash echo Ubuntu 版本 lsb_release -d echo 顯卡驅(qū)動(dòng) nvidia-smi --query-gpuname,driver_version --formatcsv echo Python 版本 python --version echo PyTorch 與 GPU python -c import torch; print(torch:, torch.__version__); print(cuda available:, torch.cuda.is_available()); print(device:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU) echo Ultralytics 版本 python -c from ultralytics import __version__; print(__version__)把這段保存成env_check.sh每次換機(jī)器、換環(huán)境之后先跑一遍幾秒鐘就能定位問(wèn)題出在哪一層。我見(jiàn)過(guò)太多人一上來(lái)就在訓(xùn)練腳本里撓頭debug實(shí)際上問(wèn)題在幾層之外的環(huán)境上。環(huán)境備份也很重要。conda環(huán)境最怕的是裝完以后又裝別的依賴把原來(lái)的版本搞亂。訓(xùn)練一個(gè)項(xiàng)目前執(zhí)行一下conda env export -n yolo yolo_env.yaml萬(wàn)一環(huán)境弄壞了重建起來(lái)一條命令conda env create -f yolo_env.yaml如果是系統(tǒng)層面做了大改動(dòng)強(qiáng)烈建議在裝驅(qū)動(dòng)之前用btrfs或者zfs做快照或者至少把conda環(huán)境和項(xiàng)目代碼放到單獨(dú)分區(qū)避免Ubuntu系統(tǒng)重裝時(shí)一切歸零。系統(tǒng)重裝一次的成本至少半天起步快照幾分鐘就能回滾。4.4 關(guān)于“一鍵部署腳本”的思路網(wǎng)上很多人分享“一鍵部署YOLO環(huán)境”其實(shí)本質(zhì)就是把你剛才手動(dòng)執(zhí)行的所有命令串成一個(gè)bash腳本。真正有價(jià)值的地方不在于“一鍵”而在于腳本里加入了失敗檢查和重試機(jī)制。舉個(gè)典型寫(xiě)法#!/bin/bash set -e # 創(chuàng)建conda環(huán)境 conda create -n yolo python3.10 -y source activate yolo # 安裝PyTorch這里加了網(wǎng)絡(luò)失敗重試邏輯 for i in 1 2 3; do pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 break echo retry $i... done # 驗(yàn)證GPU可用性 python -c import torch; assert torch.cuda.is_available(), GPU not available pip install ultralytics echo Environment ready!這種做法在無(wú)頭服務(wù)器或者多臺(tái)機(jī)器場(chǎng)景下特別好用新機(jī)器到場(chǎng)一句bash setup.sh十幾分鐘后環(huán)境就緒。自己寫(xiě)一遍這個(gè)腳本對(duì)Python環(huán)境、CUDA版本、依賴關(guān)系的理解會(huì)比看一萬(wàn)字教程都深。5. 從檢測(cè)擴(kuò)展到實(shí)例分割標(biāo)簽與模型選擇5.1 實(shí)例分割和檢測(cè)的數(shù)據(jù)標(biāo)注差異熱詞里提到了“yolo實(shí)例分割”和“maskflow yolo”這里展開(kāi)一下。YOLO的實(shí)例分割I(lǐng)nstance Segmentation要做的事情比目標(biāo)檢測(cè)多一個(gè)步驟不僅要找到目標(biāo)在哪還要把目標(biāo)的像素輪廓畫(huà)出來(lái)。因此標(biāo)注工具也要從矩形框換成多邊形。用Labelme標(biāo)注多邊形后每個(gè)目標(biāo)對(duì)應(yīng)一個(gè)多邊形點(diǎn)集合。Ultralytics實(shí)例分割訓(xùn)練需要的標(biāo)注格式是歸一化多邊形坐標(biāo)存放在labels目錄下的同名txt里每一行格式是class_id x1 y1 x2 y2 x3 y3 ...其中x y是多邊形各個(gè)頂點(diǎn)的歸一化坐標(biāo)。Labelme默認(rèn)輸出的是JSON格式需要通過(guò)腳本把JSON轉(zhuǎn)成這種seg txt格式官方文檔里有轉(zhuǎn)換說(shuō)明但本質(zhì)上就是逐點(diǎn)多邊形歸一化和KITTI轉(zhuǎn)YOLO的思路類(lèi)似關(guān)鍵點(diǎn)還是類(lèi)別從0開(kāi)始、坐標(biāo)歸一化這兩個(gè)死穴不能碰。5.2 實(shí)例分割的訓(xùn)練命令yolo segment train datamysegdata.yaml modelyolov8n-seg.pt epochs100 imgsz640 device0推理也一樣yolo segment predict modelyolov8n-seg.pt sourcevideo.mp4 device0輸出結(jié)果會(huì)附帶每個(gè)目標(biāo)的掩膜圖可以直接用來(lái)做后續(xù)的像素級(jí)分析。不過(guò)提醒一句實(shí)例分割對(duì)顯存的要求比單純檢測(cè)高不少同樣batch下顯存占用幾乎翻倍。如果你的GPU顯存只有6G或8G建議老老實(shí)實(shí)用yolov8n-seg別想著跑yolov8x-seg否則OOM能把你折磨瘋。5.3 模型導(dǎo)出與部署訓(xùn)練完后模型默認(rèn)保存在runs/train/exp*/weights/best.pt。這個(gè)格式適合繼續(xù)訓(xùn)練和推理但真正部署到生產(chǎn)環(huán)境通常要轉(zhuǎn)換成更輕量的格式y(tǒng)olo export modelbest.pt formatonnx dynamicTrue yolo export modelbest.pt formatengine device0 # TensorRTNVIDIA平臺(tái)專(zhuān)用ONNX格式可以跨平臺(tái)、跨框架運(yùn)行TensorRT則是NVIDIA顯卡上的終極加速形態(tài)。導(dǎo)出一般不會(huì)卡住常見(jiàn)的問(wèn)題是導(dǎo)出后推理結(jié)果與PyTorch下不一致這種問(wèn)題優(yōu)先檢查預(yù)處理邏輯特別是歸一化方式Y(jié)OLO通常用除以255的0~1歸一化和輸入尺寸是否保持一致。最后說(shuō)點(diǎn)實(shí)在話回想我自己第一次搭YOLO環(huán)境傻乎乎地在VMware里裝了Ubuntu又折騰了半天CUDA最后發(fā)現(xiàn)虛擬機(jī)里根本沒(méi)有GPU加速那種挫敗感現(xiàn)在還記得。后來(lái)?yè)Q到物理機(jī)路線裝驅(qū)動(dòng)、裝conda、裝torch花了整整兩個(gè)晚上才把所有報(bào)錯(cuò)“清零”。但現(xiàn)在讓我再搭一臺(tái)新機(jī)器不需要翻任何文檔一條條命令往下敲最多40分鐘就能讓torch.cuda.is_available()輸出True剩下的時(shí)間都可以花在真正重要的事——調(diào)模型和跑實(shí)驗(yàn)上。如果讓我給新手一個(gè)最核心的建議那就是先搞清楚自己用的是哪一條鏈路物理機(jī)還是WSL2再確定一套經(jīng)過(guò)驗(yàn)證的版本組合最后按順序執(zhí)行。遇到報(bào)錯(cuò)不要慌看報(bào)錯(cuò)的第一行那是問(wèn)題真正發(fā)生的位置而不是看最后一行的“Traceback最底部”。環(huán)境搭建這件事本質(zhì)上是在跟版本做斗爭(zhēng)而不是在跟代碼做斗爭(zhēng)。版本選對(duì)了你可以搞定那90%的報(bào)錯(cuò)剩下10%基本都是細(xì)節(jié)問(wèn)題查一下就能解決。祝你一次裝通少走彎路。