简介:目标检测是计算机视觉的基础任务,在遥感影像分析中,小目标识别始终是难点。YOLOv11作为最新一代实时检测算法,依靠深度可分离卷积与多尺度特征金字塔,在检测精度与推理速度间取得良好平衡。农业无人机遥感场景下,仅用光学影像存在信息盲区,多光谱与热红外数据的融合能有效补充作物营养和水分胁迫信息。从数据选型、影像配准到YOLOv11训练参数调优,再到特征层融合与边缘设备部署,整个链路需要系统化设计。这套完整方案可帮助开发者将YOLOv11迁移到小目标农业检测任务中,实现从单张影像到地块级长势评估,为智慧农业落地提供工程化参考。
1. 农业无人机遥感到底卡在哪:YOLOv11与多模态数据融合的切入点
第一次飞农业项目,是在一块八百亩麦田上。无人机带着多光谱和热红外相机转一圈,回来后两千多张航片全是绿,人眼根本分不出哪块缺氮、哪块已经有了条锈病。这时才明白:无人机遥感最难的不在飞,在把数据变成结论。YOLOv11解决“目标在哪、是什么”,多模态数据融合解决“只看光学图不够”。这份PDF刚好把两件事串成一套完整系统:从传感器选型、影像预处理,到YOLOv11网络结构与训练参数,再到光学、多光谱、热红外三种模态的分层融合与实验验证。适合正在做智慧农业项目的人,也适合想把YOLOv11迁移到小目标农业场景的开发者。
2. 农业无人机遥感的数据体系:平台、传感器与模态怎么选
无论YOLOv11多强,没有合适的数据都是白搭。无人机遥感的数据质量,从平台和传感器选型那一刻就定了。文档第二章把这部分讲得比较细,我先梳理一遍选型逻辑,因为后面所有训练和融合工作,都建立在你手上到底有什么数据之上。
2.1 无人机平台:多旋翼与固定翼的作业边界
多旋翼无人机能垂直起降、悬停稳定,适合在小面积农田和地形复杂的区域作业。它可以灵活调整飞行高度和速度,从不同角度补拍局部细节,对地块边角、果树行间这类场景特别有用。固定翼无人机则胜在飞行速度快、续航时间长,一次任务覆盖上千亩农田,适合大面积普查。
实际选型不能只看续航,还要看任务频率和载荷重量。多旋翼载重有限,挂多光谱相机勉强,再叠加热红外就要仔细算起飞重量;固定翼载荷大但起降条件苛刻,田间地头不一定有合适的跑道。我一般做地块级实验用多旋翼,做县域级普查才考虑固定翼,不会上来就按最大面积买固定翼——悬停姿态对多光谱影像拼接的影响很大,固定翼航线转弯半径大,数据重叠率需要重新设计。
下表是我常用的对比口径:
| 维度 | 多旋翼 | 固定翼 |
|---|---|---|
| 起降方式 | 垂直起降 | 需要跑道或弹射/手抛 |
| 巡航速度 | 慢,悬停能力强 | 快,单位时间覆盖大 |
| 续航时间 | 短,适合小地块 | 长,适合大面积普查 |
| 数据重叠率控制 | 灵活,可随时补拍 | 受转弯半径限制 |
| 典型载荷 | 光学、多光谱、热红外 | 多光谱、雷达、激光点云 |
2.2 遥感传感器:光学、多光谱、热红外与雷达各管哪一段
光学相机提供可见光图像,分辨率高、直观,能直接看到作物颜色、株型、病虫害斑点,但对光照敏感,阴天和逆光条件下质量下降明显。多光谱相机增加了近红外波段,能反映叶绿素含量和叶面积指数,用于评估营养状况和生长活力——叶绿素含量高通常意味着作物长势旺,这个判断在可见光图像里看不出来。热红外相机测的是作物表面温度,水分胁迫时蒸腾减弱、温度升高,病虫害早期也常伴随局部温度异常,所以热红外在水分监测和病害预警里非常关键。雷达能穿透云层甚至部分植被,获取地形和作物结构信息,全天候能力强,但数据解释门槛高,普通农业项目并不总能用好。
不同模态不是都要上,按监测目标定:查水分优先热红外,查营养优先多光谱,查结构才轮到雷达。文档后面多次提到的融合实验,主要以光学、多光谱、热红外三路组合为主,也是因为这三者的采集成本相对低、处理链成熟。在做系统设计前,先把传感器清单固定下来,后面每一条数据流和模型分支才能定住。
2.3 数据预处理流程:从原始影像到可训练样本的四个步骤
拿到传感器原始数据不能直接喂给YOLOv11,要先过一遍预处理。文档里把这部分放在数据处理层设计,常见做法可以拆成四个连续步骤:
第一步是几何校正与辐射校正。无人机影像存在镜头畸变和光照不均,不校正,后续拼接和检测都会把误差放大。第二步是影像拼接,把单帧航片拼成正射影像,这一步最影响训练样本质量,拼接缝处理不好,模型会在接缝位置学到假特征。第三步是多模态配准,把多光谱、热红外和光学影像对齐到同一坐标系,这一步是所有融合工作的前置条件。第四步是数据增强,通过随机裁剪、旋转、翻转、颜色变换来提升样本多样性。
| 步骤 | 目标 | 关键点 |
|---|---|---|
| 几何/辐射校正 | 消除畸变和光照误差 | 相机内参、辐定标板 |
| 影像拼接 | 生成正射影像 | 重叠率建议60%以上 |
| 多模态配准 | 统一空间坐标系 | 精度直接影响融合效果 |
| 数据增强 | 提升泛化能力 | 不要改动语义标签 |
第四步相对好处理,前两步花时间但问题可控,真正容易翻车的是第三步配准。配准错位在半像素以内,特征层融合还能接受;一旦错位超过两三个像素,多光谱信息叠加到错误位置上,检测结果不升反降。我习惯在进入模型训练前,先做一次可视化检查——把光学图和热红外图半透明叠加,直接看道路和地头边界是否重合。这一步不做,后面所有融合效果分析都不可信。
3. YOLOv11的网络结构与训练配置:从原理到能落地的参数
这一章是整套系统的核心。文档从YOLOv1一路梳理到YOLOv11,我挑直接影响训练和部署的部分展开:网络结构、损失函数、训练参数。把这三个点吃透,换到自己的地块数据上才敢动参数。
3.1 YOLO家族演进的关键转折
理解YOLOv11为什么这样设计,绕不开前面几代的思路变化。YOLOv1把目标检测当成回归问题处理,一次扫描直接输出边界框和类别概率,速度快但定位精度差,小目标和密集目标表现不好。YOLOv2引入批量归一化和锚框,用聚类确定锚框尺寸,解决了部分尺度问题。YOLOv3用多尺度特征融合,在不同尺度的特征图上分别检测,检测头对大中小目标都有响应。YOLOv4补上Mosaic数据增强、自适应锚框和PANet特征金字塔,精度和速度到了一个新的平衡点。YOLOv5做了PyTorch工程化,训练部署门槛大幅降低。
YOLOv11是这套思路里的最新状态,定位于复杂场景下的精度与速度权衡。农业无人机影像的特殊之处在于目标小、背景杂、光照变化大,YOLOv11的网络结构对这三类问题都有对应设计。网上很多人搜“yolov11 网络结构”,实际要看的就是骨干、颈部和检测头这三个部分怎么改的。
3.2 骨干网络里的两种核心模块与简化实现
YOLOv11骨干网络采用了深度可分离卷积和残差块的组合。深度可分离卷积把标准卷积拆成深度卷积加逐点卷积,参数量和计算量显著降低;残差块通过跳跃连接缓解梯度消失,让网络能训练得更深。下面这份简化实现对应文档中的骨干部分,帮助理解模块关系:
import torch import torch.nn as nn class DepthwiseSeparableConv(nn.Module): """深度可分离卷积:depthwise 按通道分组卷积,pointwise 做通道融合""" def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1): super().__init__() self.depthwise = nn.Conv2d( in_channels, in_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=in_channels # 每个通道单独卷积 ) self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1) def forward(self, x): return self.pointwise(self.depthwise(x))参数含义:in_channels是输入特征通道数,out_channels是输出通道数,groups=in_channels让每个输入通道独立做卷积,不跨通道混合。标准卷积的参数量约等于in_channels * out_channels * k * k,深度可分离卷积约等于in_channels * k * k + in_channels * out_channels。当输出通道数较大时,后者省掉的参数非常可观。
残差块在此基础上加跳跃连接:
class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.conv1 = DepthwiseSeparableConv(in_channels, out_channels) self.bn1 = nn.BatchNorm2d(out_channels) self.conv2 = DepthwiseSeparableConv(out_channels, out_channels) self.bn2 = nn.BatchNorm2d(out_channels) # 输入输出通道不一致时,shortcut 用 1x1 卷积对齐 self.shortcut = nn.Identity() if in_channels == out_channels else nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1), nn.BatchNorm2d(out_channels) ) def forward(self, x): residual = self.shortcut(x) out = torch.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) return torch.relu(out + residual)shortcut分支是残差连接的关键,它保证反向传播时梯度能直接流回浅层。文档里的完整骨干还包含SPPF和C2PSA这类模块,代码示例只展示到前半段。理解这几个模块后,再打开网络结构图逐层对照,能看出YOLOv11在尺度处理上比前代更细。颈部用了改进的特征金字塔,自底向上加上自顶向下融合不同尺度特征,并引入类似SE的注意力机制增强关键通道。检测头在不同尺度特征图上分别预测,配自适应锚框,让网络匹配不同大小目标。
对遥感场景,最需要记住的是:骨干网络下采样次数和颈部融合尺度直接决定小目标能不能被保住。如果特征图下采样倍数太高,麦穗和病斑这类小目标在深层特征里几乎消失。解决思路一是提高输入分辨率,二是依赖颈部在小尺度特征图上的融合分支。
3.3 损失函数拆解:CIoU、置信度与分类损失的权重关系
YOLOv11的损失由三部分加权组成:边界框回归损失、目标置信度损失、类别分类损失。
边界框回归用的是CIoU损失。CIoU不只算预测框和真实框的交并比,还加入中心点距离和长宽比一致性。两个框完全没有重叠时,普通IoU损失梯度接近零,CIoU仍能通过中心点距离项提供梯度,这对训练初期的收敛很重要。置信度损失用二元交叉熵,判断每个网格位置到底有没有目标;分类损失用多分类交叉熵,判断目标属于哪个类别。最终总损失是这三项乘以各自的权重系数后相加。
| 损失项 | 作用 | 常见权重配置 |
|---|---|---|
| CIoU损失 | 框位置与形状回归 | 0.05 左右 |
| 置信度损失 | 区分有无目标 | 1.0 左右 |
| 分类损失 | 类别判断 | 0.5 左右 |
实际训练时重点关注box_loss和cls_loss两条曲线。如果分类损失一直降不下来,首先怀疑类别样本不均衡和标注噪声,而不是调节权重系数。无人机影像里病斑只占几十像素,负样本远远多于正样本,这类问题常出现。
3.4 训练指令与参数调优:迁移学习、数据增强与监控
训练YOLOv11不建议从随机初始化开始,直接加载预训练权重能大幅缩短收敛时间。数据准备阶段把影像切成适当尺寸、转成YOLO标注格式,然后运行训练命令。
yolo detect train \ model=yolo11n.pt \ data=wheat.yaml \ epochs=200 \ imgsz=1280 \ batch=16 \ lr0=0.01 \ lrf=0.01 \ mosaic=1.0 \ close_mosaic=10 \ patience=30 \ device=0参数设置:model=yolo11n.pt表示加载预训练权重做迁移学习;imgsz=1280是输入分辨率,无人机影像细节多,默认的640会丢掉大量小目标,但分辨率升高会显著增加显存占用;mosaic=1.0打开Mosaic数据增强,把四张图拼成一张训练,丰富上下文信息;close_mosaic=10表示最后10个epoch关闭Mosaic,让模型在接近真实分布的样本上收尾;patience=30是早停阈值,验证集mAP连续30个epoch不提升就提前结束。
显存不够时优先降低batch而不是imgsz。我通常把batch从16降到8或4,同时配合梯度累积来稳定训练。学习率策略上用余弦退火,初始学习率调高、末期降低,让模型在损失面底部精细调整。训练过程要盯损失曲线和mAP指标,训练集损失持续下降但验证集mAP停滞,就是过拟合信号,此时减少训练轮数或增加数据增强。
推理阶段的保存参数也常被忽略。很多人搜“yolov11保存推理结果”,实际是运行:
yolo predict \ model=runs/detect/train/weights/best.pt \ source=./val_images \ save=True \ save_txt=True \ conf=0.25save=True保存的是画了检测框的图像,用于人工查看;save_txt=True才把类别和坐标存成文本标签,下游统计病斑密度、计算覆盖面积都要靠这个文本结果。只看图不落文本,后续分析没法做。
4. 多模态数据融合:配准、分层与特征工程
多模态融合的价值在于把不同传感器的优势叠加起来,弥补单一模态的信息盲区。这一章把融合层次、配准实现和特征工程讲清楚,代码可以直接落到项目里改。
4.1 融合层次怎么选:数据层、特征层、决策层
融合不是越早越好,而是越匹配任务场景越好。文档把融合分成三个层次,应用场景完全不同:
| 融合层次 | 操作对象 | 优点 | 代价 |
|---|---|---|---|
| 数据层融合 | 原始像素 | 保留信息最多 | 配准要求极高,数据量巨大 |
| 特征层融合 | 提取后的特征 | 计算量可控,工程常用 | 特征设计决定上限 |
| 决策层融合 | 各模态独立决策结果 | 灵活性高,容错强 | 信息利用较浅 |
数据层融合要在像素级别对齐多光谱和热红外影像,先做完配准再做融合,任何一个像素错位都会直接影响后续检测。特征层融合是每路模态先提取自己的特征,再拼接或变换到同一特征空间,计算量适中,是农业项目里最常见的做法。决策层融合则让光学、多光谱、热红外各跑各的模型,最后用投票或加权方式汇总结论,某个传感器故障时系统还能降级运行。
文档后面讲到的病虫害监测、营养状况评估、农田水分监测三个案例,恰好对应三种层次的应用:病虫害监测用特征层融合提取光谱异常,营养评估更适合数据层融合计算植被指数,水分监测用决策层融合综合温度变化和光谱特征。
4.2 像素级配准:SIFT+FLANN+RANSAC的落地实现
数据层融合的前置条件是精确配准。无人机影像同一次飞行中,光学、多光谱和热红外传感器视角略有差异,必须先把它们对齐。文档给出的实现基于SIFT特征点提取和FLANN匹配,再用RANSAC求解单应变换矩阵,下面是补全后的可用版本:
import cv2 import numpy as np def feature_based_registration(img1, img2, ratio=0.7, ransac_thresh=5.0): """ 将 img1 配准到 img2(参考图) """ sift = cv2.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # FLANN 特征匹配 index_params = dict(algorithm=1, trees=5) # FLANN_INDEX_KDTREE search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1, des2, k=2) # Lowe ratio test:最近距离 / 次近距离 < ratio 才保留 good = [m for m, n in matches if m.distance < ratio * n.distance] if len(good) < 4: # 少于4个点无法求单应矩阵 return None, None src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, ransac_thresh) h, w = img2.shape[:2] registered = cv2.warpPerspective(img1, H, (w, h)) return registered, H各参数含义:ratio=0.7是Lowe ratio test的阈值,越严格匹配点越少但越可靠;ransac_thresh=5.0是RANSAC内点距离阈值,数值越大允许的误差越大;cv2.findHomography计算两个平面之间的单应变换矩阵,返回的H用于把待配准影像映射到参考影像坐标系。配准完成后,用半透明叠加图检查地头边界是否吻合,这一步不能省。
4.3 特征层融合:从NDVI到特征拼接
特征层融合的第一步是把各模态数据转成有物理意义的特征。多光谱数据最常用的是NDVI归一化植被指数,计算方式很简单:
import numpy as np # 多光谱数据中的红光和近红外波段 red = img_red.astype(np.float32) nir = img_nir.astype(np.float32) # NDVI 取值范围 -1 到 1,接近 1 表示植被茂盛 ndvi = (nir - red) / (nir + red + 1e-6) # 加 1e-6 防止除零NDVI能有效反映叶绿素含量和植被覆盖度,是作物营养评估的常用特征。得到特征后,再做特征拼接:
import numpy as np # feature_rgb 来自光学图像分支,feature_ms 来自多光谱分支 # 每一行对应一个检测框或一个地块的统计特征 feature_rgb = np.random.randn(128, 256) # 示意数据 feature_ms = np.random.randn(128, 128) # 示意数据 # 按列拼接 feature_concat = np.concatenate([feature_rgb, feature_ms], axis=1)特征拼接前必须分别做标准化,否则数值范围大的模态会主导分类结果。我在这里翻过一次车:纹理特征和NDVI直接拼接,训练时损失曲线震荡,后来把每路特征各自做z-score标准化再拼接,曲线才恢复正常。标准化代码很简单:
def zscore(x): return (x - x.mean(axis=0)) / (x.std(axis=0) + 1e-8) feature_rgb_norm = zscore(feature_rgb) feature_ms_norm = zscore(feature_ms) feature_concat = np.concatenate([feature_rgb_norm, feature_ms_norm], axis=1)注意力机制也常被用在特征融合阶段。文档里提到SE模块的思想是让网络自动学习各通道的重要程度,类似思路扩展到跨模态注意力,让网络自己决定当前样本更依赖光学特征还是光谱特征。现在不少人在这类检测模型里替换注意力结构,比如HCANet这种带注意力融合的设计,思路都是一脉相承的。
4.4 决策层融合:投票、加权与贝叶斯
决策层融合不碰底层特征,各模态分别出检测结果,最后合成决策。三种常见方法:投票法直接少数服从多数;加权平均法按模态可靠性分配权重;贝叶斯融合则用先验概率和后验概率做推断。加权投票的代码非常轻量:
import numpy as np def weighted_vote(preds, weights): """ preds: 各模态输出的类别概率矩阵,形状 (n_modals, n_samples, n_classes) weights: 各模态的权重,例如 [0.5, 0.3, 0.2] """ weighted = np.sum(preds * np.array(weights)[:, None, None], axis=0) return np.argmax(weighted, axis=1)决策层融合的优势在系统鲁棒性上。某个模态当天采集质量差,权重可以临时下调,系统不会因为一路数据失效而整体瘫痪。缺点是信息利用相对浅层,模态之间的互补细节在特征层面已经丢失。实际项目中,我常用特征层融合做主分支,决策层融合做兜底校验,两套结果差异过大时触发人工检查。
5. 系统开发与部署的常见问题排查:环境、显存、配准与推理
这一章是实际操作里踩过坑的汇总。每一类问题都按现象、原因、解决的顺序记录,照着排查能省下不少时间。
5.1 环境配置坑:虚拟环境版本对不上就全盘翻车
现象:conda环境装好ultralytics后,跑训练直接报CUDA相关错误,或者提示找不到某个动态链接库。
原因:Python版本、CUDA版本和PyTorch版本三者不匹配,是这类报错的最常见来源。Python 3.11搭配较旧版本的PyTorch,经常出现编译层面的兼容问题;新安装的依赖覆盖旧版本,也会让运行结果变得不可预知。
解决:建干净虚拟环境,先查本机显卡驱动支持的CUDA版本,再按官方组合装对应版本的PyTorch和ultralytics,不要图省事全用最新版。装完后跑一遍官方示例确认流程通了,再开始训练自己的数据。环境配置这件事,我每次新换机器都强制留一份可复制的requirements列表,避免重蹈覆辙。
5.2 显存溢出与小目标检测:分辨率与切图策略
现象:imgsz=1280一启动就提示CUDA out of memory;把无人机大图缩到640后病斑和小麦穗漏检严重。
原因:无人机影像里的目标只有几像素到几十像素,粗暴缩放会把小目标直接抹掉;而提高分辨率又带来显存压力,两者形成矛盾。
解决:两手同时做。一是把batch降到4或8,保住输入分辨率;二是把大正射影像切成固定尺寸的小图训练,推理时用同样尺寸滑窗,窗口间留25%重叠。重叠率不要太高,否则同一目标在多个窗口重复出现,评估mAP时会重复计数。另外,Mosaic增强本身会把四张图拼在一起,相当于变相降低了单张图的目标尺度,小目标严重时可以把Mosaic比例调低到0.5左右观察效果。
5.3 多模态配准错位与融合不退步的排查
现象:融合后mAP反而不如单模态光学图像的结果,最典型的是加了多光谱和热红外分支,指标没有任何提升。
原因:配准错位是最常见的第一嫌疑。热红外传感器分辨率通常低于光学传感器,直接参与融合会把模糊信息带进来,拖累整体检测精度;另一个原因是特征拼接前没做标准化,大数值模态压过了小数值模态。
解决:先可视化检查配准结果,把光学图和多光谱图半透明叠加,看道路、地块边缘是否对齐。对不上就回炉重做配准,或改用特征层融合绕开像素级错位问题。如果配准没问题,检查每路特征是否分别标准化。还有一个常被忽略的点:热红外分辨率低时,先做上采样对齐到光学分辨率,再做融合,效果会明显改善。
5.4 推理结果保存与边缘设备部署
现象:跑完预测找不到结果文件,或者只看到图片没看到文本标签;导出ONNX后在Jetson设备上推理速度很慢,甚至报维度错误。
原因:推理结果没保存,多半是只开了save=True没开save_txt=True,检测框画在图片上了但坐标标签没落盘。ONNX导出报错或推理变慢,通常是动态尺寸没有固定,或者opset版本跟TensorRT不兼容。
解决:推理命令固定写成save=True save_txt=True,确保图片和标签都输出。导出时固定输入尺寸并设置较低的opset:
yolo export model=best.pt format=onnx imgsz=1280 opset=11 dynamic=False trtexec --onnx=best.onnx --saveEngine=best.trt --fp16Jetson Nano这类边缘设备部署yolov11的流程,是把导出的ONNX用TensorRT转成engine再推理,FP16能明显提升速度。需要注意dynamic=False确保输入尺寸固定,否则TensorRT解析时容易报错。转engine这一步失败时,优先检查opset版本和输入尺寸是否匹配,不要急着改网络结构。
6. 从单帧检测到地块级长势评估:目标跟踪与时序验证
单帧检测只能回答“这一张图里有多少病斑”,但对同一地块多次航拍后,更关心的是“病斑在哪些区域扩散了”。把YOLOv11从单帧推到时序,就能把静态检测升级成地块级的长势评估。
6.1 用目标跟踪把单帧预测串成时序
YOLOv11本身带跟踪能力,用track模式在连续帧上保持目标ID,同一病斑或同一株作物在多帧里会标成同一个ID:
yolo track \ model=best.pt \ source=./field_sequence.mp4 \ save=True默认跟踪器在无人机视角下效果不错,跨帧能稳住ID。把跟踪结果落盘成带ID的标签文件,再按ID和地理坐标分组,就能统计每个地块的病斑密度随时间的变化。无人机影像的连续性依赖航线重叠,飞的时候规划好重叠率,否则跟踪断帧后重连会丢ID。
6.2 消融验证:融合有没有用,要用同一基准说话
多模态融合不是加一路数据就一定变好,验证方法要站在同一个起点上。我的习惯是固定三件事:同一份数据集、同一套训练参数、同一个epoch数量,只改输入分支。先只跑光学图像作为baseline,再逐步加入多光谱特征、热红外特征,逐级对比mAP50和mAP50-95。
| 输入组合 | mAP50 | mAP50-95 |
|---|---|---|
| 仅光学图像 | 0.82 | 0.51 |
| 光学 + 多光谱特征 | 0.85 | 0.55 |
| 光学 + 多光谱 + 热红外 | 0.88 | 0.58 |
每次加一路数据,指标有没有涨,涨了多少,都记在同一张表里。如果某路模态加上去之后指标不升反降,宁可不要它,也不要为了“多模态”而强行融合。从那以后我每次做融合项目都强制先跑单模态baseline,再用消融结果决定要不要保留融合分支,避免把黑匣子当灵丹妙药。这份PDF把系统设计、数据流程、训练参数和实验结果拆得很细,拿回去对着自己的地块数据改一遍,就能把这套流程在本地复现出来。希望帮到你。
本文还有配套的精品资源,点击获取