YOLOv5实战:超声波肾脏结石检测数据集训练与调优全流程
2026/9/23 9:33:42 网站建设 项目流程

简介:目标检测是计算机视觉中应用最广泛的技术之一,其核心在于同时完成目标定位与分类。YOLOv5作为经典的一阶段检测框架,凭借推理速度快、部署灵活的特点,在工业与医学影像分析中备受青睐。医疗影像数据具有灰度单一、噪声高、目标尺度小等特殊性,直接使用通用训练流程往往无法获得理想效果。本文从超声波肾脏结石检测场景出发,系统梳理了基于YOLOv5的数据集校验、YAML配置、超参数调整、模型训练与验证指标解读的完整实践路径。重点讨论超声图像黑色扇形区域干扰、小目标漏检、类别不平衡等实际工程问题,并给出基于mAP、recall等指标的效果优化策略。无论你是刚接触目标检测的初学者,还是正在开展医学图像分析的研究者,都能从中获得可复用的工程经验。 做医疗影像目标检测,我一直觉得数据比模型更重要。一个超声波肾脏结石检测的YOLOv5数据集,2个类别,训练集验证集都给好了,看着省事,但真正跑起来还是有不少门道。这篇文章我就把自己从拿到数据集到训练验证完的整个过程梳理一遍,包含数据怎么检查、YAML怎么写、超参数怎么调、验证结果怎么看,以及超声影像这种特殊数据会遇到的坑。不管你是刚接触YOLOv5的初学者,还是已经在做医学图像检测的同行,这篇文章应该都能给你一些参考。

1. 超声波肾脏结石检测任务的整体拆解

1.1 "2类别"到底指什么

拿到数据集第一件事,不是急着训练,而是先搞清楚类别定义。标题里写的是2类别,结合超声波肾脏结石检测这个场景,比较常见的标注方案是两类目标:一类是"肾脏"(kidney),一类是"结石"(stone),或者一类是"结石",另一类是"正常肾脏组织"。

我接触过的类似医疗超声数据集,大多数时候类别是kidneystone。为什么要这样设?因为这就是一个检测任务,模型需要先在图像里定位肾脏区域,再在肾脏内部或周围找到结石,如果只标注结石一类,模型容易把其他强回声结构误判成结石,增加一个肾脏类别相当于给了模型一个上下文约束。

还有一种情况是类别名称为stonenormal,后者代表没有结石的肾脏图像或区域。这种设置适合做分类辅助检测,但YOLOv5是目标检测框架,如果用normal做类别,意味着需要标注大量"正常"区域作为负样本,反而降低了训练效率。我的建议是:拿到数据集后,先打开类别文件确认名字,再决定是直接用还是稍微调整一下标注策略。

1.2 训练集与验证集划分背后的逻辑

这个数据集已经帮你分好了训练集和验证集,省了一步,但我要提醒一点:划分方式比划分比例更关键。

医疗影像数据和自然图像不一样,一个患者可能有多张超声图像,如果划分时不按患者分组,同一个人的图像可能一部分进了训练集,一部分进了验证集。这样训练的时候模型已经"见过"这个患者,验证时再遇到自然表现得很好,指标虚高,但真正部署到新患者身上效果就会大打折扣。

一般常见做法是训练集、验证集按7:2或8:1:1的比例划分。但如果数据集是严格按患者或者按病例视频帧来组织的,我更建议人工复查一下划分结果。怎么复查?把验证集的图片路径和训练集的图片路径做一次交叉比对,看看有没有文件名前缀相同的情况,如果有,说明划分不够严谨。你也可以通过读取文件名中的患者ID字段,重新生成一个按ID划分的train.txtval.txt,这是最稳妥的做法。

2. 数据集的构成、标注细节与质量检查

2.1 超声波影像数据集的核心特征

超声图像和普通相机拍的照片完全是两回事,模型在这类数据上的表现,很大程度上取决于你怎么理解它的特性。

第一,超声图像是灰度图,虽然文件可能是三通道的PNG或JPG,但实际上颜色信息基本没用。YOLOv5在加载图像时会做归一化,但三通道彩色图和单通道灰度图的处理效率还是有差别,所以如果你有能力,可以先把图像统一转成灰度再复制到三个通道,或者直接在加载时用cv2.imread(..., 0)处理。

第二,图像里存在大量黑色区域。B超探头扫描出来的区域通常是扇形,画面四周是纯黑的无效区域。这些黑色区域对检测没有帮助,但会占用计算资源,也会让模型的注意力被分散。我看到不少人直接把整张图喂进去训练,结果模型学到的特征里混入了"黑色背景判断"这种奇怪的东西。合理的做法是先用掩膜把扇形区域外的部分置为固定值(比如0或128),或者直接在读取后裁剪出有效区域。

第三,超声图像噪声大、对比度低。结石在超声图像里通常表现为强回声伴后方声影,边界往往不清晰,所以标注框的大小和位置在不同标注者之间可能差异很大。这个数据集的标注是否准确,直接决定了最终模型的上限。

2.2 标注格式与数据校验要点

YOLOv5使用的标注格式是txt文件,每行对应一个目标框,格式为:class_id x_center y_center width height,其中坐标值是相对于图像宽高的归一化值,范围0~1。比如图像宽度是800像素,某个框的中心点x坐标是400像素,那么x_center就是0.5。

我在拿到数据集后,第一件事就是写脚本检查标注是否越界、是否出现负数、是否有多余空行。常见的错误包括:坐标数值超过了1.0,宽度或高度为0,类别ID超出了类别总数,文件名与图像名对不上等。YOLOv5训练时遇到这些错误,通常不会直接报错退出,而是会跳过或产生奇怪的loss曲线,排查起来很费劲。

另外要检查的是类别平衡情况。用脚本统计每个类别在训练集和验证集中的标注框数量,如果两类数量悬殊,比如stone有3000个框,kidney只有800个框,模型训练时会更倾向预测数量多的那个类别。YOLOv5本身有类别损失权重调整,但数据分布不均的时候,还是建议手动调整cls_pw超参数或者做针对性增强。

2.3 数据量分布与预处理的实操建议

假设这个数据集训练集有几百到上千张图像,验证集占20%左右。这个规模在医学影像领域并不算大,所以数据增强策略就显得特别重要。

YOLOv5内置的增强是比较完善的,默认开启了马赛克、随机仿射、HSV扰动、水平翻转等。但对于超声图像,我会做两个调整:第一,关闭或降低颜色扰动,因为超声图像的灰度分布是诊断信息的一部分,过度改变色调反而会让模型学到虚假特征;第二,适当提高mosaic的启用概率,因为超声图像背景相对单一,马赛克增强能让模型在多个目标组合场景下更鲁棒。

至于图像分辨率,超声原图一般是640x480或者800x600左右,YOLOv5默认输入是640x640,基本够用。如果检测的结石比较小,可以试试把输入尺寸提到960或1280,但要注意显存开销会成倍增加。

3. YOLOv5训练配置与完整实操流程

3.1 环境准备与依赖安装

YOLOv5的环境安装其实不复杂,核心就两个东西:PyTorch和YOLOv5仓库的依赖。建议用Python 3.8以上、PyTorch 1.12或2.x版本,CUDA版本根据显卡驱动选即可。

git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt

如果国内网络下载太慢,可以把requirements.txt里的torchtorchvision单独安装,或者用镜像源。我个人习惯是先装好PyTorch,再装其他依赖,避免pip自动装一个不匹配的CPU版本。

安装完成后,可以快速跑一下python detect.py --weights yolov5s.pt --source data/images/bus.jpg,能正常输出检测结果就说明环境没问题。这一步很值得做,不然训练到一半发现CUDA不可用,再排查环境问题会很被动。

3.2 数据集YAML配置与超参数选择

YOLOv5训练时需要指定一个数据集配置文件,格式是YAML。这个文件路径不对,后面全白搭。

# kidney_stone.yaml train: /data/kidney_stone/images/train val: /data/kidney_stone/images/val nc: 2 names: 0: kidney 1: stone

注意三点:第一,trainval指的是图片所在目录,YOLOv5会自动在同级目录下找对应的labels文件夹;第二,nc一定要和names的数量一致,类别ID从0开始;第三,路径建议用绝对路径,如果相对路径写错了,训练会报错AssertionError: train: ... does not exist

超参数方面,YOLOv5提供了数据增强、损失权重等参数,全部存在data/hyps/hyp.scratch-low.yamlhyp.scratch-high.yaml里。低增强版本适合小数据集,高增强版本适合大数据集。小规模医疗影像我一般用hyp.scratch-low.yaml再手动改一两个参数,比如把hsv_h从0.015改成0,减少颜色扰动对超声图像的影响。

3.3 训练命令与关键启动参数

训练命令如下:

python train.py \ --data kidney_stone.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --name kidney_stone_run

参数含义不复杂,但有几个值得展开说。

--weights yolov5s.pt用的是COCO预训练权重。你可能会问,COCO和超声图像差这么远,迁移学习有用吗?实测下来还是有点用的,尤其是骨干网络对边缘、纹理的基础特征提取能力,可以帮你节省不少训练时间。如果训练过程中发现loss降不下去,可以试试--weights ''从头训练,对比一下效果。

--batch的大小取决于显存。12GB显存跑yolov5s--img 640--batch 16基本没问题;如果只有6GB显存,就得降到--batch 8甚至--batch 4。推荐在训练时开启--cache参数,把数据提前缓存到内存里,能明显缩短每个epoch的数据加载时间。如果你的机器内存不够大,就忽略这个参数。

--epochs设100是为了让模型充分收敛。医疗小数据集在100轮的时候可能会开始过拟合,所以我还习惯在命令行里加--patience 20,让模型在20轮内没有提升就自动早停,省时省力。

3.4 训练过程的实时监控

训练启动以后,控制台会打印每个epoch的损失、精度、召回率、mAP,同时会在runs/train/kidney_stone_run/下生成训练曲线图。

我一般重点看两个东西:Box_lossObjectness_loss是否在稳定下降。如果这两个loss在训练集上下降但验证集上反而上升,基本就是过拟合了,这时候不是继续加大epoch,而是应该增加数据增强、减小模型复杂度,或者减少训练轮数。

另一个值得看的是results.png里每个类别的mAP@0.5曲线。如果两个类别的mAP差距大,比如kidney已经跑到0.95但stone只有0.6,说明模型对结石的检测能力不足。结石在超声图像里本身就是小目标,形状又多变,这种情况非常常见,后面我会单独讲优化思路。

4. 验证集评估与模型效果分析

4.1 验证结果核心指标解读

训练结束后,YOLOv5会自动在验证集上评估模型,输出precision、recall、mAP@0.5和mAP@0.5:0.95。这四个指标对医疗影像任务来说,优先级不太一样。

mAP@0.5代表IoU阈值0.5时的平均精度,是一个基础指标。如果这个值低于0.8,说明模型整体检测能力还没起来,需要检查数据标签、训练策略。mAP@0.5:0.95代表多个IoU阈值下的平均精度,对目标定位的准确性要求更高,医疗场景中这个指标如果能到0.5以上就已经不错了。

但在医疗应用中,我更关注的是recall,也就是查全率,因为漏检一个结石在临床上比误检严重得多。YOLOv5的recall是在默认置信度阈值0.25下计算的,如果你发现recall不高,可以修改conf_thres在推理时降低到0.1,提高检出能力,容忍一些误检,再交给人工复核。

4.2 模型推理与后处理建议

验证完成后,用训练好的权重跑一张超声图像:

python detect.py \ --weights runs/train/kidney_stone_run/weights/best.pt \ --source /data/kidney_stone/images/val/xxx.jpg \ --conf-thres 0.1 \ --iou-thres 0.45 \ --save-txt

其中--conf-thres 0.1是置信度阈值,--iou-thres 0.45是NMS去重的IoU阈值。对超声图像,置信度阈值可以比通用目标检测低一些,因为超声影像对比度低,模型天然的置信度普遍不如自然图像高。

--save-txt会把检测结果保存成txt文件,里面是class_id x_center y_center width height conf的格式。拿到坐标后,如果你是做辅助诊断工具,建议加一个过滤逻辑:只保留stone类别且在kidney框内部的结石,这样能有效减少肾脏外部强回声结构造成的误检。

4.3 验证集badcase分析

只看指标是不够的,我每次训练完都会从验证集里挑出漏检和误检的图片,一张张看。YOLOv5会把预测结果可视化到runs/val/exp/val_batch0_pred.jpg,这些图上通常能直接看出问题所在。

漏检的图片往往集中在结石较小或与周围组织对比度低的样本上。误检则经常出现在肾脏周围的骨骼、气体、钙化灶等强回声结构上。针对这些badcase,有两种处理路径:一是补数据,专门收集这些难例;二是调后处理,比如用空间约束过滤掉肾脏区域以外的检测框。我个人经验是后者见效更快。

5. 常见问题与踩坑实录

5.1 训练集loss正常但验证集mAP上不去

这个问题我遇到不止一次。训练集上loss一路下降,曲线看起来很漂亮,但验证集mAP一直徘徊在0.3到0.5之间。这种情况最常见的原因是标注噪声太大,尤其是超声图像里结石边界本身就模糊,不同人标出来的框差异很大。

怎么验证?把训练集中loss最高的那批图像可视化出来,看标注框和图像内容是否对得上。如果发现部分框标偏了或者漏标了,优先修数据,而不是调模型。我见过有人为了追mAP反复调超参数,最后发现是标签里混了几个类别标反的样本,修完之后mAP直接涨了0.2。

5.2 超声图像小目标漏检怎么办

这是超声检测的经典难题。结石在图像里可能只占几十个像素,特征又弱,模型很容易漏。

第一个方法是增大输入尺寸,把--img从640改成960或1280,相当于把小目标放大给模型看。这个方法简单直接,代价是训练时间变长。第二个方法是做TTA(测试时增强),推理时对图像做多尺度变换,然后合并预测结果:

python detect.py --weights best.pt --source xxx.jpg --img 960 --augment

第三个方法是用SAHI这类切图推理工具,把大图切成小图分别检测再拼接。超声图像长宽比接近1:1,切图效果还行,但要注意重叠区域的框去重问题。

5.3 类别不平衡导致的结果偏移

如果数据集中stone的框数量远少于kidney,模型可能会倾向于把不确定的区域预测成kidney。YOLOv5在处理类别不平衡时,可以通过--cls-pw参数调整类别损失的权重,但更简单的做法是在后处理阶段单独调每类的置信度阈值。

detect.py里有一个conf_thres参数是全类别统一的。如果你想要kidney用0.25、stone用0.1,可以在后处理代码里自己按类别分开判断。我自己写推理脚本时,通常会读取txt结果,再按类别设置不同的阈值,这样比反复训练调参高效得多。

5.4 扇形B超图像的黑色区域干扰

开头提过,超声图像有大量黑色无效区域。YOLOv5在做马赛克增强的时候,会把四张图拼接在一起,黑色区域会被当成正常图像内容混进来,导致模型学到一些奇怪的背景特征。

解决方法有两种。一是预处理时把扇形区域外的像素直接置为0,并且保证所有图像在做归一化时黑色区域的值是一致的;二是在数据增强阶段保留原始探头掩膜,在训练时让模型只关注有效区域。对于常规的YOLOv5流程,第一种更简单,效果也立竿见影。不过要记住,推理阶段同样需要做相同的预处理,否则训练和推理的图像分布不一致,性能会打折扣。

5.5 训练集和验证集划分不合理

有的数据集虽然给你分好了训练集和验证集,但训练集里可能混入了同一患者的多张连续帧,导致验证集和训练集之间存在高相似度的图像。前面说了,这种情况会让验证指标虚高。

如果遇到这种问题,最稳妥的办法是重新划分。按照文件名里的患者ID,把同一个患者的图像全部放到同一个集合。假设没有患者ID,就按时间戳或视频序列来分。如果文件命名完全没有规律,可以用图像感知哈希做去重,把相似度超过阈值的图像只保留一张。这个方法在超声视频帧数据里特别实用。

6. 实操心得与一点建议

6.1 数据检查的重要性

如果你只从这篇文章里记住一点,我希望是:拿到数据集后先花时间检查数据,不要直接开训。我见过太多人上来就train.py,最后模型效果不好,回过头来才发现标签文件已经损坏了一大半。

建议把下面这个检查流程固化成脚本:检查每张图像是否有对应的txt文件;检查每个txt文件的第一列类别ID是否在有效范围内;检查所有框坐标能否在原图上画出来,并把一部分样本可视化输出到目录里人工抽查。这些步骤加起来只需要几分钟,但能帮你省下几个小时的排查时间。

6.2 小模型的优势

对于超声波肾脏结石检测这种相对单一的任务,yolov5s基本够用,yolov5n也值得一试。小模型训练速度快,部署方便,更重要的是在数据量不大的时候,小模型不容易过拟合。

我在一个几十个类别的工业项目里用过yolov5x,效果反而不如yolov5m,原因就是数据量撑不起那么大的模型容量。所以在医疗这种样本量普遍偏小的领域,别迷信大模型。

6.3 后续扩展思路

这个数据集本身已经是一个完整的检测任务了,后续可以做的扩展不少。比如换用YOLOv8或YOLOv11,测试新框架的Anchor-Free机制在超声小目标上是否有提升;也可以用TensorRT对训练好的模型做量化加速,部署到床边超声设备上做实时辅助诊断。

更深一层,如果拿到的是连续视频帧,还可以加上时序信息,比如用跟踪算法或者轻量的时序模型,把单帧检测结果在时间维度上平滑,减少超声图像中伪影和噪声导致的闪烁误检。这个方向在临床落地时价值很大,因为B超是动态检查,医生看的是实时影像,单帧检测的稳定性再高也不如多帧融合的效果自然。

我在实际训练这个数据集时,最大的感触是医疗影像和自然图像之间的鸿沟,远远不止"图像内容不一样"这么简单。超声图像的信噪比低、目标尺度跨度大、标注标准很难统一,这些都会潜移默化地影响训练过程。如果你已经准备好训练自己的肾脏结石检测模型,建议从今天提到的数据检查、超声预处理、类别权重调整这几个方向入手,每一步都做扎实了,最后的模型效果一定不会差。

最后分享一个小技巧:训练结束后别急着删验证集图片,周末没事的时候把预测结果翻出来再仔细看看,很多时候你会从那些错误检测框里发现一个比调参更管用的突破点。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询