業(yè)無人機遙感作物監(jiān)測實戰(zhàn))
簡介面向智慧農(nóng)業(yè)、無人系統(tǒng)與目標檢測方向的研究者和工程師這份實戰(zhàn)文檔系統(tǒng)闡述了YOLOv11算法與多模態(tài)數(shù)據(jù)融合在農(nóng)業(yè)無人機遙感作物生長監(jiān)測中的完整應用方案。文檔共38頁以PDF單一文件打包壓縮包約2.07MB。內(nèi)容從YOLOv11的網(wǎng)絡結(jié)構(gòu)、損失函數(shù)與訓練過程切入逐步展開多模態(tài)數(shù)據(jù)融合的層次、策略與常見算法并給出作物生長監(jiān)測系統(tǒng)的總體架構(gòu)、數(shù)據(jù)采集、處理、分析及決策支持模塊的設計與開發(fā)步驟同時涵蓋實驗結(jié)果對比、面臨的挑戰(zhàn)和未來趨勢便于讀者按目錄章節(jié)快速定位所需內(nèi)容。已有116人學習適合希望掌握YOLOv11實際落地方法、快速構(gòu)建農(nóng)業(yè)遙感監(jiān)測系統(tǒng)技術框架的中高級開發(fā)者和研究人員。1. 農(nóng)業(yè)無人機遙感為什么繞不開 YOLOv11從看得到到數(shù)得清農(nóng)田監(jiān)測這件事真正難的從來不是“拍到了什么”而是“一張 2 億像素的正射影像里到底有多少株油菜、多少片區(qū)域發(fā)生了倒伏”。做遙感的人習慣用 NDVI 算長勢做視覺的人習慣用目標檢測框出目標而 YOLOv11多模態(tài)數(shù)據(jù)融合恰好把這兩條線擰到了一起可見光提供紋理和顏色多光譜提供生理狀態(tài)目標檢測提供空間位置和數(shù)量。這套組合的落地價值很直接——讓無人機遙感從“出圖”走到“出數(shù)”作物計數(shù)、倒伏面積、缺苗斷壟這些農(nóng)藝指標可以直接進田管系統(tǒng)。這篇文章面向的不是算法研究員而是想用無人機遙感做作物生長監(jiān)測的從業(yè)者。我會按一套可復現(xiàn)的流程走先解決多模態(tài)數(shù)據(jù)的對齊和標簽問題再講怎么把多光譜通道接進 YOLOv11 的輸入然后是訓練參數(shù)和小目標調(diào)優(yōu)最后落到 Jetson Nano 部署和推理結(jié)果保存。全程以 4000×4000 級別的正射影像和小地塊試驗田為背景你可以直接照抄參數(shù)也可以按自己田塊改。2. 多模態(tài)數(shù)據(jù)融合的前置工程可見光與多光譜的時空對齊很多人一上來就急著改網(wǎng)絡結(jié)構(gòu)結(jié)果數(shù)據(jù)層面先翻車RGB 影像里的一株玉米在多光譜影像里偏了兩個像素訓練出來的模型等于在學兩套坐標系。多模態(tài)融合的第一步從來不是模型而是讓所有輸入在空間和時間上嚴格對齊。這一步做不好后面所有的“融合”都是偽命題。2.1 傳感器差異與采集參數(shù)DJI P4 Multispectral 和 MicaSense RedEdge 怎么選農(nóng)業(yè)無人機遙感最常見的多模態(tài)組合是“可見光 RGB 多光譜”而不是高光譜。原因是多光譜相機便宜、重量輕、數(shù)據(jù)處理鏈路成熟而且 NDVI歸一化植被指數(shù)這類經(jīng)典農(nóng)學指標只需要紅邊和近紅外兩個波段就能算出來。市面上用得最多的兩款是 DJI P4 Multispectral以下簡稱 P4M和 MicaSense RedEdge-P。P4M 是一體機自帶 RTK 和 DLSDownwelling Light Sensor輻照度傳感器RTK 保證影像坐標精度在厘米級DLS 記錄光照變化用于反射率校正。對剛起步的項目我強烈建議選 P4M因為它把兩個最容易出錯的環(huán)節(jié)——定位和輻射定標——在硬件層解決了。RedEdge-P 的優(yōu)勢是波段更多多了紅邊和海岸藍但你需要自己配 RTK 基站和 DLS 校準板數(shù)據(jù)處理復雜度會明顯上升。采集參數(shù)上有一個容易被忽略的指標叫“航向重疊率”。做正射拼圖時航向重疊 75%、旁向重疊 60% 是常規(guī)值但做多光譜作物監(jiān)測我一般會把航向重疊提到 80%。原因很簡單多光譜相機的視場角比 RGB 窄重疊率低了邊緣像素的配準誤差會直接傳導到 NDVI 計算里。飛行高度則取決于你要檢測的目標——測單株玉米飛行高度 30 米以下地面分辨率 2 厘米以內(nèi)測整片田的倒伏區(qū)域60 米高度即可地面分辨率約 4 厘米再高就損失細節(jié)了。2.2 影像對齊的三種落地方案Pix4Dfields、OpenDroneMap 與人工配準多模態(tài)對齊的實質(zhì)是讓 RGB 影像、多光譜影像和 NDVI 影像擁有同一個地理坐標系和同一套像素網(wǎng)格。常見做法有三個復雜度遞升Pix4Dfields專為農(nóng)業(yè)設計能直接輸出對齊后的多光譜反射率圖內(nèi)置 NDVI、NDRE 等指數(shù)計算。操作上是導入影像、選傳感器模型、跑三角測量全程圖形界面地塊級別的項目基本夠用。缺點是貴而且處理大影像時對內(nèi)存不友好8GB 內(nèi)存的機器跑 4000×4000 會卡到懷疑人生。OpenDroneMapODM開源替代品用命令行的方式做正射拼接和反射率計算配好 Docker 后一條命令就能跑完。ODM 的輸出的對齊精度取決于地面控制點GCP的質(zhì)量沒有 GCP 時精度只能算“夠用”達不到“嚴格配準”。人工特征點配準在兩張影像上選道路交叉點、田埂拐角等穩(wěn)定特征點用多項式變換校正。這是兜底方案精度一般但勝在可控適合小面積試驗田或者已經(jīng)發(fā)現(xiàn)自動拼接結(jié)果有系統(tǒng)性偏移時手動補救。我在實際項目中用的組合是P4M 采集 → ODM 拼正射 → 用 NDVI 和 RGB 的互信息做一次微調(diào)配準。微調(diào)用的是 OpenCV 的findTransformECC它對光照差異不敏感很適合 RGB 與 NDVI 之間的對齊import cv2 import numpy as np def align_ecc(reference_gray, moving_image, max_iter50): # reference_gray: RGB 正射轉(zhuǎn)灰度 # moving_image: 多光譜/NDVI 影像需先縮放到參考尺寸 warp_matrix np.eye(2, 3, dtypenp.float32) criteria (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, max_iter, 1e-6) try: # 使用 ECC 算法對光照和局部噪聲比互信息法更穩(wěn) _, warp_matrix cv2.findTransformECC( reference_gray, moving_image, warp_matrix, cv2.MOTION_AFFINE, criteria, None, 5 ) except cv2.error as e: print(ECC 對齊失敗檢查兩張影像是否同一區(qū)域, e) return None aligned cv2.warpAffine(moving_image, warp_matrix, (reference_gray.shape[1], reference_gray.shape[0]), flagscv2.INTER_CUBIC cv2.WINDOW_HANNING) return aligned這段代碼里有兩個關鍵點MOTION_AFFINE表示仿射變換能處理平移、旋轉(zhuǎn)和輕微縮放適合校正航向偏差WINDOW_HANNING是防止圖像邊界處的頻譜泄漏否則對齊結(jié)果會在邊緣出現(xiàn)抖動。如果 ECC 報錯最常見原因是兩張影像不在同一坐標系或尺度差太大先用 SIFT 特征點求一個初始變換再喂給 ECC。對齊完成后所有通道共享同一個像素網(wǎng)格這時才能進入通道拼接。2.3 標簽體系設計長勢分級與倒伏檢測的類別怎么定多模態(tài)數(shù)據(jù)融合的標簽設計比純視覺任務多一層考量你要檢測的目標類別是否真的能從多光譜信息中獲益。我見過不少項目把類別定得過于瑣碎——比如“健康玉米”“輕度黃化”“中度黃化”“重度黃化”——結(jié)果標注員崩潰模型也學不好。合理的做法是讓類別服務于農(nóng)藝決策而不是描述光譜狀態(tài)**對大多數(shù)作物我建議第一版只定四類目標growing正常長勢、weak弱長勢/黃化、lodging倒伏和bare缺苗/空壟。其中l(wèi)odging類用 RGB 就能學得不錯真正需要多光譜信息的是weak和bare——黃化初期在可見光下特征不顯著但在 NDVI 上會明顯偏離周邊田塊。如果后續(xù)需要更細的病蟲害分級可以在這個基礎上拆子類但每個子類至少要有 500 個標注實例否則建議把類別合并回粗粒度。標注工具我用的是 X-AnyLabeling支持 YOLO 格式導出遙感大圖可以先把正射影像切成 640×640 的瓦片再標注避免在大圖上直接框選導致的小目標漏標。標注完成后檢查一下每類的實例數(shù)量低于 300 的類別要么補標要么剔除——這個數(shù)字會直接影響第 4 章里講的小目標訓練效果。3. 把多模態(tài)數(shù)據(jù)喂進 YOLOv11輸入通道改寫與注意力融合數(shù)據(jù)對齊做好后剩下的核心問題是怎么把多光譜信息“接”進 YOLOv11。常見做法有三種通道拼接、多分支輸入、注意力融合。我按工程性價比排序前兩種是落地首選第三種是對精度的補充。這一章直接給可改動的代碼和插入位置不繞理論。3.1 7 通道輸入RGBRedEdgeNIRNDVI 的通道拼接實現(xiàn)最直接的融合方式是通道拼接channel concatenation把 RGB 的 3 個通道和 RedEdge、NIR、NDVI 等擴展通道拼在一起。假設你最終用 7 個通道R、G、B、RedEdge、NIR、NDVI、DVI或 CI輸入格式就從(B, 3, H, W)變成(B, 7, H, W)。YOLOv11 的模型定義文件支持直接修改通道數(shù)# train.py 片段加載 YOLOv11 并修改輸入通道 from ultralytics import YOLO model YOLO(yolo11n.pt) # 將第一個卷積層的輸入通道從 3 改為 7 old_conv model.model[0] # 即 model.model 中的 Conv 模塊 model.model[0] nn.Conv2d( in_channels7, out_channelsold_conv.conv.out_channels, kernel_sizeold_conv.conv.kernel_size, strideold_conv.conv.stride, paddingold_conv.conv.padding, biasFalse ) # 這里注意新卷積的權重無法直接繼承 3 通道權重 # 建議用以下方式做初始化把原 RGB 權重拷到前 3 通道 # 其余通道用 kaiming 初始化訓練時讓模型自己調(diào)。 with torch.no_grad(): model.model[0].weight[:, :3] old_conv.conv.weight model.model[0].weight[:, 3:] torch.nn.init.kaiming_normal_( model.model[0].weight[:, 3:], modefan_out, nonlinearityrelu )這段代碼的關鍵在后半段直接把新卷積的權重全量kaiming初始化而不是對前 3 通道做拷貝會導致訓練初期的梯度不穩(wěn)定——因為模型已經(jīng)加載了預訓練權重突然改變所有輸入分布會讓前幾輪 loss 飛漲。所以正確做法是保留 RGB 三通道的預訓練權重新增通道只做初始化讓模型在微調(diào)中自己學會“解讀”多光譜信息。參數(shù)上如果你用的是yolo11n第一個卷積的輸出通道是 32其他結(jié)構(gòu)不用動。訓練時記得在數(shù)據(jù)加載環(huán)節(jié)按 7 通道讀取影像修改load_image或自定義數(shù)據(jù)集類。3.2 注意力模塊選型CBAM 與 CA 在農(nóng)田場景的取舍通道拼接只是把信息堆在一起模型未必能有效利用。融合效果的第二個杠桿是注意力機制。在農(nóng)田場景兩個模塊值得優(yōu)先嘗試CBAM 和 CACoordinate Attention。CBAM 同時做通道注意力和空間注意力實現(xiàn)簡單加到 backbone 末端就能帶來穩(wěn)定的 1%~2% mAP 提升。它的空間注意力部分會學習“應該關注影像的哪個位置”這對倒伏區(qū)域檢測有幫助——倒伏區(qū)域往往是連片的、方向雜亂的空間注意力能幫助模型聚焦到這些區(qū)域而非整張圖。CA 則是對抗“整片農(nóng)田都長得很像”這類問題它把位置信息編碼進通道注意力模型能感知到“圖像左側(cè)的作物和右側(cè)的作物處于不同生長區(qū)域”在多光譜融合中能有效減少區(qū)域間的誤檢。選型建議小模型yolo11n優(yōu)先上 CBAM因為 CA 計算量大一些對 Nano 平臺不友好大模型或離線推理場景上 CA。實現(xiàn) CBAM 直接在模型定義里插入即可# 自定義卷積塊插入到 YOLOv11 的 backbone 指定位置 class CBAM(nn.Module): def __init__(self, channels, reduction16, spatial_kernel7): super().__init__() self.ch_att nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(channels, channels // reduction, 1), nn.ReLU(), nn.Conv2d(channels // reduction, channels, 1), nn.Sigmoid() ) self.sp_att nn.Sequential( nn.Conv2d(2, 1, spatial_kernel, paddingspatial_kernel // 2), nn.Sigmoid() ) def forward(self, x): # 通道注意力全局平均池化后學習每個通道的重要度 ch_weight self.ch_att(x) x x * ch_weight # 空間注意力在通道維度上求平均和最大拼接后學習空間位置重要度 avg_out torch.mean(x, dim1, keepdimTrue) max_out, _ torch.max(x, dim1, keepdimTrue) sp_weight self.sp_att(torch.cat([avg_out, max_out], dim1)) return x * sp_weight插入位置不是越靠前越好。在 backbone 第 2、3 階段插入會顯著增加計算開銷對小目標反而有害我一般只在 backbone 第 4 階段輸出后插入一次這里特征圖尺寸適中空間信息還在計算量也可控。3.3 YOLOv11 網(wǎng)絡里值得動的 3 個位置backbone 末端、Neck 和 HeadYOLOv11 總體的結(jié)構(gòu)是 backbone提取特征 neck融合多尺度 head預測框和類別。如果你不是想從零設計新網(wǎng)絡多數(shù)有效的改動集中在這三個位置Backbone 末端C3k2 之后這里接 CBAM 或 SE提升特征表達。改動成本低收益穩(wěn)定適合作為第一個嘗試點。Neck 的上采樣路徑遙感大圖的小目標通常在深層特征圖上信息已丟失可以在 PAN 上采樣到 P3 層之后追加一個輕量卷積頭讓它更關注小尺度特征。常見做法是把 neck 輸出的 P3 層再接一個 stride2 的小卷積加一個額外的檢測頭。Head 的回歸損失YOLOv11 默認用的 CIoU 在遙感目標長寬比極端比如倒伏條帶上收斂偏慢可以換成 SIoU對長條形目標有更明確的幾何約束。但我不建議第一次就改 Head。改 Head 對數(shù)據(jù)量要求高如果不是有上萬元洗出來的數(shù)據(jù)集很容易過擬合。先從 backbone 末端加注意力開始效果不夠再動 Neck最后才考慮 Head。一條路走到黑如果不是真心想發(fā)論文沒必要。4. 訓練參數(shù)與小目標調(diào)優(yōu)讓模型在 4000×4000 正射影像上不翻車把多模態(tài)通道接好只是開始真正的分水嶺在訓練環(huán)節(jié)。遙感影像的特點是大尺寸、小目標、正負樣本不均衡還有多光譜通道帶來的數(shù)值分布差異。這一章講清楚參數(shù)怎么設、小目標怎么處理、評估指標怎么定。4.1 超參數(shù)基線batch size、學習率、mosaic 與 epoch 的設置邏輯YOLOv11 的訓練超參數(shù)與之前版本差別不大但多模態(tài)輸入會改變最優(yōu)區(qū)間。我給一個可以直接套用的基線參數(shù)推薦值說明imgsz640遙感切片的標準輸入太大顯存扛不住batch16顯存 11GB 以上可用 32但注意 BN 統(tǒng)計更穩(wěn)的是 16epochs200遷移學習場景 100 起步多了容易疲勞lr00.01多模態(tài)輸入下建議降到 0.005防止新增通道梯度爆炸lrf0.01余弦退火到初始學習率的 1%mosaic1.0前 190 epoch 開啟后 10 epoch 關閉close_mosaic10最后 10 epoch 關閉 mosaic讓模型適應真實分布optimizerAdamW多模態(tài)場景下比 SGD 更容易收斂這里重點解釋mosaic和close_mosaic。YOLOv11 默認使用 mosaic 增強——把 4 張圖拼成一張這能大幅提升模型對尺度變化的魯棒性。但遙感切片有個特殊問題4 張不同田塊的影像拼在一起模型會學到“一塊地里有多塊不同作物”的錯誤分布。所以我在遙感任務里堅持最后 10~15 epoch 關閉 mosaic強制模型回到“單圖單田塊”的分布上。學習率方面多模態(tài)輸入的通道維度和數(shù)值范圍與純 RGB 不同。如果你把 NDVI范圍 -1~1和 RGB范圍 0~255直接拼接數(shù)值分布差異會讓前幾輪 loss 異常高。務必在數(shù)據(jù)加載時對每個通道做歸一化——NDVI 除以 2 再加 0.5 映射到 0~1RGB 直接除以 255。然后學習率再用 0.005 起步觀察前 3 個 epoch 的 loss 下降曲線如果 loss 從極高位如 3.0 以上才開始降說明數(shù)值分布還是有問題。4.2 小目標優(yōu)化的兩條路線P2 輸出層與切圖SAHI4000×4000 的影像切成 640×640 后單株玉米可能只占 20×20 像素屬于典型小目標。YOLOv11 默認從 P3 層開始檢測感受野偏大對這類目標不友好。兩條優(yōu)化路線按性價比排序路線一SAHISlicing Aided Hyper Inference。這其實是推理階段的技巧但訓練也受益。把推理影像切成多個 320×320 或 640×640 瓦片分別過模型再把結(jié)果合并回原坐標。它不需要改模型對一個訓練好的 YOLOv11 直接提升小目標 mAP代價是推理時間翻倍。SAHI 的切片重疊率建議 0.2低于 0.1 會導致瓦片邊緣的目標被切開過高則重復檢測增多。路線二加 P2 檢測頭。讓模型直接輸出更高分辨率的特征圖對小目標敏感得多。但 P2 頭的計算量增加約 25%且淺層特征噪聲多需要更多數(shù)據(jù)配合。如果你標注只有一兩千張不建議上 P2老老實實用 SAHI 更安全。實戰(zhàn)中我一般兩者結(jié)合訓練時用 640 輸入加 mosaic 增強推理時用 SAHI 切片加 NMS 合并。落地時得到的 mAP 會比單模型高出 3~5 個點尤其對倒伏邊緣這類形狀不規(guī)整的目標效果明顯。4.3 評估指標mAP 之外的漏檢率與邊緣行準確率模型訓練完不能只看 mAP。農(nóng)業(yè)遙感監(jiān)測對漏檢的容忍度極低——漏掉一株病株可能意味著這一片的防治預案全錯。在 mAP0.5 之外必須看兩個指標漏檢率False Negative Rate統(tǒng)計所有標注目標中沒被模型預測出的比例。對倒伏區(qū)域漏檢率應控制在 5% 以下對弱苗可以放寬到 10%因為弱苗邊界本身模糊。邊緣行準確率把檢測結(jié)果按田壟分列單獨統(tǒng)計每行的準確率。田間作業(yè)時邊緣行往往受光照、土壤背景干擾最大是模型最容易翻車的地方。這兩個指標決定了模型能不能用于田間決策而不是只能發(fā)論文。評估腳本可以自己寫加載驗證集標注跑一遍推理然后按目標中心點坐標分桶統(tǒng)計。如果邊緣行準確率明顯低于整體說明模型學到的主要是“田地中心”的特征分布這時需要檢查是否某些樣本在訓練時被裁剪過多正射影像邊緣的目標沒被完整標注。5. 農(nóng)田場景的 5 個踩坑記錄從數(shù)據(jù)穿幫到部署掉點這一章不按流程順序而是按“現(xiàn)象 → 原因 → 解決”寫我在多模態(tài)融合項目里真實遇過的 5 個問題。每一條都值得你在動手前先看一眼???1NDVI 影像視覺正常但模型訓練 loss 不降現(xiàn)象模型收斂后 mAP 只有 30% 左右明顯低于預期。 原因NDVI 通道數(shù)值范圍是 -1~1RGB 是 0~255拼接后網(wǎng)絡前幾層被 NDVI 通道的數(shù)值范圍主導梯度傳播異常。 解決每個通道單獨歸一化到 0~1并檢查數(shù)據(jù)加載代碼中是否對 NDVI 做了全局歸一化。歸一化后如果還不行把 NDVI 通道放入第 4 個及以后的通道讓前幾層卷積優(yōu)先處理 RGB 的空間紋理信息。坑 2航拍當天有薄云多光譜和 RGB 拼接后出現(xiàn)邊緣錯位現(xiàn)象模型預測的倒伏區(qū)域邊界鋸齒狀明顯沿影像拼接縫分布。 原因薄云導致多光譜和 RGB 相機記錄的時間差內(nèi)云影移動導致幾何錯位。 解決采集時把飛行窗口控制在 10:00~14:00這段時光照最穩(wěn)定影像拼接后在融合前做一次 ECC 局部配準。如果已經(jīng)錯位且無法重飛在標注時避開云影覆蓋區(qū)域???3P4M 的 DLS 校準無效反射率值整體偏移現(xiàn)象同一塊田在不同架次飛行的 NDVI 分布差異明顯。 原因DLS 傳感器被機翼遮擋或積灰導致輻射定標不準。 解決起飛前清潔 DLS 并做一次白板校準處理時用 Pix4Dfields 里的“反射率校正”功能輸入一個已知反射率的靶標區(qū)域手動校準。坑 4小目標模型訓練時 mAP 高但實際部署到邊緣設備后檢測數(shù)量銳減現(xiàn)象Jetson 上跑出的目標數(shù)量只有離線 GPU 的 70%。 原因TensorRT 導出時用了 INT8 量化但量化校準集只有幾十張普通農(nóng)田圖沒有覆蓋多光譜通道的典型分布。 解決部署模型保留 FP16如果需要 INT8校準集必須覆蓋“弱苗倒伏強光陰影”這些組合至少 500 張切片不能隨便拿訓練集的子集湊數(shù)???5訓練時開了 mosaic但遙感切片的拼接導致跨圖目標貼在一起現(xiàn)象模型把兩張圖拼縫處的作物框成了一整條。 原因mosaic 強制模型學習“不同田塊在同一圖中存在”但實際推理時單張影像中只有一種田塊分布模型產(chǎn)生高頻誤檢。 解決按 4.1 的基線最后 10 epoch 關閉 mosaic。如果問題仍存在把 mosaic 比例直接降為 0.5給模型更多“同圖一致”的樣本。6. Jetson Nano 部署與推理落盤從 TensorRT 導出到結(jié)果保存訓練和評估做完最后一步是把模型部署到 Jetson Nano 這類邊緣設備上讓無人機機載或田頭盒子直接跑推理。這一步最核心的不是“讓模型跑起來”而是“讓推理結(jié)果能保存、能對接下游系統(tǒng)”。6.1 導出與量化FP16 與 INT8 的選擇以及校準集YOLOv11 部署到 Jetson Nano 有兩條路徑直接用ultralytics的 Python 推理或者導出為 TensorRT 引擎。前者簡單但 Nano 上實測只能跑到每秒 3~5 幀不滿足連續(xù)監(jiān)測需求后者能到每秒 10 幀以上但有一個關鍵選擇FP16 還是 INT8。Jetson Nano 的 INT8 性能比 FP16 高約一倍但精度下降明顯尤其在多光譜融合場景——NDVI 通道的數(shù)值差異本來就很細微。我的建議是如果不是顯存嚴重不足直接用 FP16。導出命令如下# 在訓練機上導出 TensorRT FP16 引擎注意 ultralytics 版本 8.3.0 yolo export modelruns/train/exp/weights/best.pt formatengine imgsz640 halfTrue dynamicFalse # 如果訓練機沒有 GPU可以在 Jetson 上直接重新導出 yolo export modelbest.pt formatengine imgsz640 halfTrue導出后得到一個.engine文件約幾十 MB。關鍵參數(shù)halfTrue避免int8的校準流程dynamicFalse固定輸入尺寸這在邊緣設備上能減少動態(tài) shape 帶來的性能損失代價是輸入影像必須 resize 到 640×640。6.2 推理腳本預測、保存標注圖與結(jié)構(gòu)化結(jié)果部署后必須同時保存兩種東西可視化標注圖給人看和結(jié)構(gòu)化結(jié)果給田管系統(tǒng)用。完整推理腳本的骨架如下from ultralytics import YOLO import cv2 import json import numpy as np # 加載 TensorRT 引擎Nano 上建議直接加載 .engine model YOLO(best_fp16.engine) # 遠程或本地正射影像路徑 img_path /data/field_0417.png img cv2.imread(img_path) # 推理640x640 輸入置信度 0.25NMS IoU 0.45 results model.predict(img, imgsz640, conf0.25, iou0.45, verboseFalse) # 保存標注圖在原圖上畫框 annotated results[0].plot() cv2.imwrite(result_annotated.jpg, annotated) # 保存結(jié)構(gòu)化結(jié)果類別、置信度、歸一化框坐標 boxes results[0].boxes output [] for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) # 歸一化坐標x_center, y_center, width, height x_c, y_c, w, h box.xywhn[0].tolist() output.append({ class: model.names[cls_id], confidence: round(conf, 4), bbox_xywhn: [round(v, 4) for v in [x_c, y_c, w, h]] }) with open(result.json, w, encodingutf-8) as f: json.dump(output, f, ensure_asciiFalse, indent2) print(檢測到目標數(shù):, len(output))這段代碼里有三個參數(shù)值得說明conf0.25是置信度閾值農(nóng)田低對比度場景建議設為 0.2 而不是默認 0.25否則弱苗這類低置信目標是會被濾掉的iou0.45是 NMS 的 IoU 閾值倒伏區(qū)域密集重疊這個值調(diào)高到 0.5 能減少相鄰框被合并xywhn輸出的是歸一化坐標方便下游系統(tǒng)換算到任意尺寸。注意如果你用model.predict直接喂整張大圖Nano 的顯存會爆。正確做法是配合 4.2 的 SAHI 切片推理把大圖切成瓦片逐片送檢最后合并。合并邏輯里重疊區(qū)域的框用 NMS 去重閾值用 0.3避免同一目標重復計數(shù)。6.3 從靜態(tài)檢測到連續(xù)監(jiān)測無人機巡航下的ID保持最后一章里最有價值的一個技巧是把單幀檢測升級為連續(xù)監(jiān)測。無人機在田塊上方巡航拍攝視頻流時連續(xù)幀里的同一株作物會不斷出現(xiàn)如果每一幀都獨立檢測統(tǒng)計數(shù)量時就會重復計數(shù)。解決方案是用目標跟蹤算法最常見的是 ByteTrack 或 BoT-SORT給每一個目標分配一個穩(wěn)定的 ID統(tǒng)計時只統(tǒng)計新出現(xiàn)的 ID。YOLOv11 官方托管在 ultralytics 里自帶的跟蹤接口可以直接用from ultralytics import YOLO model YOLO(best_fp16.engine) # 逐幀推理并跟蹤 for frame in video_frames: results model.track(frame, persistTrue, trackerbytetrack.yaml) # results[0].boxes.id 保存每個目標的跟蹤 ID # 結(jié)合框坐標、類別和時間戳寫入數(shù)據(jù)庫或 CSV關鍵參數(shù)是persistTrue它告訴跟蹤器上一幀的 ID 信息要傳遞到當前幀如果漏寫每個幀都會重新分配 ID計數(shù)直接失效。實測在 Jetson Nano 上ByteTrack 的額外開銷幾乎可以忽略每秒仍能保持 8~10 幀的穩(wěn)定輸出。從單幀檢測到連續(xù)監(jiān)測真正的變化不是模型而是“結(jié)果的組織方式”——從“這張圖里有幾株弱苗”變成“這趟巡航里新發(fā)現(xiàn)了哪些區(qū)域的弱苗”。后者才是田管系統(tǒng)真正需要的決策信息。這幾年做農(nóng)業(yè)遙感監(jiān)測我最大的一個教訓是不要把多模態(tài)融合想成一個模型問題它是一個數(shù)據(jù)工程問題——先解決對齊再解決歸一化然后才是網(wǎng)絡設計最后一公里在部署和結(jié)果落盤。只要每一步的參數(shù)設對YOLOv11多光譜融合這套流程在 30~50 畝的試驗田上完全可以做到 90% 以上的檢測可靠性。希望這一篇的踩坑記錄和參數(shù)基線能在你從正射影像到田間決策的路上省下幾個月的調(diào)試時間。本文還有配套的精品資源點擊獲取