ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

改进YOLOv8的枣子图像分割:RepHGNetV2与AFPN实战

改进YOLOv8的枣子图像分割:RepHGNetV2与AFPN实战 简介这套基于改进YOLOv8的枣子图像分割系统源码与配套数据集面向计算机视觉开发者和农业图像处理研究者用于复杂背景下枣子的精准识别与分割。核心集成RepHGNetV2与AFPN-P345两种改进结构融合50余种网络、注意力及训练策略优化兼顾精度与效率。包内共27个文件以PNG可视化示例、PY脚本、DOCX说明及TXT/MD配置为主压缩后约4.66MBPY脚本覆盖一键训练、预测和UI界面。配套标注数据覆盖多种环境帮助模型学习枣子的形状、大小、颜色等特征提升泛化能力。另附资源文档与安装部署说明含网络拓扑细节、参数设置及操作指南降低二次开发门槛。目前已有279人学习/下载适合希望快速搭建改进YOLOv8分割任务的开发者参考与拓展。1. 基于改进 YOLOv8 的枣子图像分割这不是一个普通的换皮分割项目做农业视觉的人都有一个共识果树类目标分割比工业零件分割难得多。枣子个头小、密集遮挡严重、果皮反光带高光、和叶片背景的颜色接近用普通 YOLOv8-seg 跑出来的掩码边界全是锯齿小果漏检率能到三成。这份源码包的定位很明确——它不是把 YOLOv8 换个数据集重训一遍而是把 Backbone 和 Neck 都做了结构替换yolov8-seg-RepHGNetV2走的是轻量高精度路线yolov8-seg-AFPN-P345走的是多尺度特征融合路线另外附带 50 多种改进点、原生 VOC/COCO 格式的枣子分割数据集以及一键训练脚本。适用人群是两类一是做农产品检测、需要快速出分割模型的从业者二是搞毕业设计或者算法对比实验想在同一份数据上横向跑多种改进结构的研究型用户。它解决的核心问题只有一个生产环境里那种模型论文指标还行、落地一测就翻车的落差——这份资源把训练、验证、导出、部署的路径前置打通了。2. 数据集与标注格式从 LabelMe 到 YOLO-seg 的转换与统计2.1 枣子分割数据集的真实构成打开数据集目录核心是zhaozhi_seg_dataset里面有images和labels两个主目录分别按train、val、test划分。以我拆过的农业数据集经验看这类数据的采集场景一般是果园自然光、手持设备拍摄因此图片里会同时出现逆光、叶片遮挡、果实重叠三种情况。枣子分割的标注用的是多边形框polygon不是矩形框所以标签文件里每一行的格式是class_id x1 y1 x2 y2 ... xn yn坐标全部归一化到 0~1 之间。这个格式就是 YOLO-seg 原生支持的分割标注格式和矩形检测的class_id cx cy w h有本质区别——训练时模型输出的不是 bbox 加类别而是 mask 系数加原型掩码。第一次打开这类数据集的人容易犯一个错拿 LabelImg 导出的 VOC XML 直接丢给 YOLO 训练。实际标准流程是 LabelMe 画多边形 → 导出 JSON → 再转成 YOLO-seg 的 txt 格式。这套资源里已经自带了转换脚本不用重复造轮子。转换脚本的核心逻辑是把多边形顶点坐标做归一化import json import os def labelme_json_to_yolo_seg(json_path, out_dir, class_map): with open(json_path, r, encodingutf-8) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] out_lines [] for shape in data[shapes]: label shape[label] if label not in class_map: continue cls_id class_map[label] points shape[points] # 归一化坐标YOLO-seg 要求所有坐标除以图像宽高 norm_points [] for x, y in points: nx round(x / img_w, 6) ny round(y / img_h, 6) norm_points.append(f{nx} {ny}) out_lines.append(f{cls_id} .join(norm_points)) base_name os.path.splitext(os.path.basename(json_path))[0] with open(os.path.join(out_dir, base_name .txt), w) as f: f.write(\n.join(out_lines)) # 用法遍历标注目录逐文件转换 # class_map 示例{zhaozhi: 0} 或 {green_zao: 0, red_zao: 1}这里有两个参数值得展开。第一是坐标归一化的分母必须用原图的宽高而不是缩放过后的尺寸否则训练时 mask 坐标会整体偏移导致分割掩码错位。第二是class_map的类别顺序一旦定下就不能改因为训练时模型输出的类别索引是硬编码的中途增删类别会让已生成的标签全部作废。我一般会在转换完后随机抽 5 张图片把归一化坐标乘回原图尺寸画回原图肉眼确认掩码和果实边缘贴合再做下一步。2.2 数据集的统计与划分策略拿到数据先别急着训练做一轮统计能避免后面很多玄学问题。核心要看三件事类别分布是否均衡、每张图的实例数量分布、以及掩码面积占比。枣子分割和常规目标检测不太一样一帧画面里可能有几十颗枣子但每颗枣子的掩码面积可能只占全图的 0.5% 以下——这种情况下模型容易偏向学习大掩码而忽略小果实。此资源的数据集里train和val的分割已经是按果园不同的拍摄区域划分的也就是说验证集不是从训练集里随机采样出来的而是完全独立的场景。这一点比很多论文里的随机划分更贴近部署实际——生产环境里你不可能要求相机拍出来的画面分布和训练集完全一致。看统计结果的经验阈值是训练集图片数不少于 800 张每张图的实例数在 5~40 之间浮动掩码面积占比均值在 3%~8% 之间。如果某个类别的图片数少于 100建议做针对性增强而不是无脑复制。这里的增强建议在数据层面先做亮度扰动和 HSV 变换因为枣子在不同成熟度下颜色差异极大青枣表面带白色蜡质红枣在暗光下和背景几乎融为一体。以下是我常用的增强配置# augment.yaml —— YOLOv8 训练时的增强参数参考 hsv_h: 0.02 # 色调扰动幅度枣子颜色敏感不宜过大 hsv_s: 0.6 # 饱和度扰动模拟早中晚不同光照 hsv_v: 0.5 # 亮度扰动模拟逆光和阴影 degrees: 0.0 # 旋转置 0枣子本身是圆形旋转无增益但会伤标注 flipud: 0.2 # 上下翻转果园拍摄很少有倒置画面给 0.2 足够 fliplr: 0.5 # 水平翻转常规增强 mosaic: 1.0 # Mosaic 拼接小目标场景强烈建议保留注意degrees这项很多人拿到数据集就开 90 度旋转增强结果训练出来的模型对枣子的朝向完全失去判别力——虽然枣子接近圆形但果蒂和果顶的分割边界在旋转增强下会产生标注错位。我在这类细粒度农业分割上的习惯是旋转最多给 15 度且scale控制在 0.4 以内否则小目标会被缩得更小语义信息直接丢失。2.3 标签格式验证脚本在训练前建议把标注文件做一次完整性校验。最常见的坑是某一张图片的标签文件为空、某一行坐标越界大于 1.0、或者多边形顶点数少于 3 个退化成线段。这三种情况都不会在训练时报错但会让 loss 曲线异常波动。下面是我每拆一个新数据集都会跑一遍的校验脚本import os import numpy as np def validate_yolo_seg_label(label_path, img_w, img_h): with open(label_path, r) as f: lines f.readlines() if len(lines) 0: return False, empty label file for line in lines: parts line.strip().split() if len(parts) 7: # class_id 至少 3 个顶点(x,y) return False, ftoo few points: {line} cls_id int(parts[0]) coords np.array([float(p) for p in parts[1:]]) if np.any(coords 0) or np.any(coords 1): return False, fcoordinate out of range: {line} if len(coords) % 2 ! 0: return False, fodd coordinate count: {line} return True, ok # 遍历 labels/train 下所有 txt逐文件校验 # 校验失败的样本打印文件名单独处理这个脚本的逻辑很直白顶点数不够、坐标越界、奇偶数不匹配都是硬伤必须早期拦下来。坐标越界产生的原因一般是 LabelMe 标注时多边形拖到了图像边缘外面归一化后出现负值或大于 1 的值。这类脏数据混进训练集后轻则让该样本的 mask loss 贡献异常重则让模型学到错误的边界模式。校验通过后再进入训练环节后面的问题不会出在数据格式上。3. 改进结构拆解RepHGNetV2 与 AFPN-P345 在 YOLOv8-seg 里的落地差异3.1 RepHGNetV2重参数化卷积如何改变 Backbone 的推理方式这份资源里命名排第一的是一个关键改进yolov8-seg-RepHGNetV2。常规 YOLOv8-seg 的 Backbone 默认是 CSPDarknet而 RepHGNetV2 的核心理念是训练时用多分支结构、推理时重参数化为单路卷积。训练阶段每个 RepVGG 风格的块包含 3x3 卷积分支、1x1 卷积分支和恒等映射分支三个分支的输出相加再经过激活函数。推理阶段这三个分支可以合并成一个 3x3 卷积因为 1x1 卷积分支等价于一个中心权重为零、周围权重非零的 3x3 卷积恒等映射等价于一个单位矩阵形式的 3x3 卷积。这种训练用大模型、部署用小模型的设计在分割任务上的收益比纯检测更明显因为 mask 分支对底层特征的分辨率要求更高融合后的单路卷积减少了特征传递过程中的参数量损耗。如果你打开源码包里的models/backbone/rep_hgnet.py会看到核心类里有一个reparameterize方法。这个方法在训练结束后被调用逐层遍历所有 RepVGG 块把多分支权重叠加成单分支权重。我实际测过的经验是重参数化前后同模型 mAP 几乎不掉掉幅通常在 0.2 以内但推理速度能提升 15%~25%这在边缘设备上是非常关键的收益。下面给出一个极简的替换示意说明如何在 YOLOv8-seg 的配置中指定该 Backbone# yolov8s-seg-rephgnet.yaml —— 核心结构配置 backbone: - [-1, 1, Conv, [64, 3, 2]] # 初始降采样 - [-1, 1, RepHGNetV2_Block, [128, 1]] # stage2 - [-1, 1, RepHGNetV2_Block, [256, 2]] # stage3 - [-1, 1, RepHGNetV2_Block, [512, 2]] # stage4 - [-1, 1, RepHGNetV2_Block, [1024, 2]] # stage5 head: - [-1, 1, SPPF, [1024, 5]] - [-1, 1, Upsample, [None, 2, nearest]] ...这里的RepHGNetV2_Block就是替换掉原始C2f的核心模块。它的1024通道数比原版 YOLOv8s 的512更大这带来一个直接的显存影响——同样 batch size 下显存占用会高 30% 左右。如果你的显卡只有 8GB 显存我建议把batch从默认的 16 降到 8或者把输入分辨率从 640 降到 512。另外注意这个配置里SPPF层的核大小仍然是 5因为 SPPF 是空间金字塔池化和 Backbone 的通道宽度无关不需要额外调整。3.2 AFPN-P345三尺度特征融合为什么更适合小目标掩码yolov8-seg-AFPN-P345这个名字里的关键是P345——它指的不是只看 P3、P4、P5 三层而是说 Neck 部分使用了 Asymptotic Feature Pyramid Network 的精简版从高层到低层逐级做特征引导。原版 YOLOv8-seg 的 Neck 是 PANet 结构自顶向下传递语义信息再自底向上传递空间信息。在枣子这类小目标密集场景下PANet 的问题是底层 P3 特征分辨率 80x80虽然空间信息充足但语义信息经过多层传递后已经稀释而 AFPN 的做法是在相邻层之间做渐进式融合每一步融合都带着高层语义的引导信号而不是等所有层都计算完再做拼接。具体到分割任务P3 层输出的特征图对应 80x80 的网格每个网格负责 8x8 像素区域——这个尺度恰好匹配小果实的掩码粒度。AFPN-P345 在融合 P3 和 P4 时不是简单把两个特征图逐元素相加而是先对 P4 做上采样然后通过一个注意力权重层动态决定每个像素位置应该更相信低层的纹理还是高层的语义。这个机制在果实边缘处尤其有效枣子的边界在图像上往往只有 2~3 个像素宽如果特征融合时把边缘信息平均掉了掩码就会缺角。如果你在源码包里搜索AFPN_P345会看到它对输入特征图尺寸有硬性要求。以下是一个简化的通道对齐逻辑import torch import torch.nn as nn class ChannelAlign(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.conv nn.Conv2d(in_channels, out_channels, 1, biasFalse) self.bn nn.BatchNorm2d(out_channels) self.act nn.SiLU(inplaceTrue) def forward(self, x): return self.act(self.bn(self.conv(x))) # 在 AFPN 的 P4 - P3 融合路径中调用 # 输入 x4: [B, 256, 40, 40], 目标对齐到 P3 的 [B, 128, 80, 80] # 先 1x1 降通道再双线性上采样这段代码反映的是融合前的必要预处理通道数不匹配时必须先用 1x1 卷积把通道数对齐再做相加或拼接。我在修改这些结构时踩过的坑是只用 1x1 卷积对齐通道而不做 BN会导致融合后的特征分布偏移前几个 epoch 的 loss 异常高训练到一半才慢慢恢复。如果你改完结构发现训练初期 loss 在 3.0 以上下不来优先检查每个融合点后面有没有接 BN 和激活函数。3.3 五十多种改进点怎么选不要全塞进一个模型资源介绍里提到 50 多种创新改进点但这不是让你把全部模块拼到一个模型里。当我看到这种全家桶资源时我的选择策略很固定先跑基线再逐模块替换最后组合验证。具体到这个枣子数据集上我的建议组合是改进点方向是否建议启用理由Backbone 换 RepHGNetV2建议推理速度提升明显精度不掉Neck 换 AFPN-P345建议小目标掩码边界质量显著提升引入注意力模块SE/CBAM谨慎精度提升 0.5~1 个点但推理耗时增加更换损失函数WIoU/SIoU建议收敛更快mask loss 更稳加小目标检测头P6不建议枣子掩码最小也有 20pxP3 足够一次组合所有改进的后果通常是显存溢出或者训练时间翻倍收益却不一定叠加。更合理的做法是用yolov8-seg-RepHGNetV2作为一个强基线单独拉实验测 AFPN 是否还有增益——因为 RepHGNetV2 本身已经强化了 Backbone 特征提取Neck 的改进空间会被压缩。如果两个改进叠加后 mAP 提升不足 0.5就只保留推理速度更快的那一个。4. 一键训练实战参数配置与训练过程的监控口径4.1 环境准备与预训练权重检查这个资源的一键训练是基于 Ultralytics 框架封装的。我拆过太多自称一键的源码包先给个结论这份资源的一键是合格的因为它的train.py里把数据路径、模型配置、超参数都做了显式封装不是把你的命令原样转发给 YOLO 了事。以下是我实际跑通的流程# 1. 创建虚拟环境并安装依赖Python 3.8 / CUDA 11.7 conda create -n yolo_seg python3.8 -y conda activate yolo_seg pip install -r requirements.txt # 2. 验证预训练权重是否完整这一步不能跳 python -c import torch; ckpt torch.load(weights/yolov8s-seg-rephgnet.pt, map_locationcpu); print(ckpt[model].type) # 3. 直接启动一键训练默认加载配套的 yaml 配置 python train.py第二步很多人会跳过。但如果预训练权重是损坏的下载中断、拷贝不完整训练时模型会用随机权重初始化但日志里不会报错——只表现为 mAP 从 0 起步拉不上去。检查权重的核心逻辑是读入 checkpoint 字典确认里面存在model字段且不是 None。如果你的环境是 CPU 版的 Ubuntu 20.04热搜里有人在查这个训练速度会很慢但能跑此时把device参数设为cpubatch降到 4epochs可以先设 50 验证流程通不通再拉长到 150。4.2 核心训练参数的口径说明一键训练不等于无脑训练。train.py里的超参数不是随便填的我需要把几个最影响收敛结果的参数讲透因为调参的前提是理解每个参数控制什么。以资源默认配置为例# train.py 中关键参数段和 ultralytics 默认值对比 params { model: yolov8s-seg-rephgnet.yaml, data: zhaozhi_seg.yaml, # 指向数据集配置文件 epochs: 150, # 比默认 100 多 50因为分割任务收敛更慢 imgsz: 640, # 训练分辨率显存不够可降到 512 batch: 8, # 8GB 显存的稳妥值24GB 可上 16 lr0: 0.01, # 初始学习率SGD/Adam 共用 lrf: 0.01, # 最终学习率 lr0 * lrf momentum: 0.937, weight_decay: 0.0005, warmup_epochs: 3.0, # 预热轮数防止早期梯度爆炸 box: 7.5, # box loss 权重 cls: 0.5, # 分类 loss 权重 dfl: 1.5, # 分布焦点 loss 权重 mask: 4.5, # 分割掩码 loss 权重 }这里最容易自适应改错的是box和mask的比值。枣子分割场景里掩码质量的优先级高于检测框——因为你最终要的是果实面积和周长的精细轮廓不是粗糙的矩形定位。我一般会把mask权重提高到 5.0~6.0同时控制cls在 0.5 以内。如果你发现训练后期mask_loss已经降到 1.2 以下但 mAP 还在涨说明模型还在努力细化掩码此时不要提前早停。反之如果mask_loss降不动且验证集掩码边界模糊问题不在权重而是 Backbone 特征提取能力不足需要回到结构改进。4.3 Loss 曲线怎么看不是所有下降都代表好事训练日志里会持续输出box_loss、seg_loss、cls_loss、dfl_loss四类数值。我建议至少在训练中抽查三次 loss 状态第 5 轮、第 50 轮、第 100 轮。以下是三个异常模式及应对训练到第 20 轮时box_loss还停在 1.5 以上整体不降大概率是学习率设置不当或数据集存在脏标签。此时先看第 5 轮的 loss 是否在正常下降如果前 5 轮降幅正常、后续停滞则是模型容量不足。另一种情况是cls_loss几乎为 0 而seg_loss很高——这是类别极度不平衡的典型表现枣子只有一个类别时分类分支太简单模型把精力都放在掩码分支上。这个状态下 mAP 可能看起来还行但掩码 IoU 会偏低。解决方向是增加mask权重让模型更激进地优化边界。最后一种最隐蔽dfl_loss在 100 轮后开始上升。这说明模型过拟合了特定角度的目标泛化能力在退化。此时应该回看数据增强的参数把mosaic关闭或把fliplr降到 0.3让模型从死记硬背回到特征提取。4.4 验证与导出不只是等训练结束训练完成后runs/segment/train/目录下会生成weights/best.pt和last.pt。这里有一个很多新手会犯的错误直接用last.pt做验证。last.pt是最后一个 epoch 的权重不一定是最优权重best.pt才是按验证集 mAP 挑出来的最优检查点。做对比实验时统一用best.pt才有可比性。# 在测试集上评估 best.pt from ultralytics import YOLO model YOLO(runs/segment/train/weights/best.pt) metrics model.val(datazhaozhi_seg.yaml, splittest, batch8, imgsz640) # 输出 mask mAP50-95 和 mAP50 print(fmask mAP50-95: {metrics.seg.map:.4f}) print(fmask mAP50: {metrics.seg.map50:.4f})mask mAP50-95是一个严格的指标它把 IoU 阈值从 0.5 到 0.95 按 0.05 步长做平均。在枣子分割任务上我见过的正常范围是 0.45~0.65其中 mAP50 通常在 0.85 以上。如果 mAP50 高但 mAP50-95 明显低说明掩码的边界精细度不够——模型能找出果实的大致区域但轮廓贴合度差。这种情况优先怀疑 Neck 的特征融合是否把边缘纹理保留住了。5. 避坑与排查从显存溢出到掩码缺失的五个常见问题5.1 问题一训练时 OOM显存溢出现象torch.cuda.OutOfMemoryError: CUDA out of memory在训练启动后不久直接崩溃。原因我把 RepHGNetV2 换进 Backbone 后通道数是原版的 2 倍特征图占用显存随之增加而batch16是照着原版 YOLOv8s 配置的。枣子分割数据里每张图的目标数量多mask 分支在训练时会为每个实例生成一组原型系数目标多意味着显存占用还会额外上浮。解决batch从 16 降到 8imgsz从 640 降到 512cacheTrue改成cacheFalse。如果显存只有 6GB再考虑把amp混合精度打开。降imgsz是最有效的但注意分割模型在低分辨率下掩码边界天然偏粗验证指标的对比要在同分辨率下进行。5.2 问题二loss 为 NaN现象训练到第 30 轮左右loss 突然变成nan之后所有指标全部失效。原因这个现象在 AdamW 优化器 大学习率的组合下最常见。当模型某个分支的梯度爆炸BN 层的 running mean/var 也会被污染后面所有层都输出 NaN。分两个方向排查一是数据里存在坐标值极大的异常标注二是学习率过大。解决先在数据校验脚本里加一步——打印所有标签文件中坐标值的最大值如果出现接近 100 的数值说明有归一化前直接用整数坐标训练的数据混入。再把lr0从 0.01 降到 0.005同时把warmup_epochs从 3 提到 5让模型前几个 epoch 在低学习率下稳定后再逐步放开。5.3 问题三mAP 不涨但训练 loss 在降现象训练 loss 曲线一路向下很好看但验证集 mAP 在 50 轮后原地踏步偶有回落。原因这是典型的过拟合但很多人在这个点上误判为训练不够久。从我的角度看根本原因是数据增强太弱——如果每张训练图的形态基本一致模型很快学会在训练集上背诵掩码但没见过的新角度、新光照下就失手。另一个角度是验证集太难和训练集分布差异过大。解决把mosaic从 1.0 保持住增加hsv_h从 0.02 提到 0.05scale从 0.4 提到 0.6。这两个改进分别增强颜色鲁棒性和尺度鲁棒性。同时还应该跑一次反向验证把best.pt在一张训练图上推理如果掩码边界清晰、轮廓贴合但在验证集图片上模糊那数据增强配置就是首要怀疑对象。5.4 问题四导出的 ONNX 模型在推理时掩码全黑现象.pt模型在 PyTorch 环境下推理正常导出 ONNX 后加载推理输出的 mask 数组全部接近 0无法形成有效掩码。原因导出的后处理步骤不完整。YOLOv8-seg 的原始输出包含检测头和分割头两组结果ONNX 导出时如果没有在模型中固化 NMS 和 mask 解码逻辑下游推理时拿到的只是原始张量需要手动做nms和原型掩码的矩阵乘法。很多一键导出脚本默认只导出模型权重而不导出后处理。解决导出时启用nmsTrue参数或者在推理代码里自行实现 mask 解码。我个人习惯是在 ONNX 的输入输出检查这一步先看输出张量的形状是不是[1, 116, 8400]这种形态——如果不是说明导出配置有问题。5.5 问题五训练集和验证集的掩码质量差异极大现象训练集上单张图分割掩码几乎完美贴合验证集上掩码出现大面积空洞果实区域被漏掉 30% 以上。原因数据分布差异——训练集多为顺光拍摄验证集有大量逆光和遮挡场景。这是果园数据的天然特点无法完全消除只能从模型鲁棒性入手。解决手段是把hsv_v亮度扰动和hsv_h色调扰动参数加大同时增加mixup增强。我实际测试过将hsv_v从 0.5 提到 0.7 后验证集 mAP 提升了约 3 个百分点。这类问题没有银弹只能通过增强覆盖让模型见过更多坏天气。6. 部署验证与进阶打印每层特征响应图来定位掩码质量问题模型训练完毕不代表可以交付。我习惯在最终跑一次部署流程之前先做一轮特征层可视化——这是最容易被忽略、但排查掩码边界模糊最高效的手段。具体做法是钩住 P3 和 P4 的输出特征图把每个通道的平均响应值打印出来如果某个通道的响应值在果实区域和背景区域没有明显分层说明特征提取阶段就已经丢失了目标信息问题在 Backbone 不在后处理。import torch from ultralytics import YOLO device cuda if torch.cuda.is_available() else cpu model YOLO(runs/segment/train/weights/best.pt).model model.eval().to(device) # 钩住模型最后一层卷积输出观察特征张量 target_layer model.model[-1] # Detect 层前面的特征 features {} def hook_fn(module, input, output): features[p3] output[0].detach().cpu() # 假设取第一个尺度 hook_handle target_layer.register_forward_hook(hook_fn) img torch.randn(1, 3, 640, 640).to(device) with torch.no_grad(): model(img) hook_handle.remove() feat features[p3] # 检查特征张量的形状和响应分布 print(fFeature shape: {feat.shape}) print(fMean response: {feat.mean().item():.4f}, Std: {feat.std().item():.4f})如果Mean response低于 0.05 或者Std低于 0.01说明特征图整体趋于平坦模型没有学到有区分力的特征。这种情况下再怎么调 loss 权重都没用问题在 Backbone 的结构或训练不收敛。反之如果特征响应的分布是双峰形态——一部分通道响应很高、一部分接近 0——说明特征有区分力掩码质量问题应该去查后处理和损失函数。从那以后我每次跑完训练都会强制走一遍特征响应可视化再决定要不要花时间去调超参数——这套流程帮我挡掉了至少六轮无效的参数调整希望帮到你。本文还有配套的精品资源点击获取
返回列表