2026/10/21 13:09:33

YOLO26药片检测模型训练部署全流程实战指南

YOLO26药片检测模型训练部署全流程实战指南 一条泡罩板包装线的工位上工人每天要盯着传送带看八九千个药板眼睛基本处于半麻木状态。这是很多制药车间、医院制剂室的真实日常。我接这个需求时对方问得很直接能不能用模型把缺粒、破损、混药先筛出来机器干重复的活人只做复核。我最后给的方案就是用YOLO26训一个药片检测模型。这篇文章就是我踩完坑之后整理出的完整流程覆盖数据采集、标注规范、训练调参、导部署到产线的每一个环节。无论你是制药设备工程师、做自动发药机的嵌入式开发还是第一次想拿目标检测做实际落地的算法新人照着这套走都能训练出一个能用的药片检测模型。1. 药片检测在医药行业的真实位置1.1 药板质检、自动调剂与零售盘点三个典型落地场景药片检测不是只存在于实验室里的演示项目目前在几个环节都有明确的商业需求和真实痛点。第一个场景是药厂包装线的泡罩板质检。药片压进铝塑板的工序速度很快生产线每分钟可能跑几十到上百板长期靠人眼盯传送带非常疲劳。缺粒、裂片、药板里混入异物、印字不清晰这些都是需要检测的缺陷。目标检测模型在这里主要负责定位每一粒药片然后由业务逻辑判断数量是不是等于标准数量、位置有没有偏移。第二个场景是医院和连锁药房的自动调剂、发药设备。这类设备要把整瓶药按处方粒数拆零分装一旦药品种类多、瓶身标签磨损靠机械结构很难保证不出错。视觉模型在分药前先对倒出来的药片做一次品种识别粒数确认出错概率下降得非常明显。我见过某医院药房改造项目调剂差错率从千分之几直接压到接近零靠的就是检测模型对每一粒药先分类再计数。第三个场景相对轻量是药店或仓库的盘点。把成瓶的药倒出来平铺在托盘上模型自动识别品种并计数比人工一粒一粒数快得多。这类需求对实时性要求不高但对类别覆盖要求很广你不可能为每一个品规都单独训一个模型所以类别体系设计、数据管理在这里就特别重要。这三个场景有一个共同点要的都不只是图里有没有药片而是图里每一粒药片在哪、是什么、共多少粒。这决定了算法选型直接走目标检测路线而不是分类或分割。1.2 为什么是目标检测而不是分类或者分割很多第一次接触这个需求的朋友会问我能不能直接用图像分类判断这板药合格/不合格理论上能但实际完全不可用。药板里有两粒药外形接近但颜色深浅不同分类模型只会给你一个整体异常的结论你没法知道异常出在第几排第几列没法联动剔除机构。目标检测不一样它同时输出类别、置信度和矩形框坐标缺粒问题通过统计框数量就能暴露位置偏移通过框的坐标变化也能捕捉。语义分割的精度确实更高能给出药片的像素级轮廓但工业场景里大多数情况不需要那么精细。药片是刚性物体形状规整一个紧贴边缘的矩形框完全够后续机械臂抓取或气流剔除使用。分割模型标注成本更高、推理耗时更长在高速产线上性价比不划算。除非你是要做很精细的外观缺陷检测比如崩边缺角的面积计算否则检测方案是第一选择。YOLO系列在工业落地中的另一个优势是生态完整。训练、验证、导出、部署都有统一的工具链模型文件转成通用推理格式很方便不用自己写一堆前后处理代码。这也是我最终选YOLO26而不是其他检测框架的原因后面细说。1.3 YOLO26到底改了什么抛开宣传话术关注这几个能力点拿到YOLO26版本我实际使用下来感受最深的是对小目标的处理确实比旧版强。药片检测里目标大小差异很大一瓶倒出来的几百粒药每粒在图像里可能只占二三十个像素而药板俯拍的药片相对大一些。旧版模型在小目标上的漏检率偏高尤其是深色药片混在深色背景下。26版本在特征提取和检测头的设计上有针对性地强化了多尺度融合对这类密集型小目标更友好。我自己的测试里药板图从旧版换到26版小规格药片的召回率提升了大约三到五个百分点。第二个变化是训练效率。这代模型在同样的数据量下收敛更快对数据增强策略也做了调整适合数据规模不大的垂直场景。药片检测的难点往往不是模型结构不够强而是标注数据有限所以训练阶段的默认增强策略能拉高不少上限。第三个值得关注的是模型规格选择更灵活。轻量版本在CPU上都可能实时跑适合嵌在发药机、调剂机这种算力受限的设备里标准版本则适合放在产线工控机上做质检。我一般先用标准版本验证效果确认可行后换轻量版本做性能测试部署时再按帧率要求选型。需要说明的是YOLO26的具体版本配置和命令行参数以你实际使用的发布套件为准不同实现之间可能略有差异但训练思路和数据工程方法完全通用。2. 药片数据是这行的命根子采集、标注与组织2.1 采图环境均匀光照比高像素更重要很多人在数据采集阶段容易犯一个错误一味追求相机分辨率却忽略了光源方案。药片检测里光照均匀度直接决定模型上限。铝塑板泡罩反光强烈如果光源直射药片表面会出现一大块白色高光标注的人看着都费劲模型自然更学不到稳定的药片纹理特征。我现在的做法是优先用漫射光源加柔光板让光线在药片表面均匀散开避免镜面反射。透明胶囊、薄膜包衣片这类半透明目标正面打光很难看清边界更好的方案是背光透射——把光源放在被检物体背面药片在图像里呈现清晰的剪影边缘反而比正常光下更锐利。采集时还要注意覆盖产线的真实工况。药片表面有一层印字纹理不同批次的印刷浓度可能有差异铝箔板的批次不同反光特性也不一样。如果只收一批料的数据训练上线后换了一批铝箔就可能掉点。所以我在项目里都会要求客户提供至少三个批次的物料样本混合采集为的就是让模型见过这种自然波动。像素方面工业相机500万像素起步具体取决于拍摄视野。视野内单粒药片至少有30×30像素以上太小了标注很困难模型也难学。视野越大覆盖药板数量越多但单粒分辨率下降这个权衡要在采集前先算清楚。2.2 类别体系设计按品规分还是按外观分类别怎么定直接影响标注成本和模型难度。我的经验是按药品品规划分而不是按形状颜色随意划分。同一个品规的药片即使在不同批次里有轻微色差也应当归为一类不同品规如果外观极其相似除非业务必须区分否则先合并处理避免标注时互相打架。举个例子。某项目中一批药片是白色圆形小片另一个品规是白色圆形大一些的片两者外形几乎一样只差直径。模型对这种同类不同大小的目标比较吃力容易混淆。后来我建议客户在拍摄时加一把标尺作为参照物同时在类别注释里记录直径大致范围配合标注规范性混淆率才降下来。类别名称建议统一用英文或拼音不要带中文和空格。不是模型不支持中文而是文件路径、标签文件解析时容易出各种编码问题。类别顺序一旦确定训练集和验证集必须保持一致新增类别时最好重新导出全部标签避免因为names列表错位导致标签整体错误。2.3 YOLO标注格式与目录结构一处处细节都不能错YOLO系列训练数据目录格式并不复杂但很多新人第一次跑的时候都挂在目录结构上。最终数据集目录大概是这个形态tablet_data/ ├── images/ │ ├── train/ │ │ ├── batch01_0001.jpg │ │ ├── batch01_0002.jpg │ └── val/ │ ├── batch02_0101.jpg └── labels/ ├── train/ │ ├── batch01_0001.txt │ ├── batch01_0002.txt └── val/ ├── batch02_0101.txt每张图片对应的标签文件是一个同名txt每一行代表一个目标格式是五个数值类别序号、归一化中心点x坐标、归一化中心点y坐标、归一化宽度、归一化高度。所有坐标都除以图片宽高得到0到1之间的小数。用标注工具框完直接导出就行但导出后我习惯写一个小脚本校验一遍防止坐标越界、空标签、标签和图片不匹配这类问题。import os for split in [train, val]: img_dir ftablet_data/images/{split} lbl_dir ftablet_data/labels/{split} for name in os.listdir(lbl_dir): base os.path.splitext(name)[0] img_path os.path.join(img_dir, base .jpg) if not os.path.exists(img_path): print(f缺少图片: {img_path}) for line in open(os.path.join(lbl_dir, name), r): parts line.strip().split() if len(parts) ! 5: print(f格式错误: {name}) break vals [float(v) for v in parts[1:]] if any(v 0 or v 1 for v in vals): print(f坐标越界: {base}) break这段代码虽然简单但在第一次跑训练之前跑一遍能帮你排除大量莫名其妙的问题。我统计过新手训练报错里至少两成来自数据文件本身而不是模型代码。标注规则也值得定清楚药片框要紧贴目标外轮廓不要包进太多背景胶囊药片按整体框不区分帽和体泡罩板的格子压痕、反光条、阴影都不算药片绝不能标进去。标注标准不一致是最隐蔽的数据毒药——两个标注员对同一粒药的框差了半个身位模型学出来的边界就会漂移。2.4 数据增强策略药片场景宁可保守一点框架自带的增强策略对药片检测有帮助但需要适当调整不能无脑全开。药片的纹理和颜色是重要的分类特征尤其颜色比如黄色药片和白色药片人靠颜色区分模型也一样。内置增强里HSV色相和饱和度扰动如果拉得太大药片颜色会被随机改成脏兮兮的绿色蓝色反而把类别特征破坏掉。我的经验是把色相扰动幅度调小亮度对比度扰动适当开大因为产线不同时段的光照变化必然存在泛化到亮度扰动是必须的。翻转与旋转增强也要留意印刷面。部分药片表面有刻痕或者印字垂直于文字方向的翻转还好任意角度旋转可能会让模型学到镜像印字的药片这类现实中不存在的外形。药片本身是圆形目标0度、90度、180度、270度旋转加轻微缩放基本足够覆盖实际拍摄时的摆位变化。密集复制粘贴增强对这种批量药片场景很有效——把小药片从一张图里裁出来粘贴到其他图的不同位置可以大幅度增加密集场景下的覆盖度。但粘贴时要注意透视和光照方向的一致性做得太粗糙反而引入噪声。3. 第一次跑通YOLO26训练环境、配置与基线模型3.1 环境准备先对好CUDA和PyTorch的版本账环境搭建理论上半小时能完成但版本不匹配可以卡一整天。我现在的习惯是装框架之前先确认两件事一是GPU驱动版本二是与驱动匹配的GPU加速计算版本。顺序错了或者是先装了框架再装加速库经常会装上CPU版本训练速度慢到怀疑人生。推荐在项目目录下建一个独立虚拟环境避免把系统环境弄脏。进入虚拟环境后先确认GPU可以被框架正常识别再继续后面的步骤。这一步千万不要跳我至少见过十次以上训练启动后一直用CPU跑了几小时没发现的情况。显存方面单卡8GB能训练轻量版本16GB或以上可以比较舒服地训练标准版本。如果是小数据集加轻量模型8G显存完全够用但如果要用较大输入尺寸或者较大批次建议直接上24G或40G级别的卡。药片检测一般数据量不大单卡训练足够不需要一开始就租多卡集群。3.2 准备data.yaml路径、类别和names一个都不能错数据集准备好之后训练前还需要写一个数据配置文件用来告诉训练程序去哪里读图、有多少类别、类别都叫什么。这是一个非常简单的yaml文件path: /data/tablet_data train: images/train val: images/val nc: 4 names: 0: amoxicillin 1: metformin 2: vitamin_b 3: aspirin这里最需要注意的是path字段。我建议用绝对路径不要用相对路径。训练程序切换工作目录或在不同环境之间复制项目时相对路径非常容易失效。nc必须和names的数量一致而且是模型读取类别的唯一依据一旦少了或多了训练出来的模型类别就全错。train和val指向的是相对于数据集根目录的子目录路径不是图片的绝对路径。很多人在这里把train: /data/tablet_data/images/train写成绝对路径也能跑但如果按官方推荐结构写路径加错反而会在某些实现里报找不到数据。3.3 训练命令与关键参数的选择思路环境就绪、数据文件就绪之后就开始正式训练。以我使用YOLO26的命令为例yolo detect train \ --data tablet_data.yaml \ --weights yolov26s.pt \ --epochs 80 \ --batch 32 \ --imgsz 640 \ --device 0 \ --patience 15参数看起来不多但每一个都和你的实际数据、硬件条件相关需要理解而不是盲抄。参数我的习惯取值说明epochs80~120药片类别少、目标结构简单80轮足够收敛类别多或数据量少可以加到120batch显存能承受的最大值附近批次大训练更稳定但显存不足会OOM32是一般8G卡的合理值imgsz640起步小目标占比高时考虑960或1280但显存和时间成本翻倍patience15~20连续15轮验证集指标不提升就提前停止省时间还防止过拟合device0单卡训练写0多卡按0,1,2顺序写首次训练我建议就用默认预训练权重启动不要从零训练。药片检测属于迁移学习的目标预训练模型已经掌握了通用的边缘、纹理、形状特征在几万张药片图上微调就能快速收敛。从零训练不仅慢效果也远不如预训练权重。训练日志里会实时显示每一轮的损失、精度、召回率、mAP等指标。第一次训练不要频繁打断、反复调参让它完整跑完一轮再说。我见过很多新手训练到第10轮看到mAP只有0.3就慌了其实正常药片这类数据一般要到30轮以后mAP才明显抬头。3.4 第一次训练后的验收流程训练完不是直接拿去部署先做一套完整的基线验收。打开训练输出目录依次看三样东西训练曲线、验证集的预测可视化图、混淆矩阵。训练曲线里看损失是否持续下降、验证指标是否平稳预测可视化图直接画在原始图片上肉眼看模型框得准不准、有没有明显漏检混淆矩阵看类别之间有没有系统性混淆比如白色小圆片和白色大圆片是否频繁互相认错。我还会记录当前这个模型的验证集mAP0.5和mAP0.5:0.95作为后续调参的基线。没有基线的调参等于凭感觉碰运气你改了一个增强策略效果变好了还是变差了必须对比基线数字才能确定。第一次验收通过之后最好把训练配置和权重文件都归档标注是v1.0基线。后面所有实验都从这份基线出发避免把模型越改越乱找不到原始可用版本。4. 训练过程中的信号怎么读损失曲线与验证指标4.1 box_loss、cls_loss、dfl_loss各自在说什么训练日志里最常见的是三个损失项它们不是同一个东西新手经常把它们混在一起看。box_loss是边界框回归损失简单说就是预测框和真实框的位置差距有多大。药片检测里药片边界清晰box_loss下降通常比较快如果这个损失一直高说明标注框本身可能不干净或者输入分辨率太低导致边界定位不精确。cls_loss是分类损失衡量每个目标分到正确类别的确信度。药片类别之间外观相似度高时cls_loss下降曲线会相对缓慢如果它后期震荡剧烈赶紧去查是不是标注样本里出现了同一个品规被标成两个类、两个品规标成一类的脏数据。dfl_loss是分布焦点损失可以理解为对边界框分布质量的更精细约束对药片这种边缘锐利的目标来说它在验证集上的表现和最终框精度关联度很高。三者的合理演进模式都是一路下降最后趋于平缓任何一项在后期突然反弹都说明有问题。4.2 mAP0.5和mAP0.5:0.95差的那0.4个百分点去哪了mAP是目标检测最核心的指标但很多初学者不太清楚两个版本的区别。mAP0.5只看预测框和真实框的交并比是否超过0.5就算命中mAP0.5:0.95则是在0.5到0.95之间按步长计算多个阈值下的均值对框的贴合程度要求严格得多。在药片检测里mAP0.5达到0.99是可能的因为药片边界清晰、形状固定框稍微偏一点也能重叠超过0.5。但mAP0.5:0.95可能只有0.93左右差异主要来自边界框没有完全贴合药片边缘。如果你最终要联动剔除机构框偏一点问题不大但如果你要根据框的坐标判断药片是否在泡罩窝的正中央那就要重点优化mAP0.5:0.95这时候一个对齐良好的标注集比模型结构更重要。我给客户报告指标时永远同时给两个数值并明确说明哪个才是他们产线验收需要的。很多人只盯着mAP0.5结果上线后才发现框偏得没法用那时候再回炉就浪费工期了。4.3 过拟合和欠拟合在曲线上的直观表现药片数据集往往只有几千张图远小于通用目标检测数据集规模过拟合风险相当真实。过拟合的典型信号是训练集损失持续下降、验证集损失先降后升或者验证集mAP在某一轮后不再增长甚至下降。如果你看到这个趋势优先处理方式不是马上调模型结构而是先做三件事检查验证集划分是否合理数据增强是否开得太猛标注噪声是否过多。欠拟合的信号则相反训练集和验证集指标都低损失下降缓慢。这种情况常常是模型规格太小、输入分辨率不足或者学习率设置不合适。我用一个直观类比过拟合像学生背题考试碰到原题全对换张卷子就垮欠拟合像压根没学明白原题也不会做。药片检测里处理过拟合最有效的办法不是简单粗暴地减小模型而是补充更多真实场景下的变化——换批次的药片、不同光照角度、不同程度的反光。模型见过足够多的真实波动自然就不会依赖某张训练图里的偶然特征。5. 从基线到可交付药片模型的精修与阈值策略5.1 找出错检样本用困难样本回灌代替盲目加数据基线模型跑完先别急着增广数据。我的一般流程是把验证集所有预测结果导出按错误类型分成几个桶分别是漏检、误检、类别混淆、框偏移。漏检最多的是哪些图通常集中在深色药片、高光区域、目标位置太靠近图像边缘这几类。误检最多的是哪里往往是铝箔板的压痕、传送带边缘、药板间隙的阴影。定了桶之后针对量最大的那一类问题去采集或标注补充样本我把这个叫困难样本回灌把模型认错的图挑出来人工标注后加回训练集再训一轮。回灌有一个前提填错单不是直接加原图而是先检查模型为什么会错。如果是标注本身就标错了模型其实是正确学习了错误标签回灌只会让问题更牢固。所以每轮回灌前我都要求标注员重新核验这批困难样本的标签质量。5.2 负样本与背景抑制别把设备边缘误认成药片药片检测的误检大头常常是背景。产线工位上什么都有固定螺丝、反光条、传送带缝隙、铝箔边缘的毛刺这些东西和药片在某些角度下很像。模型没见过这些背景上线了就会把螺丝认成药片进而引发误剔除报警。解决方案很朴素但很有效收集一批完全不含药片的背景图标签文件留空放进训练集。专业说法是负样本。负样本不要随便找网图一定要从目标产线的真实工位环境采集——同样的光照、同样的设备、同样的传送带这样模型才能真正学会工位上这东西不是药片。我第一次做药板项目时负样本只有几十张模型误检率从最初的个位数涨到上线后每百板报三次警。后来我从客户的产线录像里截了两百多张空板图和各角度背景图加进去误检率直接降了一个数量级。负样本数量不用很大但真实度必须高。5.3 置信度阈值、IoU阈值与漏检代价的权衡训练完成后真正上线前你必须面对两个直接影响业务效果的参数置信度阈值和NMS的IoU阈值。置信度阈值决定模型报出结果的严格程度。阈值调高只报非常有把握的目标误检少但漏检也可能增加阈值调低所有疑似目标都报出来漏检少但误检噪音多。医药场景里的核心原则是漏检的代价远高于误检。一粒药缺失没检测出来意味着整板不合格药品流向包装后端而一次误检最多让系统多剔除一块本来合格的药板让人工复查一下。药片缺粒的后果比误报严重得多所以生产线上我一般把置信度阈值调得偏低宁可多报几个可疑目标也不要放过真正的缺粒。但完全靠低阈值硬扛会产生大量无效报警正确的做法是低阈值加二次复核第一遍低阈值粗筛凡是框的数量和位置与标准不一致的药板全部送到一个复核工位用更高阈值的第二次检测或人工目检确认。IoU阈值是控制重复框的参数药片之间可能靠得很近NMS阈值过高会吞掉紧挨着的药片框过低又会保留大量重叠框我一般从0.5开始调观察密集摆放的药片能不能各自保留一个框。5.4 类别不均衡长尾类别怎么处理药片数据集的类别分布通常很不均匀——某款常用药片有几千张图一些冷门品规可能只有一两百张。目标检测训练时模型天然偏向样本多的类别冷门类别的召回率会明显偏低。处理方式分两步。第一步是训练阶段的采样策略对少数类别做重采样让每个类别在一个epoch里出现的次数尽量接近第二步是数据层面给少数类别做针对性增强比如复制粘贴增强里多贴几份少数类药片。如果某个最冷门类别图数少于100张我建议先别把它放进检测模型把该类别的识别单独做成一个二分类处理等数据攒够再合入完整模型。这类取舍在项目汇报里要讲清楚。算法上冷门类别永远追不上的原因不是模型能力不够而是标注现实决定了它没有足够多的正样本去学习稳定特征。6. 部署到产线模型导出、硬件选型与实时链路6.1 训练权重到ONNX/TensorRT导出时最容易翻车的参数训练出来的模型文件是一个打包的权重文件不能直接拿到产线推理。我习惯的路径是先把权重导出成通用的神经网络交换格式ONNX文件再根据部署平台的具体加速引擎做转换。yolo export \ modelbest.pt \ formatonnx \ imgsz640 \ halfTrue \ opset17导出时最常翻车的参数是固定输入尺寸不需要动而batch size和动态维度很容易搞错。如果只在固定尺寸的单一推理场景用直接固定尺寸导出最稳定如果检测画面大小会变化要打开动态维度开关但动态维度在不同推理引擎上的支持程度不一致容易莫名其妙报错。精度方面建议开启半精度导出显存占用减半推理速度提升明显对药片检测这种非极端目标来说半精度损失完全可以接受。导出后先跑一遍推理脚本对比导出的结果与框架直接推理的结果是否一致确认无损再收工。6.2 相机和算力选型确定推理节奏再谈帧率很多客户一上来就要求必须100帧实时我不太认同。药片检测的多数场景根本不需要连续视频流处理而是触发式拍照传送带上的药板经过光电传感器时触发相机拍一张拍完这一帧立刻推理推断完把结果传给下游后再等下一张。触发式处理对帧率的要求低得多反而更重视单帧延迟。工业相机从触发到出图一般几十毫秒模型推理在普通工控机上几十毫秒加起来足以应对每分钟上百板的产线节拍。如果一味追求100帧你可能要花三倍预算上高算力硬件收益却很有限。算力选型方面产线工控机或边缘GPU盒子是主流。轻量模型在带GPU的边缘盒子上能做到单帧20到50毫秒即使没有GPU轻量版本配上多核CPU也能在100毫秒级别跑完很多慢速调剂机场景完全够用。6.3 推理结果如何进业务系统模型输出的坐标是归一化的要先乘图像宽高还原成像素坐标再根据相机标定映射到物理坐标才能用来驱动剔除机构。这个标定环节经常被新手忽略模型跑通了机器却不会动。检测到药板缺粒后我建议的流程是模型先给出当前板缺一粒缺失药片坐标业务系统读取坐标后和产线PLC通信触发剔除动作。同时把当前帧原始图和检测结果存下来作为质量追溯记录。医药质检场景里留痕特别重要既能做产线质量分析也能在模型后续迭代时提供真实反馈数据。后处理部分同样不能省。虽然模型自带NMS但在产线集成时我习惯再套一层过滤逻辑滤掉置信度过低的目标、滤掉尺寸明显异常的目标、滤掉落在药板之外的边角目标。这些规则不归模型管但对产线稳定性帮助极大。6.4 模型管理与版本回滚训练完只是开始模型部署上线不是终点而是版本管理的开始。我见过最惨烈的案例是同事训练了一个看起来指标更好的新模型直接覆盖替换上线的旧模型结果新模型在一个没覆盖到的光照条件下疯狂误检想回滚却发现旧权重没备份整个产线停了半天。现在我的操作规范是每次训练出的权重都带版本号和训练日期验证集上领先的模型先进入灰度验证跑一段时间稳定后再全量替换。旧模型权重永远保留至少三个月。药片检测模型的迭代是一个持续过程每次上线后的误检、漏检样本都值得收集下来作为下一轮训练的负样本或困难样本而不是训完就扔在那里不管。7. 药片检测特有的坑我逐个踩过一遍7.1 高光反光深色药片在铝塑板上的镜面效应深色药片加铝塑泡罩反光是药片检测里最典型也最折磨人的问题。深色药片表面容易形成一片亮白高光把药片自身的纹理完全盖住特征被洗白了模型就会漏检。我的解决思路分两头。数据层面采集时用漫射光源高光区域要控制在尽可能小的范围内如果实在避免不了就把带高光的样本也收进训练集让模型学会即使有高光这也是药片。部署层面如果现场没法改光源可以考虑在推理链路里加一个局部亮度校正的预处理步骤统一光照差异后再送入模型。两种方式配合着用绝大多数反光场景都能压下来。7.2 透明胶囊和薄膜包衣看不见的边界透明胶囊在自然光下几乎是透明的只有边缘一圈淡淡的轮廓标注出来边界往往会抖训练后模型输出的框也不稳定。更麻烦的是薄膜包衣片表面光滑某些角度下边缘和背景融为一体。这类半透明目标最有效的方案就是背光。光源放在物体背面胶囊在图像里变成清晰的深色剪影边缘比正面光锐利得多。如果硬件不支持改造至少要让标注员按照整体外轮廓统一标准标注并调低推理置信度阈值宁可框偏一点不要直接漏掉。7.3 标注噪声把气泡、边缘和灰尘标进标签标注是药片检测里最耗时的一环也是最容易污染模型的一环。泡罩板图片上经常有塑料膜反光形成的小亮点看上去很像小药片铝箔压痕在特定光线下形成深色短线也很容易被标注员顺手框进去。模型对错误标签的学习能力比很多人想象中强你标了一次灰尘它就能在一百张图里把类似灰尘的位置都找出来。所以标注规范要在开工前定死什么算药片、什么不算、边界怎么框、争议目标怎么处理。标注完成后一定要做交叉抽检让两个人独立标同一批图不一致的地方讨论到一致再入训练集。7.4 显存与速度的平衡不要动不动就1280分辨率有朋友一上来就把输入分辨率调到1280理由是分辨率大看得清结果训练一张图慢好几分钟显存爆掉验证集指标却没比640高多少。药片检测的目标尺寸分布和对象复杂度决定了640分辨率已经能覆盖绝大多数场景只有需要检测极密小目标时才值得考虑960或更高。我的一般原则是先用640跑基线观察小目标漏检情况。漏检集中在尺寸很小的药片上再单独测960对比如果指标提升不明显就继续用640毕竟推理速度、显存开销都是实打实的差异。为了虚无的更高分辨率牺牲整个产线推理节拍怎么看都不划算。最后分享一个小习惯每轮实验的验证集错误预测图我都不会删统一放到一个badcase文件夹和上线后收集的误检图混在一起。每隔两周用当前最新模型重新推理一遍这些历史错图你会发现绝大多数时候瓶颈早就从模型本身转移到了标注一致性和数据覆盖度上。把这个环节固定进迭代流程药片检测模型越用越顺产线就会越跑越稳。