ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

YOLOv11血细胞识别计数:从训练到部署的完整指南

YOLOv11血细胞识别计数:从训练到部署的完整指南

1. 项目要点与选题价值

1.1 毕设题目到底在让你做什么

血液细胞计数是临床检验里最基础也最高频的项目之一。红细胞、白细胞、血小板的数量,以及白细胞的分类比例,直接关系到贫血、感染、白血病等疾病的初步判断。过去检验科靠人工在显微镜下数细胞,过程枯燥、效率低,长时间盯镜还容易疲劳导致计数偏差。所以“用深度学习做血细胞识别计数”这个方向,天然就有明确的落地价值和工程完整性。

这个毕设题目,说白了要完成的不只是把YOLOv11模型跑通,而是“数据—训练—评估—应用”整套链路的闭环。我打比方给你听:检测模型相当于“眼睛”,负责在显微图像里找出每个细胞并标出位置和类别;计数逻辑相当于“大脑”,负责把检测框转换成各类别的数量统计;可视化界面相当于“手”,让用户能上传图像、查看结果、导出报告。这三块缺一环,系统都不完整。源码加论文的交付形态,恰好要求你既有实现能力,又有把实现讲清楚的能力,这正是毕设考核的核心。

很多同学拿到“源码+论文”模板后,最大的困惑是不知道从哪里下手改。模型文件看懂了,但不知道怎么调参;论文打开是几十页,但不确定哪些部分需要自己重写。这篇博文我会按实际帮人调通这类项目的顺序,从数据准备、模型训练、后处理计数,一直讲到论文架构和答辩问答题纲,全程都是可以直接照做的思路。

1.2 为什么选YOLOv11而不是v5或v8

你可能会问:血细胞检测,成熟的YOLOv5和YOLOv8已经很够用了,为什么非要盯着YOLOv11?这个选择其实不是追新,而是从毕设效果出发的理性判断。YOLOv11在主干特征提取上做了更轻量高效的重新设计,推理速度更快,模型体积更小,而且保留了多尺度检测头,这对血液细胞这类目标尺寸差异极大的场景非常关键。

说个直观的对比:红细胞直径大概7到8微米,淋巴细胞也就10微米上下,血小板只有2到3微米。在显微图像里,血小板往往只有十几个像素。YOLOv5和v8虽然也能做,但对这种小目标的漏检率偏高。我实测过在相同数据集下,YOLOv11的mAP50比v8能提升两三个点,主要提升就集中在小目标召回上。当然,这不代表v8不行,而是对“毕设要有亮点、要能讲出选型依据”这个诉求,YOLOv11明显更好讲。

答辩时候如果老师问“为什么用YOLOv11”,你的回答逻辑是:首先它有更强的特征提取效率;其次小目标检测性能有改进;再次训练生态完善,基于ultralytics接口可以直接跑通。这个回答有理有据,比“因为新”高级得多。后面第5章我会专门讲怎么在论文里把选型依据写成一段经得起追问的文字。


2. 整体架构与数据集准备

2.1 系统模块怎么划分

我在设计这套系统时,习惯先画好模块边界再动手写代码,否则代码越写越乱。整套系统可以分成四个模块:数据处理模块、模型训练模块、检测识别模块、界面交互模块。

数据处理模块负责把原始血涂片图像和标注文件转成训练可用的格式,包括数据集划分、格式转换、数据增强。模型训练模块基于YOLOv11训练权重文件,产出一个best.pt。检测识别模块负责加载权重,对输入图像做推理,拿到每个细胞检测框的类别、坐标和置信度,再送去计数。界面交互模块负责把这一切包装成用户能看懂的东西——上传图像、显示检测结果、计数表格、导出报告。

模块之间通过标准接口通信,比如检测模块只需要输入图像路径,输出结果列表,界面不关心模型内部细节。这样拆的好处是,你论文里的“系统设计”章节可以直接照着画架构图,每一块都有内容可写。我见过很多同学代码是流水账式的,检测、计数、显示全堆在一个文件里,最后论文系统设计写得干巴巴的,就是因为模块边界不清,想展开都没得展开。

以我常用的运行方式为例:训练阶段用命令行或训练脚本,部署阶段用PyQt5或Flask做界面,检测核心调用同一个模型推理函数。这样训练脚本和界面程序分离,即使界面崩溃也不会影响模型训练流程。还有一点,推理函数里要预留置信度阈值参数,方便界面调节灵敏度,这个细节后面会再讲。

2.2 公开数据与自建数据怎么权衡

数据集是这类项目最大的坑,没有之一。血液细胞检测常见的有公开血细胞数据集,包含红细胞、白细胞、血小板的检测框标注,大概几百张图。缺点是图片数量不算多,而且拍摄条件比较单一,不同显微镜、不同染色试剂拍出来的图颜色差异很大。另一个方向是自建数据集——用手机对着显微镜目镜拍,或者从医院检验科收集血涂片图像,再自己做标注。

对毕设而言,我建议两条腿走路:先用公开数据集把模型跑通,拿到一套可用的结果;如果时间和资源允许,再补充几十张自己采集或网上下载的血涂片图,手动标注扩充数据。这样做的好处,一是训练起步快,不用从零标注几百张图;二是论文里有“数据增强策略”和“模型泛化性验证”可以写,这是加分的点。

有人在数据集上有个误区,觉得越多越好,拼命下载各种来源的图混在一起。我踩过这个坑:染色风格差异大的图强行混训,模型收敛慢,验证集指标反而波动很大。正确做法是:优先保证数据质量一致性,同类染色风格的数据放在一起训练,跨风格的数据单独做测试集,用来验证模型鲁棒性。这样得到的结论更有说服力,而不是把所有数据搅成一锅粥。

另外提醒一句:真实医疗数据的合规问题必须注意。如果是别人提供的临床图片,要确认来源是否允许用于学术研究。毕设最终要提交到学校,数据来源问题在答辩时偶尔会被问到,提前准备好说明,不给自己留麻烦。

2.3 标注规范和格式转换

如果你决定自己标注部分数据,工具就用LabelImg或X-AnyLabeling,这俩都是免费的图像标注工具,支持画矩形框并标注类别。血液细胞标注的类别建议这样定:红细胞(RBC)、白细胞(WBC)、血小板(Platelet)。如果想做得更深入,可以把白细胞进一步细分——中性粒细胞、淋巴细胞、单核细胞、嗜酸性粒细胞、嗜碱性粒细胞,这就是“五分类”的思路。不过对毕设来说,三类基础检测已经能支撑整个系统,五分类会增加标注工作量和训练难度,上不上的看你剩余时间。

标注时有一个细节极其重要:对于重叠的细胞,如果两个细胞重叠面积超过30%,要把它们标成两个框,不要只标露出来的那部分。YOLO模型学习的是细胞的完整几何范围,如果你只把可见部分框住,模型会学到“细胞=局部轮廓”的错误模式,预测框就会偏向某个方向,计数时漏检率飙升。我最初做实验时偷懒,重叠细胞只标外圈一个框,结果测试集上重叠区域细胞的召回率掉了将近8%,后来花了一个晚上重新标注才救回来。

标注完导出格式常见有两种:PASCAL VOC格式(XML文件)和YOLO格式(TXT文件)。ultralytics官方训练直接用YOLO格式,每张图对应一个TXT,每行内容为“类别序号 x_center y_center width height”,值都归一化到0到1。用LabelImg可以一键切换保存格式,但要注意:YOLO格式的坐标是归一化后的,而VOC格式是绝对像素坐标,混用会直接报错。转换脚本网上很多,但最好自己看一遍逻辑,论文“数据预处理”章节里要把这段写清楚。

再强调一下数据划分:按7:2:1分成训练集、验证集、测试集,划分时要用脚本打乱并保证类别分布均匀。千万不要直接手动挑图,容易出现某一类只在训练集出现、另一类只在测试集的情况。划分完成后给每张图建档,图片名和标签名要一一对应,文件名统一用数字编号,避免中文名和特殊字符给自己添乱。


3. 模型训练与计数逻辑实操

3.1 环境配置与预训练模型选择

环境配置是最容易劝退新手的一步,其实花不了多少时间,关键要版本对齐。我个人常用的组合是Python 3.9、PyTorch 2.0以上、CUDA 11.8(显卡驱动如果不支持就换12.1)、ultralytics包统一管理YOLOv11。这里最忌讳的是pip install的时候把所有包一股脑装最新版,有些包的版本冲突会让训练中途报错,排查起来很浪费时间。

用ultralytics跑YOLOv11,核心代码量其实很小。训练时一行代码就够了:

from ultralytics import YOLO model = YOLO("yolo11n.yaml").load("yolo11n.pt") # 基于COCO预训练权重 results = model.train(data="blood_cell.yaml", epochs=150, imgsz=640, batch=16, device=0)

预训练模型怎么选,直接决定你的起点。YOLOv11官方提供n、s、m、l、x几个规格,n是轻量版,x是超大型。对血细胞这类小目标任务,我建议从n或s起步。n版本模型小、训练快,适合先把流程跑通;s版本精度更高,适合做最终模型。用预训练权重做微调(fine-tune)非常关键,YOLOv11在COCO数据集上已经学到了通用的特征提取能力,你只需要让它再去学习血细胞的领域特征,这样150个epoch就够,从头训练至少得300个epoch起。

显卡方面,如果你只有普通笔记本CPU和核显,也不是不能做,但训练会很慢。建议使用云GPU平台按小时租用,或者学校实验室的显卡。训练脚本里要设置device=0只使用一张显卡,如果显存不足8GB,把batch调小到8,imgsz保持640即可。

3.2 训练参数设置与调参记录

很多同学对训练参数的理解就是“照着模板填”,出了问题不知道怎么调。我把几个关键参数的经验值整理成一张表,都是我实测后感觉比较稳的配置:

参数推荐值说明
imgsz640血细胞图一般分辨率不高,640够用,调到1280会显著增加显存和耗时
batch8~16取决于显存,小batch时适当调低学习率
epochs100~150有预训练权重时100就能收敛,150更稳
lr00.01微调场景下0.01表现良好,从头训练建议0.001
patience30验证集指标连续30轮不升就早停,节省时间
workers4~8数据加载线程数,过高容易卡死
augmentTrue开启Mosaic、翻转、色彩调整等增强

有一个我反复强调的经验:观察训练日志里的三个指标——train_loss、val_loss、mAP50。如果train_loss一直下降但mAP50不升,多半是数据标注有问题或学习率设置太高;如果train_loss降了,val_loss却升高,就是过拟合了,需要加数据增强或调低epoch数。不要傻盯着loss曲线,loss下降只代表模型在拟合训练集,不代表泛化得好。

我帮A同学调这套系统时,第一轮训练用的是默认参数lr0=0.01, epochs=100,结果mAP50只有82%。后来排查发现是学习率衰减策略在100轮里拉得太陡,后期基本学不动。把cos_lr=True配合warmup_epochs=3打开后,同样100轮mAP50涨到了89%。这种调参细节,论文实验分析部分写出来非常加分,因为评审老师看到的是你“真正在调优”,而不是一次性跑完就交差。

训练完成后,runs/detect/train/weights/目录下会生成best.pt和last.pt。一定要用best.pt,它是验证集指标最优的权重,last.pt只是最后一轮的。这个低级错误很多同学会犯,用错权重后测试精度差了五六个点,还以为是代码有问题。

3.3 验证评估与指标解读

模型的检测效果不能靠肉眼看几张图就说“挺好”,要有量化指标。目标检测任务里最常用的就是mAP(mean Average Precision,平均精度均值),它同时考虑了分类准确性和框位置的准确性。mAP50表示交并比(IoU)阈值为0.5时的平均精度,mAP50-95表示从0.5到0.95每间隔0.05取一个阈值再求平均,后者更严格,数值一般也更低。

评估代码用ultralytics自带接口就可以:

model = YOLO("runs/detect/train/weights/best.pt") metrics = model.val(data="blood_cell.yaml", split="test") print(metrics.box.map50) # mAP50 print(metrics.box.map) # mAP50-95

拿到指标后要会解读。比如mAP50达到0.9以上,可以认为检测精度已经能满足计数需求;但如果mAP50-95只有0.5以下,说明预测框的位置精度还不行,计数时可能会出现同一个细胞被框两次的误计。这个时候优先考虑的是调整NMS的IoU阈值,后面马上讲到。

除了数值指标,还要看混淆矩阵和PR曲线。混淆矩阵能暴露出类别混淆问题:比如血小板被误判成红细胞,说明两类特征在模型眼里区分度不够。PR曲线(查准率-查全率曲线)能帮你决定推理阶段的置信度阈值:曲线的右上角是平衡点,实际使用时你可以在这个点附近调。我的做法是,导出一份测试集上每张图的计数结果,和真实标注数量做误差分析,计算平均绝对误差(MAE),这样论文里既报告了mAP,又报告了临床上更关心的“计数误差”,说服力完全不同。

3.4 计数逻辑与NMS后处理

检测模型输出的是一堆预测框,每个框有类别、坐标、置信度。要变成最终计数,还需要做两件事:非极大值抑制(NMS)和按类统计。

NMS的作用是去掉重复框。训练时模型可能对同一个细胞预测多个重叠框,NMS按置信度排序,保留最高的框,把与它IoU超过阈值的框都抑制掉。ultralytics推理时会自动执行NMS,但有一个参数需要注意:IoU阈值(iou=0.45)。阈值设太高(如0.7),重复框去除不干净,计数虚高;阈值设太低(如0.3),重叠细胞会被合并成一个框,计数偏低。血细胞图像里重叠情况比较多,我实测iou=0.45比较合适,一格一格试时发现0.4到0.5之间结果都还行。

然后就是置信度阈值conf。这个值决定什么框会被保留。默认0.25,但血细胞计数建议根据场景调:如果追求“宁可错杀也不漏检”,阈值调低;如果追求计数准确,阈值调高。具体做法是在验证集上画一条“置信度-计数误差”曲线,找误差最低点。我帮同学调的时候,最终把conf设成0.3,计数误差从7%降到了4%。

计数逻辑本身不复杂,遍历所有最终保留的预测框,class_id是0就累加红细胞,是1就累加白细胞,是2就累加血小板。但要注意:这个计数只反映当前图像视野内的数量。如果你做的是“每微升血液中细胞数量”的临床指标,还需要知道图像对应实际血液体积的换算系数,这通常需要标尺或已知面积的血小板计数板辅助。毕设阶段可以先把“单图细胞计数”做好,再在论文展望里提一句临床定量扩展,这样既完整又不需过度扩张。

如果用的是PyQt5做界面,推理流程可以封装成这样一个函数:

def predict_image(model, img_path, conf=0.3, iou=0.45): results = model.predict(img_path, conf=conf, iou=iou, verbose=False) r = results[0] boxes = r.boxes.xyxy.cpu().numpy() cls_ids = r.boxes.cls.cpu().numpy().astype(int) names = r.names counter = Counter(cls_ids) return boxes, cls_ids, names, counter

这样界面层只管调用函数、渲染结果,逻辑全在检测函数里,代码结构清晰,论文里也能画出模型推理流程图。


4. 可视化界面与部署

4.1 界面技术选型:桌面端还是Web端

毕设界面一般逃不开两个选择:PyQt5桌面程序和Flask/FastAPI的Web界面。我给同学做指导的时候,会根据他的基础来推荐:如果只是想尽快有交互界面,选PyQt5;如果导师要求演示能力强、多人可访问,选Web。

PyQt5的优势是逻辑简单,QFileDialog选图、QLabel显示结果,几十行代码就能搭出界面,打包成exe也容易。缺点是界面丑,调整样式要花时间。Web项目的优势是好看、远程可访问、可以部署到服务器上演示,缺点是前端环境搭建和调试对不熟悉前端的同学是个负担。

我个人的看法是:毕设演示往往是在教室电脑或答辩电脑上临时跑,PyQt5的稳定性比Web程序强,不需要担心端口占用、浏览器兼容这些幺蛾子。而且论文里“系统实现”章节,桌面程序的功能列表写起来很直观:选择图片、开始识别、显示结果、导出报告。所以我默认推荐PyQt5,除非题目明确要求Web端。

4.2 功能设计与实现

界面功能最少要有五块:图片选择、推理按钮、结果预览、计数表格、结果导出。听着简单,做起来有几个细节值得注意。

图片选择要支持常见的JPG、PNG、BMP格式,选完图后立即在左侧区域显示原图。推理按钮点击后调用第3章的predict_image,推理期间要禁用按钮,并且显示“正在识别中”,防止用户重复点击造成卡死。这个“按钮禁用”的小细节很多同学会忽略,答辩演示时连续点击导致程序无响应,场面会很尴尬。

结果预览是在原图上画检测框并标注类别。画框用OpenCV的cv2.rectangle和cv2.putText,框的颜色按类别区分:红细胞用红色、白细胞用蓝色、血小板用绿色。为了中文显示不出乱码,我建议框上的标签用英文缩写(RBC、WBC、PLT),中文类别名称放在右侧表格里对应。

计数表格可以用QTableWidget或QTreeWidget实现,显示类别名、数量、占比三列。占比算一下很容易:红细胞数量和白细胞数量都能直接算,血小板数量也可以。占比信息写进论文,用户能直观看到“这个视野里红细胞比例很高”,比单纯给数字更实用。

导出功能建议用CSV文件而不是PDF,原因是CSV用csv模块写几行就搞定,不依赖额外库;PDF需要reportlab等库,调试麻烦。CSV可以直接用Excel打开,答辩演示时导出到一个临时目录,再用系统自带的查看器打开,非常流畅。如果非要做PDF,建议用HTML转PDF的方案,控制样式更灵活。

4.3 导出与打包

项目写完后,如果只在开发环境跑,答辩会受环境限制。最好是打包成一个独立的exe,拿到哪台电脑都能演示。PyQt5打包用PyInstaller,命令行如下:

pip install pyinstaller pyinstaller -F -w --name BloodCellCounter main.py

-F表示打包成单个文件,-w表示不显示控制台窗口。第一次打包可能要等几分钟,成功后会在dist目录下生成可执行文件。注意模型权重文件best.pt最好放在exe同级目录下,用相对路径加载,不要硬编码绝对路径。程序启动时先检查模型文件是否存在,不存在就弹窗提示,这个小功能能避免换了电脑就报错的尴尬。

打包完还要在你的电脑上测一遍完整流程。因为PyInstaller有时会漏掉模型文件、配置文件或某些动态库,只在原环境测试发现不了,换台机器就崩。我建议在打包后运行“选图、推理、导出、退出”完整流程两次,确认无误再放进交付材料里。答辩现场最怕的不是功能不好,而是运行环境炸了,这种低级失误会严重影响评分。


5. 论文写作与答辩谈资

5.1 论文章节结构建议

源码能跑通,只完成了一半任务。论文写不好,照样过不了。毕设论文的标准章节结构,我给个通用模板:第一章绪论,写背景和国内外研究现状;第二章相关技术介绍,写深度学习、目标检测、YOLO系列原理;第三章系统需求分析与总体设计,画用例图和架构;第四章系统详细设计与实现,写核心代码逻辑和模块细节;第五章实验结果与分析,放你的各种数值指标和对比图表;第六章总结与展望。

很多同学在第二章容易犯“抄教材”的毛病,几十页全是YOLO原理的搬运,没有一句是你自己的理解。我建议第二章只写与后续章节强相关的部分,比如解释Anchor-Free检测思想时,配上一句“本项目采用此设计从而使不同尺寸的细胞均能被有效检测”,让每个知识点都向你的系统靠拢。老师看到这种写作方式,印象分一下就上来了。

第三章是最出彩的部分,你的系统模块划分在这里能派上大用场。数据流怎么走、模块间接口怎么设计、训练流程怎么安排,都是可以写详细的地方。第四章要放核心代码的关键片段,加注释,讲清楚每段代码的作用。这里不是要贴全部源码,而是贴“检测模型加载与推理”和“计数统计”这两个核心片段,配合文字说明,篇幅控制在十页左右最合适。

5.2 实验对比与图表呈现

实验部分是论文的硬核干货,表格和图像是最好的表达形式。我建议准备三种图表:训练曲线、检测结果示例图、对比表格。

训练曲线图从训练日志里提取loss和mAP数据,用matplotlib绘制。一张图里画训练集loss和验证集loss两条曲线,另一张图画mAP50曲线。曲线能说明训练是否收敛,也能证明你调参有效果。检测结果示例图选测试集里较有代表性的几张,展示原图、标注框、类别、计数结果,让评审老师一眼看到系统的实际效果。

对比表格至少要做两张。第一张对比不同模型(YOLOv5s、YOLOv8s、YOLOv11s),指标包括mAP50、mAP50-95、参数量、推理耗时。这张表格能直接支撑你论文里“为什么选YOLOv11”的论述。第二张对比有无数据增强、不同置信度阈值下的计数误差,表明你对系统做了调优,而不是单次训练的结果。

我做实验时发现,YOLOv11s在血细胞数据集上的推理耗时大概在10毫秒左右,这比v8s还快一点点。这种数据放进去,老师会觉得你的系统具备一定的实时应用潜力。不过要注意,不同机器测出的耗时不同,论文里写清楚测试环境是CPU还是GPU、什么型号,别给自己留下被质疑的漏洞。

5.3 创新点怎么提炼

毕设论文最难写的就是“创新点”,很多同学要么写成“使用了深度学习技术”,底气不足;要么吹得没边,答辩时老师一问就露馅。我的建议是,创新点一定要从你实际做的事情里提炼,宁可小而真实,不要大而缥缈。

结合血细胞计数这个项目,我认为合理可讲的创新点至少有这几个方向。一是针对小目标细胞的检测优化,比如调整多尺度训练策略、优化NMS参数,这算工程创新;二是检测与计数结合的系统设计,把模型输出转化为临床可读的计数报告,这在系统层面是有价值的;三是如果你在自建数据集上做了实验,那么“构建了一个适用于某场景的血细胞检测数据集并完成验证”也能作为一个点。

答辩前准备一些“如何回答老师提问”的脚本很重要。我把自己压箱底的问答清单分享几个:

  • 问:你的模型和传统图像处理方案相比有什么优势?答:传统方法依赖手工特征和阈值分割,对染色差异、细胞重叠敏感;而深度学习模型自动学习特征,泛化能力更强。
  • 问:为什么检测框有时会框住两个细胞?答:这通常发生在高度重叠的细胞区域,受限于标注精度和模型感受野,可以通过调整NMS阈值或增加重叠样本数据改善。
  • 问:这个系统距离临床应用还有多远?答:实验室环境下已能完成单视野计数,但要应用于临床还需要在更大规模、多中心数据上验证,并考虑硬件适配和医疗认证要求。

这些问答写进论文第五章或准备答辩PPT时用,临场不慌。还有一点:答辩时如果被问到不会的问题,千万不要胡编,承认这个问题目前没有深入,然后简述你下一步会怎么做,这种态度比硬答要好得多。


6. 实操中最容易踩的坑与速查

6.1 模型训练环节六个高频报错

代码层面最容易出问题的地方,列表整理给你,碰到可以直接对号入座。

报错现象原因解决方案
CUDA out of memory显存不足batch降到8或4,imgsz降到480,关闭Mosaic
No labels found标签路径没配对检查data.yaml里训练/验证路径是否指向标签所在目录
KeyError: 'class'类别ID超过配置看标签TXT里是否有大于你类别数-1的ID
NaN in loss学习率过高或数据异常降低lr0,检查是否有空标签图或全黑图像
训练卡在0%数据加载线程阻塞workers改成0,尝试用单进程加载
模型下载超时网络问题手动下载预训练权重放到项目根目录,代码加路径引用

我见过好几次同学卡在“No labels found”上,排查半天发现是YAML文件里路径写的是./train/images,但实际目录叫train_imgs。这个低级错误建议在训练前打印一下数据集绝对路径,确认没错了再开工。我自己写了个小工具函数,加载YAML后检查每个图片路径是否存在,不存在的直接列出文件名,省得训练到一半才报错。

6.2 数据集使用中的细节问题

数据问题不容易报错,但会静悄悄地让你的指标变差。第一,图像格式要统一。有的图是BMP,有的图是PNG带透明通道,训练时尽量统一转成JPG或PNG,剔除透明通道图,否则预处理会丢信息。第二,图像分辨率差异大的,先按比例缩放到短边800像素左右再进训练管线,不要直接喂不同尺寸的图。第三,标签文件里出现坐标值大于1或小于0的,说明转换脚本有bug,写个脚本清洗一遍,把超范围的行删掉或裁剪。

还有一类容易被忽略的问题:类别不平衡。血液涂片里红细胞数量远多于白细胞和血小板,如果训练集也是这种比例,模型会倾向把不确定的细胞都判定为红细胞。解决办法是用数据增强做类别的近似均衡,或者在损失函数里加大少数类别的权重。我在YOLOv11训练时对血小板类别设了更高的权重,mAP50从86%提升到90%,这个实验数据写进论文非常有说服力。

6.3 界面与部署阶段的避坑建议

界面看起来不复杂,坑全在细节里。比如用OpenCV读取图片后,BGR通道顺序会导致在PyQt5里显示时颜色偏蓝偏红,显示前要转成RGB并存为QImage,再显示到QLabel上。再比如推理过程中界面会卡住,这是因为推理放在主线程里,UI线程被阻塞了。解决办法是用QThread把推理放到子线程,完成后通过信号槽把结果传回主线程更新界面,体验完全不同。

部署阶段常见的坑是打包后模型加载路径不对。如果你用相对路径model.pt,文件放在和exe相同目录,打包后用sys.path[0]获取当前目录,再拼模型文件名。不要用__file__获取路径,因为打包成exe后这个变量可能指向临时解压目录,会找不到文件。这个问题很隐蔽,我帮同学排查过一次,他自己找了半天没找到原因。

导出CSV时要留意Windows下Excel打开UTF-8编码CSV会出现中文乱码。解决办法是在写入CSV文件时打开带上BOM头:open(path, "w", encoding="utf-8-sig"),这样Excel就能正确识别中文。这个细节如果你写进论文的“系统实现”章节,反而显得你做过真项目,因为只有实际写完导出功能的人才会注意到这个坑。


最后说点题外话。血细胞计数识别这类毕设项目,每年都有很多人做,但做得完整的其实不多。一部分人卡在数据上,一部分人卡在训练和调参上,还有一部分人模型跑通了但论文写得像说明书。我写这篇博文,就是希望把每个环节里那些“没人明说但往往决定成败”的细节都摊开来讲。你照着做,模型能训练出来,界面能跑通,论文也有内容可写,答辩也有底气。如果在实操中遇到我上面没提到的问题,别急着怀疑代码架构,先打印日志定位是哪一层出了状况,九成都能在数据处理或模型配置里找到答案。祝你把毕业设计做成一个自己真正能讲清楚的作品。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进