拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

基于YOLOv5的直肠息肉检测:数据、训练与部署实战指南

基于YOLOv5的直肠息肉检测:数据、训练与部署实战指南

简介:这是一份基于YOLOv5的直肠息肉检测系统完整项目资料,面向医学影像分析人员、机器学习开发人员及疾病筛查研发工程师,聚焦于利用深度学习技术实现直肠息肉的自动检测与辅助诊断。整套资料以1个docx文档打包,压缩包大小仅41KB,却系统覆盖了从环境搭建、数据准备与预处理、数据集配置文件创建,到模型训练、ONNX格式导出、性能评估及评估指标可视化的全流程操作指引,并包含GUI界面构建与所有代码整合的具体说明。内容还梳理了项目特点、多类检测与数据增强等未来改进方向,以及常见注意事项,便于使用者快速复现检测流程并理解深度学习模型在医疗图像分析中的应用逻辑。目前已有120人学习下载,适合希望借助自动检测技术辅助直肠息肉诊断、提升筛查效率的研发与医疗技术人员参考。

1. 基于YOLOv5的直肠息肉检测系统:从内镜图像到可落地的辅助筛查方案

直肠息肉筛查是消化内镜最常规的工作流之一,息肉的漏检率直接关系到早癌发现率。而“基于YOLOv5的直肠息肉检测系统”要解决的,正是这套流程里最耗人力的环节:从肠镜视频或采集图像中,把大小不一、形态各异的息肉框出来。相比传统图像处理靠颜色、纹理阈值去猜,YOLOv5这类单阶段检测器能在保持实时性的同时,把训练好的权重直接部署到内镜工作站或边缘设备上。对刚接触目标检测的医学影像从业者来说,这套系统的价值在于两条——一是YOLOv5的代码结构和生态足够成熟,找得到可复现的完整程序;二是直肠息肉数据集的边界比自然场景清晰,模型在小样本下也具备不错的上限。全文我会按“数据准备 → 环境搭建 → 训练调参 → 评估后处理 → 部署验证”这条主线展开,每个环节都给出可直接复制的命令和参数,并把我踩过的坑一并交代清楚。

2. 医学图像的样本困境:把直肠息肉数据整理成 YOLO 格式,转换脚本与四个边界坑

训练目标检测模型的第一个环节是数据,而在医学图像领域这是最大的坎。YOLOv5 要求的数据标注格式是每张图对应一个同名 txt 文件,里面每一行代表一个目标:class_id x_center y_center width height,坐标全部归一化到 0~1。你的原始标注来源通常是两种:公开数据集(如 Kvasir-SEG、CVC-ClinicDB 这类内镜图像集)里的分割掩码,或是医院 PACS 导出的 XML/JSON 格式框标注。直接拿分割掩码训练 YOLOv5 是不行的,必须先把 mask 转成 bounding box。

import cv2 import numpy as np import os from glob import glob def mask_to_yolo(mask_path, txt_path, class_id=0, min_area=20): # 读取二值掩码,通道数可能是3,先转灰度再二值化 mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) if mask is None: return False _, binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) h, w = binary.shape[:2] lines = [] for cnt in contours: x, y, bw, bh = cv2.boundingRect(cnt) # 过滤掉面积过小的噪点连通域,避免把清洗气泡误判成息肉 if bw * bh < min_area: continue x_center = (x + bw / 2) / w y_center = (y + bh / 2) / h box_w = bw / w box_h = bh / h # 归一化后可能出现极小值,夹到 [0, 1] 区间 x_center = max(0.0, min(1.0, x_center)) y_center = max(0.0, min(1.0, y_center)) box_w = max(0.0, min(1.0, box_w)) box_h = max(0.0, min(1.0, box_h)) if box_w == 0 or box_h == 0: continue lines.append(f"{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}") if lines: with open(txt_path, 'w') as f: f.write("\n".join(lines)) return True return False # 批量转换 mask_files = glob("dataset/masks/*.png") for i, mf in enumerate(mask_files): img_id = os.path.basename(mf).split("_mask")[0] # 按你的命名规则取图片ID img_path = f"dataset/images/{img_id}.png" if not os.path.exists(img_path): continue txt_path = f"dataset/labels/{img_id}.txt" mask_to_yolo(mf, txt_path) if (i + 1) % 100 == 0: print(f"已处理 {i + 1}/{len(mask_files)} 张掩码")

这段脚本的核心逻辑是先通过findContours拿到每个息肉连通域的外接矩形,再换算成 YOLOv5 要求的归一化中心坐标和宽高。为什么要用RETR_EXTERNAL?因为内镜图像里息肉的掩码有时会被高光反射切成两块,如果用RETR_TREE把内层轮廓也算上,就会出现一个息肉被标成两个框。这里建议只提取最外层轮廓,保证一个息肉至多对应一个框。

四个边界坑里,第一个是内镜下息肉边缘的掩码标注往往包含器械阴影,直接转框会让边界框多出 10%~20% 的背景区域,训练时模型容易学到“背景边缘纹理”而不是“息肉本体”。我一般会做一步腐蚀操作,先对二值掩码腐蚀 3 到 5 个像素,再找轮廓。第二个坑是图像尺寸差异太大,肠镜视频帧通常是 1920x1080,而公开数据集里有不少 512x512 的缩略图,混在一起训练会导致 loss 震荡。建议统一 resize 到 640x640 并记录原始尺寸信息,推理阶段再用等比缩放回原图。第三个坑是类别不平衡——单发息肉占多数,超过 4 个息肉的图像极少,如果数据总量不够,模型会对“多息肉场景”极度不敏感,这个要留到后面的数据增强策略去解决。第四个坑是 Kvasir-SEG 只有分割标注,没有检测框标注,直接转出来的矩形框会偏大,训练前最好人工抽查 100 张。

关于数据集的划分,我要强调时间和患者维度的双重隔离。单纯按 8:1:1 随机切分 train/val/test 会带来隐性数据泄漏——同一个患者的多张连续帧可能同时出现在训练集和验证集,导致验证指标虚高。医学数据集必须按患者 ID 分组,同一患者的所有图像只进入一个集合。这点在公开数据集中尤其容易被忽略,因为文件夹命名通常不是患者 ID 而是序列号。

3. 搭建 YOLOv5 训练环境:conda 配置、源码结构与 torch 版本匹配

环境配置是这个项目里劝退人数最多的环节,但也是相对最可控的。YOLOv5 的源码结构一直在演进,不同版本的依赖差异很大,特别是 torch 和 torchvision 的版本组合。以当前主流使用方式来说,我建议直接克隆官方仓库,创建独立 conda 环境,然后逐项安装依赖。这里我不推荐用 pip install -r requirements.txt 一把梭,因为你大概率会遇到 numpy 版本冲突或者 opencv 编译失败。

git clone https://github.com/ultralytics/yolov5 cd yolov5 conda create -n polyp python=3.8 -y conda activate polyp # 先装 cuda 版 torch,这里用 cu118 构建,对应 CUDA 11.8 pip install torch==2.0.1 torchvision==0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 仅安装剩余依赖,避免 pip 自动升级 torch pip install -r requirements.txt --no-deps pip install pandas openpyxl seaborn

解释一下为什么固定 torch 2.0.1 这个版本。YOLOv5 官方仓库对 torch 2.0 的支持已经从源码层面做了适配,包括 AMP(自动混合精度)和torch.compile的可选开关。如果你贪新装了 torch 2.1 或更高版本,常见异常是AttributeError: 'Upsample' object has no attribute 'recompute_scale_factor',这是 torch 升级后nn.Upsample行为变化导致的后向兼容问题,需要改源码或者降 torch,非常蛋疼。而 torch 1.8 以下又会缺少torchvision.ops.nms的某些扩展,导致自定义 NMS 失效。在医学检测这类对稳定性要求较高的场景,固定 torch 2.0.1 + torchvision 0.15.2 是经过大量复现检验的组合。

依赖装完后,先不要急着训练。YOLOv5 的仓库里自带detect.py,我们可以先用官方权重验证环境是否通。拉取预训练权重需要访问外网,如果网络受限,常见的做法是在内网环境下人工上传 yolov5s.pt 到 weights 目录。这里需要注意权重文件版本必须与源码版本对应,官方仓库的 release 标签会明确列出对应关系,混用的直接征兆是推理时输出 NaN 或者类别数量对不上。

mkdir weights # 把 yolov5s.pt 放到 weights/ 目录下 python detect.py --weights weights/yolov5s.pt --source data/images/bus.jpg

如果一切正常,runs/detect/exp目录下会出现带预测框的输出图。看到框出来,再进入训练阶段。这段验证的意义在于区分“环境问题”和“代码问题”——很多人在训练自己的数据时报错,以为是数据格式问题,实际是环境里缺了某个依赖,导致前向传播在某一层直接中断。先跑通官方 demo 能帮你把环境变量和 CUDA 层面的问题一次性排除掉。

还有一个常被忽略的点是requirements.txt里的matplotlib版本。YOLOv5 训练过程会输出 PR 曲线和混淆矩阵图,如果 matplotlib 版本过新(比如 3.8 以上),画图接口变化可能导致训练结束后plot_labels阶段报错。建议把 matplotlib 固定在 3.7.x,避免最后一公里翻车。

4. 训练直肠息肉检测模型:数据配置、超参数调整与 mAP 评估

环境就绪之后,核心动作是写数据配置文件、调训练超参数、启动训练。YOLOv5 的训练入口是train.py,数据侧需要准备一个 YAML 文件,用来声明训练集和验证集路径以及类别列表。直肠息肉检测只需要一个类别,很多初学者在这里翻车——他们把息肉拆成“带蒂息肉”“平坦息肉”“增生性息肉”多个类,结果由于类别间形态高度重叠,模型收敛后类间混淆严重,检测效果反而更差。除非你的落地场景确实需要分类输出,否则第一版建议只做单类检测。

# polyp.yaml path: /data/polyp_dataset # 数据集根目录,建议用绝对路径 train: images/train # 相对于根目录的路径 val: images/val test: images/test nc: 1 names: ['polyp']

这个 YAML 文件有两点需要注意。第一,path字段必须是绝对路径,尽量不要使用../相对路径——YOLOv5 在子进程加载数据时工作目录会变,相对路径经常解析到错误位置。第二,train和val指向的是图片目录而非标签目录,YOLOv5 会自动将同名的 txt 文件从同级labels目录读取。如果你的目录结构是图片放在images/train、标签放在labels/train,这样就符合约定;若是标签被打包在单独压缩包或数据库里,需要先按前文方式转换并摆放到位。

数据配置就绪后,可以启动训练。这里不是简单跑默认参数,我建议从yolov5s开始,因为息肉检测不同于自然场景检测——目标尺寸占比变化极大,平坦型息肉在 640 分辨率下可能只有 30x30 像素,而带蒂息肉可能占满半个画面。默认锚框是为 COCO 数据集统计出来的,直接用在息肉上会导致小目标召回率偏低。解决方法是让 YOLOv5 在训练前自适应计算锚框:

python train.py --img 640 --batch 16 --epochs 100 \ --data polyp.yaml --weights weights/yolov5s.pt \ --cache --device 0 --name polyp_s --hyp hyp.polyp.yaml

--cache参数用于将图像预加载到内存中,如果你的机器只有 16GB 内存而数据集有几千张图,不建议使用这个参数,否则会触发内存交换,使训练速度骤降。--hyp参数指向自定义超参数文件,我们需要单独创建一份,重点调整与医学小目标相关的部分。

# hyp.polyp.yaml lr0: 0.005 lrf: 0.1 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3 warmup_momentum: 0.8 box: 0.05 cls: 0.5 cls_pw: 1.0 obj: 1.0 obj_pw: 1.0 anchor_t: 4.0 fl_gamma: 0.0 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 10.0 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0 flipud: 0.5 fliplr: 0.5 mosaic: 1.0 mixup: 0.2

逐条解释几个关键改动。cls_pw: 1.0是类别平衡权重,对单类检测意义不大,保持默认值即可;obj_pw: 1.0控制正负样本平衡系数,医学图像中背景占比极高,这个值调高到 1.0 是为了防止模型过度偏向预测背景。anchor_t: 4.0是锚框置信度阈值,这个值决定哪些锚框参与匹配计算,调低会减少匹配数,调高则更容易把小目标匹配到较大的锚框——这里保持 4.0 默认值,配合后面的自动锚框计算函数使用。fl_gamma: 0.0表示关闭 focal loss,YOLOv5 默认的 BCE loss 在单类检测场景下表现足够,强行加 focal loss 反而会在小目标上带来梯度不稳定。

数据增强里degrees: 10.0和shear: 0.0是医学图像特有考量。内镜图像中息肉的形态受拍摄角度影响,但医学诊断要求不能把图像旋转翻转到离谱程度——旋转超过 10 度会让模型学到错误的形态模式。这里比默认值 0.0 提高一点点,因为肠镜图像拍摄时确实存在角度偏转,但上拉至 30 度以上就会让正常息肉的“带蒂”特征变形,影响泛化。perspective: 0.0关闭透视变换,强烈建议医学图像不要开启,透视变化会改变目标的空间比例关系,误导模型。mosaic: 1.0保持开启,这是 YOLOv5 最有效的数据增强手段之一,它能增强模型对小目标的检测能力,但有个注意点:如果你的数据集标注框非常小,开启 mosaic 后小目标进一步缩小,需要配合scale: 0.5控制尺度变化幅度。

一个容易忽略的参数是flipud: 0.5(上下翻转)。自然图像中上下翻转通常无害,但在肠镜图像里,息肉的形态与重力方向有关系——息肉的头部和基底部在解剖结构上有上下之分。如果你训练集中大部分息肉都朝上,上下翻转后模型会学到“倒挂息肉”的假模式。建议把flipud设置为 0.0 或 0.1,保留左右翻转即可。这是我在息肉检测上最深刻的一个调整。

训练过程中的监控点也很重要。前 20 个 epoch,观察train/box_loss和val/box_loss是否同步下降;如果训练 loss 下降但验证 loss 震荡,说明数据增强过度或学习率过大。通常在 40 到 60 epoch 之间,val/mAP_0.5会超过 0.9 但 mAP_0.5:0.95 仍在 0.5 到 0.7 之间,这是因为息肉形态多样且大小差异极大,IoU 严格阈值下小目标难拿高分。

训练中断与恢复:程序的“后悔药”

训练一个大轮次非常耗时,100 epoch 在单张 RTX 3090 上可能需要 6~10 小时。如果中途断电或显存溢出,不需要从头再来。YOLOv5 每次 checkpoint 都会保存last.pt和best.pt,直接指定--resume即可:

python train.py --resume runs/train/polyp_s/weights/last.pt

需要注意的是,--resume不要求你重新传--data、--hyp等参数,它会从 checkpoint 中恢复完整状态,包括 epoch 计数、优化器状态、学习率调度器位置。如果你手动修改了超参数文件再 resume,新的超参数不会生效,因为 checkpoint 里序列化了旧配置。这个机制既是好事也是坑,想微调超参数必须重新开始训练,否则你会以为自己改了参数,实际训练还走的是旧路线。

5. 直肠息肉检测的避坑手册:数据泄漏、假阴性与过拟合的排查

这一章是全文最有价值也最容易被忽略的部分。目标检测项目的失败通常不发生在训练时 loss 不收敛,而是发生在验证时指标虚高、上线后完全不能用。以下五条都是我在医学影像检测项目中实打实遇到过的问题。

** 现象一:训练 loss 正常下降,但验证集 mAP 极低。** 原因通常是 anchors 与目标尺度严重不匹配。YOLOv5 的自适应锚框计算会在启动时运行,但如果你用--weights yolov5s.pt从 COCO 权重开始训练,自适应计算默认关闭,模型沿用 COCO 的锚框。解决方法是显式传入--noautoanchor的反向参数,或者在训练命令中加上--evolve之前先手动执行锚框计算。实际操作上,我会先跑一个 30 epoch 的短训练打印出anchors的实际值,然后在完整训练前把适配后的锚框写进模型文件。

# 自动锚框计算脚本 python train.py --data polyp.yaml --weights yolov5s.pt --img 640 --epochs 1 --cache --noautoanchor # 查看终端输出中最下方 k-means 聚类得到的 anchors

** 现象二:验证集 mAP 很高,但实际内镜视频中漏检严重。** 原因八成是训练集和验证集来自同一分布而测试场景不同。内镜图像的成像受设备型号、光源强度和镜子角度影响极大,某医院的内镜图像有特定的色调分布。我从一次真实项目里学到的教训是:验证集指标再高也不能证明泛化能力,必须留出至少一个独立来源的测试集。在实际部署前,我会从另一个设备或公开数据集(如 Hyper-Kvasir)抽几十张图像形成“外部验证集”,专测模型的跨域能力。如果外部验证集 mAP 比内部验证集低 10 个点以上,说明过拟合了,需要减少训练 epochs 或增加更强的增强策略(尤其是色调扰动)。

** 现象三:小息肉漏检率居高不下。** 原因在于下采样倍数过大。YOLOv5s 的检测头分别在 80x80、40x40、20x20 三个尺度的特征图上做预测,20x20 层对应感受野最大,负责大目标;80x80 层负责小目标。如果你的输入分辨率只有 416,小息肉可能下采样到 80x80 层时只剩一个像素。解决思路有两个:提高--img到 960 或 1280(显存允许时),或者使用 P2 层额外的小目标检测头。YOLOv5 官方源码在 v6.0 之后可以通过修改模型配置添加 P2 层,但需要同步调整 anchor 配置,改动成本较高。对医学项目来说,更稳妥的是先用 960 分辨率训练对比,通常 mAP 提升 2~3 个点。

** 现象四:训练后期 loss 出现尖峰。** 原因多为数据中混入了异常标注或异常图像——比如某张图像标注框坐标为负值,或图像本身是损坏的扫描文件。YOLOv5 对损坏图像会跳过后打印 warning,但不会中断训练。排查方式是训练过程中盯住val/obj_loss,若某个 epoch 突增,去数据集里找该 epoch 对应的缓存索引,一般能找到问题样本。快捷做法是在数据准备阶段写一个完整性校验脚本:

import cv2 from glob import glob imgs = glob("dataset/images/train/*.jpg") + glob("dataset/images/train/*.png") for impath in imgs: img = cv2.imread(impath) if img is None: print(f"损坏图像: {impath}") lblpath = impath.replace("images", "labels").rsplit(".", 1)[0] + ".txt" if not os.path.exists(lblpath): print(f"缺少标签: {impath}") else: for line in open(lblpath): vals = line.strip().split() if len(vals) != 5: print(f"标签格式错误: {lblpath}")

这个脚本看起来简单,但它会一次性暴露三类低级问题,比在训练日志里去翻干净得多。** 现象五:训练集和验证集的分布不一致导致 mAP 假象。** 我在前面已经提过按患者 ID 划分数据集,这里再展开说明操作方式。Kvasir-SEG 这类数据集没有患者信息,只能按图像来源序列前缀分组;CVC-ClinicDB 有 Session 前缀,这是天然的序列 ID。划分时用序列 ID 做分组随机:

import os import random from collections import defaultdict img_files = glob("dataset/images/*.png") groups = defaultdict(list) for impath in img_files: sid = os.path.basename(impath).split("_")[0] # 按前缀分组 groups[sid].append(impath) all_groups = list(groups.keys()) random.shuffle(all_groups) train_groups = all_groups[:int(len(all_groups)*0.7)] val_groups = all_groups[int(len(all_groups)*0.7):int(len(all_groups)*0.85)] test_groups = all_groups[int(len(all_groups)*0.85):] # 按分组结果复制文件到 train/val/test 目录

这份代码的思路是通过序列前缀代替患者 ID,保持同一序列的所有帧数据都在同一集合内,从根本上避免了连续帧之间的信息泄漏。若你的数据集中同一患者有多次检查,尽量在项目列表里维护一个 patient_id 映射文件来做分组,不能只看文件名。

6. 推理验证与部署优化:把训练好的模型做成能用的检测工具

训练完成后,最后一个环节是验证模型质量并部署到实际使用场景。很多人在best.pt训练完成后就以为万事大吉,实际上推理阶段的预处理和后处理如果不与训练保持一致,效果会大打折扣。

先做基础推理验证。YOLOv5 自带的detect.py只能输出带框图像,想要量化评价模型,建议写一个独立的评估脚本,调用val.py得到每一类的 AP 和置信度分布。这里我重点关注两个指标:置信度阈值设为多少时,假阳性和假阴性能达到临床可接受的平衡点。对于息肉筛查,漏检的代价远高于误报,所以我一般会建议把置信度阈值从默认的 0.25 降到 0.15,让模型输出更多的候选框,再交给医生人工复核。注意,这个降阈值的操作必须在验证集上确认 mAP 不会骤降的前提下进行,并配合 NMS IoU 阈值的调整。

NMS 参数同样关键。YOLOv5 的默认 NMS IoU 阈值是 0.45,但在息肉检测中,相邻息肉常会有部分重叠,特别是一串多发息肉。IoU 阈值过高会导致两个息肉被合并为一个框,错失数量统计;过低则会出现一个息肉多个重复框。我的实测经验是 0.3 到 0.35 之间表现最好,这个值下重叠息肉能分开,同息肉的重复框又能被抑制。可以在 detect 推理时用--nms-iou-thres参数修改,但不建议改源码里的默认值,使用命令行参数覆盖即可。

# 批量推理并输出带置信度的 JSON 结果,便于后续统计 import torch import cv2 import json import glob model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/polyp_s/weights/best.pt', force_reload=True) model.conf = 0.15 model.iou = 0.3 results = [] for img_path in glob.glob("test_images/*.jpg"): img = cv2.imread(img_path) rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pred = model(rgb, size=640) df = pred.pandas().xyxy[0] boxes = [] for _, row in df.iterrows(): boxes.append({ "x1": int(row["xmin"]), "y1": int(row["ymin"]), "x2": int(row["xmax"]), "y2": int(row["ymax"]), "conf": float(row["confidence"]) }) results.append({"image": img_path, "detections": boxes}) with open("polyp_detections.json", "w") as f: json.dump(results, f, indent=2)

模型推理时通过torch.hub.load加载本地权重,好处是无需进入仓库的检测流程,方便嵌入到自己的后端服务。代码里显式设置了model.conf = 0.15和model.iou = 0.3,这两个值对应前面讨论的临床场景调优。需要特别说明的是size=640必须与训练时一致,如果训练用的--img 960,推理时就要传入 960,否则目标尺度偏移会带来性能回退。另外,这里的图像输入是 RGB 格式,YOLOv5 的预处理内部会自动归一化,但颜色通道顺序必须正确——传 BGR 进来训练过 RGB 的模型,检测效果会差到不可用。

部署时要考虑的是延迟与吞吐的平衡。内镜工作站通常配有中端 GPU(如 RTX 3060 到 4070),单帧推理延迟在 20~40ms,可以做到实时视频流检测。如果没有 GPU,CPU 推理也不是不行,但要把输入尺寸降到 480、--half半精度推理关闭(CPU 对半精度支持差),实测延迟会从几十毫秒飙升到 200ms 以上,基本只能做离线分析。视频流部署时,YOLOv5 官方 detect.py 对--source传视频文件或摄像头索引可以直接输出结果,但用于临床内镜流程,我建议只做“异步抽帧检测”而非逐帧检测——内镜视频往往有持续两到三秒的画面停留,逐帧检测只会产生大量重复框,而且增加工作站负担。抽帧间隔设为每 10 帧检测一次,配合目标跟踪算法保持框的连续性,是更务实的路径。

最后分享一条教训:模型训练结束后,我习惯把数据集划分的随机种子、超参数文件、训练命令、权重文件的 SHA256 哈希连同模型一并归档。医学项目对可追溯性要求极高,几个月后要回溯“这个版本是怎么训出来的”时,如果没有完整的记录,基本等于重新开始。把这个习惯从第一个实验就养成,会省下大量返工时间。比例尺、内镜型号、光照条件这些在数据收集阶段就要标注成边信息,不要等模型效果不好再回头补,那时通常已经补不回来了。希望这些实战里的折腾经历能帮你少走几段弯路,祝你的息肉检测模型早日跑出满意的效果。

本文还有配套的精品资源,点击获取

返回列表