恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

基于深度学习的糖尿病视网膜病变检测系统设计与PyQT实现

  • 首页
  • 资讯中心
  • /
  • 基于深度学习的糖尿病视网膜病变检测系统设计与PyQT实现

相关资讯

Canvas气泡跟随鼠标动画实战:柔性跟随原理与性能优化全解析 2026/10/18 4:11:20
GEO优化实战:让品牌成为AI答案的首选来源 2026/10/18 4:11:20
Revula:基于MCP的逆向工具链自动化服务实践 2026/10/18 4:11:20

最新资讯

SAP 公共已发布 API,撑起 ABAP Cloud 升级稳定性的接口契约
学习C#开源报表组件Seal Report(38:Seal Report Designer界面布局-34)
学习C#开源报表组件Seal Report(39:Seal Report Designer界面布局-35)
轻量人脸表情识别系统:课堂行为检测的工程化实践
TensorRT INT8量化实战:行人检测与密度分析系统部署全攻略
从I/O分配到自动寻址:PLC堆垛机立体仓库设计与调试全解析

今日推荐

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

基于深度学习的糖尿病视网膜病变检测系统设计与PyQT实现

发布时间:2026/10/18 4:11:20
基于深度学习的糖尿病视网膜病变检测系统设计与PyQT实现 1. 项目整体思路拆解这个毕设选题为什么值得做1.1 从医学痛点倒推技术路线糖尿病视网膜病变Diabetic Retinopathy简称DR是糖尿病最常见的微血管并发症之一也是全球范围内成年人群致盲的主要原因。临床上的核心痛点在于早期病变往往没有明显的视觉症状患者难以自我察觉而一旦进入增殖期治疗难度和费用都会大幅上升。眼科医生需要借助眼底彩照逐张判读病变等级工作量大、对经验要求高基层医疗机构的阅片能力又明显不足。深度学习在这类医学图像分类任务上有天然的优势图像特征自动提取、端到端训练、推理速度快。把卷积神经网络部署到桌面程序里让用户上传一张眼底照片就能得到病变分级结果正好切中“辅助筛查”这一真实需求。从毕设角度讲这个选题的好处是三方兼顾深度学习算法体现技术含量PyQT界面体现工程能力医学场景自带可解释的展示价值答辩时容易讲出让评委点头的故事线。我在带学生做类似项目时经常说毕设选题不是越难越好而是要让评委在十分钟内看懂“你解决了什么问题、用了什么方法、效果行不行”。DR病变检测这条线正好可以完整覆盖这三个问题。1.2 系统功能边界与模块划分一个完整的DR检测桌面系统功能上至少需要拆成四块。第一块是图像输入与管理。用户通过本地文件选择或拖拽方式载入眼底图像系统要支持常见图片格式JPG、PNG、BMP并对图像的尺寸、通道数做预处理检查。遇到超大尺寸的眼底图需要做无损缩放或分块处理否则模型推理时会爆显存这是很多新手容易忽略的细节。第二块是深度学习推理引擎。加载训练好的模型权重对输入图像执行预处理尺寸resize、归一化、通道调整然后前向推理输出各类别概率。重点在于预处理和训练时必须保持完全一致——Resize插值方式不同、归一化均值方差不同都会导致实际效果和训练指标对不上。第三块是结果展示模块。除了显示分级结果通常分为0-4级、对应轻度/中度/重度等还要显示每个类别的置信度条形图有条件的话可以叠加病变区域的注意力热力图这在答辩时是非常好的加分项。第四块是辅助功能。建议加上检测记录的保存与查看、PDF报告导出、简单的参数设置界面。这些功能虽然不复杂但能让系统从“能跑通的模型”变成“像样子的产品”在系统展示环节会明显拉开分数差距。1.3 技术栈选型为什么是PyQT PythonPython是深度学习生态最成熟的语言训练脚本、模型导出、推理部署几乎没有迁移成本所以算法层用Python是共识。GUI层可选方案很多我在实际项目中比较过几个Tkinter自带库零依赖但控件风格老旧做医疗场景的界面显得廉价布局复杂时需要花大量时间调试。Web前端Flask/FastAPI 浏览器页面展示效果好但需要同时维护前后端两套代码打包成离线桌面程序的流程绕。PyQT5/PyQT6控件丰富、样式可定制、对图像的显示支持好QLabel可以直接加载QPixmap配合qss样式表能做出很专业的界面效果且可以用PyInstaller打包成单目录或单文件程序。学习曲线虽然比Tkinter陡一些但对于有Python基础的人一周内完全可以上手。我的推荐是PyQT5。PyQT6虽然更新但网上资料量、示例代码量还是PyQT5更丰富遇到问题更容易搜到现成答案。电商平台上卖的开源毕设项目也多数是PyQT5写的参考代码好找。做毕设讲究的是稳妥生态成熟比版本新更重要。2. 深度学习模型选型与训练细节2.1 数据集规模、分级标准与预处理思路DR检测本质是一个图像分类问题公开比赛最常用的做法是把眼底图像按国际分级标准划分为0到4共五个等级0级无病变1级轻度非增殖期仅有微动脉瘤2级中度非增殖期存在出血、硬性渗出等但未达到重度标准3级重度非增殖期多个部位出现广泛出血、微血管异常4级增殖期出现新生血管、玻璃体积血、视网膜脱离公开数据集方面最常用的是某大型筛查项目发布的眼底图像集训练集约有3.5万张、测试集5万张左右类别分布极不平衡——无病变样本占大多数重度样本很少。还有一些小型数据集合集可用于补充训练。如果网络受限也可以找国内的公开医学图像数据集或者自己从公开论文的补充材料中整理一般做到上万张规模就够完成一个像模像样的训练了。我在处理这类数据集时有一套固定的流程清洗。删除质量过差的图像过度曝光、严重失焦、镜头污渍遮挡。去除重复/近似样本。用感知哈希做一次去重避免相同图像同时出现在训练集和验证集造成虚高指标。剔除争议样本。医疗数据集里经常存在标注噪声训练后单独拎出错误样本检查如果发现大量“模型认为有病但标注为无病”且图像确实有明显出血灶的情况考虑修正标签或删除该样本。2.2 模型选型ResNet、EfficientNet还是Vision Transformer模型选型基本遵循“先跑通再优化”的原则。初次实现建议直接使用在ImageNet上预训练的模型做迁移学习不要从零训练。原因很简单医学图像数据量虽然上万但相对模型参数量来说还是不够预训练权重已经学到了通用边缘、纹理特征可以大大加速收敛并提升最终精度。不同骨干网络的谱系对比ResNet50成熟稳定显存占用适中训练技巧丰富适合作为基线模型。大部分论文里的对比指标都能复现出问题好排查。EfficientNet-B3/B4在同等参数量下精度更高计算量也更大一些。如果显卡显存低于6GB建议用B3以下。DenseNet121参数量小精度和ResNet50基本持平对大尺寸图像内存压力小适合作为集成模型之一。Vision TransformerViT/Swin Transformer在大型数据集上表现更好小数据集上优势不明显且训练技巧要求高需要更长训练轮次、更强正则化。毕设场景不推荐作为主模型但如果想展示前沿视野可以用Swin-Tiny做一个对照实验。我的实际建议是主模型用ResNet50或EfficientNet-B3然后选另一个差异较大的模型做对比实验把两组实验的准确率、参数量、推理耗时列成表格放在论文的实验章节里。这也是答辩时“有实验、有思考”的直接体现。2.3 数据增强医学图像不能乱拧通用的数据增强——随机旋转、翻转、色彩抖动、随机裁剪——在自然图像上很好用但在眼底图像上要谨慎。原因在于医学诊断依赖的是微小的病灶细节过强的几何变换会扭曲病变形态过强的颜色扰动会改变出血灶和渗出物的对比度特征。我的增强策略分两档。普通档只用了随机水平翻转、垂直翻转、小角度旋转正负15度以内、轻微随机缩放0.9到1.1倍激进档额外加了随机亮度对比度扰动和少量高斯噪声。测试阶段不叠加任何增强只用中心裁剪后resize。颜色空间的扰动幅度控制在较低水平保证不会把无病变图像增强成像是“有病变”的伪样本。数据不平衡问题在DR场景特别突出。除了加权采样和类别权重我用了一个更直接有效的办法对少数类样本在线的强增强对多数类样本做正常的弱增强。这样每个batch里少数类的多样性更高模型不会因为反复看到同一批重度样本而过拟合。2.4 训练策略与关键参数从迁移学习到微调训练代码的关键部分这里给一份可以直接套用的参数配置# 数据加载与增强torch版 import torch from torchvision import transforms from torch.utils.data import Dataset, DataLoader train_transforms transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.RandomAffine(0, translate(0.05, 0.05), scale(0.9, 1.1)), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_transforms transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])# 模型加载与训练循环 from torchvision import models model models.resnet50(weightsmodels.ResNet50_Weights.IMAGENET1K_V2) # 替换最后一层输出的类别数是5 num_features model.fc.in_features model.fc torch.nn.Sequential( torch.nn.Dropout(0.3), torch.nn.Linear(num_features, 5) ) # 分阶段设置学习率特征提取层学习率低新加分类头学习率高 optimizer torch.optim.AdamW([ {params: [p for n, p in model.named_parameters() if fc not in n], lr: 3e-5}, {params: model.fc.parameters(), lr: 3e-4} ], weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR( optimizer, T_max30, eta_min1e-6 )训练参数的经验值初始学习率3e-4到1e-4之间batch size视显存调整224分辨率下ResNet50在8GB显存可以跑batch size 32Epoch数20到30使用早停验证集准确率连续5个epoch不提升就停止同时保存验证集指标最好的模型权重而不是最后一个epoch的权重。 需要注意一个细节如果使用了PyTorch的官方预训练权重预处理必须用ImageNet的均值方差0.485、0.456、0.406做归一化并且注意模型默认输入是RGB三通道不要因为眼底图像偏红色就自作聪明改成单通道。2.5 评估指标准确率不够还要看敏感度和AUC这个医疗场景不能只看准确率。由于数据集中0级样本占大多数一个“全部预测为无病”的弱智模型也能得到很高的准确率。因此在答辩时至少要呈报三组指标分类准确率Accuracy常规指标体现整体判断能力。加权F1分数Weighted F1对类别不平衡更敏感比Acc更能反映模型好坏。二分类AUC把有无病变视为两分类0级为阴性1-4级为阳性体现模型区分“有病/没病”的能力这个指标在医学筛查场景下意义最大是评委大概率会问到的一个点。 答辩时别只背数字要会解释。比如可以说筛查系统的核心目标是不漏掉重症患者所以我们要重点看敏感度Sensitivity即在真正有病变的样本中模型能找出多少。3. PyQT桌面应用设计与实现3.1 界面布局把医疗工具的“专业感”做出来PyQT界面不建议用那种拖拽生成的IDE手动写布局代码更可控。主窗口结构大概分四块区域顶部工具栏、左侧图片显示区、右侧结果信息区、底部状态栏。推荐用QMainWindow作为主窗口中间放一个QSplitter做左右分栏。左侧用QLabel展示眼底原图图片过小时自动缩放图片过大时放缩略图并在右下角标注原始分辨率。右侧放分组框QGroupBox分别是“检测结果”“概率分布”“操作区”。检测结果用大号字体显示0到4级病变等级和对应医学描述概率分布用QProgressBar横向排列或者用matplotlib嵌入绘制条形图操作区放“选择图片”“开始检测”“保存报告”三个主按钮。底色和字体有个小技巧医疗工具界面建议用白/浅灰底色按钮用统一的强调色比如深蓝字体用系统默认的“微软雅黑”或“PingFang SC”不要用花哨的字体整体风格要往“严肃工具”的方向走。3.2 关键代码骨架从图片输入到结果输出核心的推理模块可以单独封装成一个类。它负责两件事加载模型和预处理、执行前向推理。注意第一次加载模型可能耗时数秒界面要在后台完成加载避免阻塞主线程。import torch import numpy as np from PIL import Image from torchvision import transforms from PyQt5.QtGui import QImage class DRInferenceEngine: def __init__(self, model_path, devicecpu): self.device device self.model torch.load(model_path, map_locationself.device) self.model.eval() self.transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) def predict(self, pil_image): # PIL图像直接走与训练一致的预处理 img self.transform(pil_image).unsqueeze(0) img img.to(self.device) with torch.no_grad(): logits self.model(img) prob torch.softmax(logits, dim1).cpu().numpy()[0] label int(np.argmax(prob)) return label, prob staticmethod def qimage_to_pil(qimage): # 将Qt的QImage转换成PIL Image用于预处理的头像 width qimage.width() height qimage.height() ptr qimage.bits() ptr.setsize(qimage.byteCount()) arr np.array(ptr).reshape(height, width, 4) # 注意格式可能是RGBA8888 return Image.fromarray(arr[:, :, :3][:, :, ::-1]).convert(RGB)# GUI槽函数示例选择图片并执行检测 def on_detect_clicked(self): file_path, _ QFileDialog.getOpenFileName( self, 选择眼底图像, , Image Files (*.jpg *.png *.bmp) ) if not file_path: return self.load_image(file_path) # 更新状态栏 self.statusBar().showMessage(正在检测请稍候...) # 推理这里为了演示直接调用实际项目应当放到子线程 label, prob self.engine.predict(self.pil_image) self.update_result_ui(label, prob) self.statusBar().showMessage(检测完成)3.3 线程处理为什么检测必须放子线程PyQT的主线程负责GUI事件循环如果在主线程里执行模型加载或推理界面会变成“未响应”状态轻则影响体验重则让评委觉得系统不稳定。尤其是第一次加载模型、读取大尺寸图片时主线程一卡就是好几秒。解决方法是使用QThread把模型加载和推理都放到工作线程里通过信号把结果传回主线程更新界面。from PyQt5.QtCore import QThread, pyqtSignal class InferenceWorker(QThread): finished pyqtSignal(int, list) error pyqtSignal(str) def __init__(self, engine, pil_image): super().__init__() self.engine engine self.pil_image pil_image def run(self): try: label, prob self.engine.predict(self.pil_image) self.finished.emit(label, prob.tolist()) except Exception as e: self.error.emit(str(e)) 线程使用有两个容易踩的坑一是信号参数不要在子线程里直接传自定义对象除非用PyQt的底层对象传list或dict最稳妥二是模型第一次推理之前可以做个热身推理把CUDA的上下文初始化时间放到加载阶段而不是用户点击检测的时候。3.4 打包与发布PyInstaller的几个实战心得毕设答辩通常需要一个双击就能跑的可执行文件。PyInstaller打包PyQT PyTorch程序最大的痛点是体积和torch相关依赖的隐藏导入。常用的打包参数pyinstaller --windowed \ --name DRDetectionSystem \ --icon icon.ico \ --add-data models/best_model.pt;models \ --add-data assets;assets \ --hidden-import torchvision.transforms \ --hidden-import torchvision.models \ --exclude-module matplotlib \ main.py几个经验细节不要试图把模型文件一起打成单个exe——模型文件几百MB甚至1GB做成单文件模式会导致启动极慢还容易触发杀毒误报。建议打成目录模式默认的dist文件夹模型文件放在models子目录程序启动时用相对路径加载。打包前把所有图片和资源统一放一个assets目录程序里绝不写绝对路径用os.path.dirname(sys.executable)或sys._MEIPASS打包成单文件时来定位资源根目录。PyTorch的CPython扩展打包容易漏动态库建议使用PyInstaller最新版本并在打包后测试无联网环境下能否正常加载模型。如果打包后体积实在太大超过1GB可以考虑用ONNX导出的方式来减小安装包后文会展开讲。4. 毕业答辩准备要点评委最关心的五个问题4.1 演示脚本要先预演三遍很多学生忽略答辩演示脚本的设计导致现场手忙脚乱。建议按“两分钟故事线”来组织先讲清楚糖尿病视网膜病变是什么、为什么需要自动检测再演示上传一张正常图片得到0级结果再上传一张病变明显图片得到3级或4级结果顺便展示概率分布最后总结一句话——整个流程控制在三分钟内。演示时最忌讳的就是现场卡住。提前准备了一张测试图像放在桌面演示时直接从桌面拉取避免现场慢慢翻文件目录。如果现场网络不稳定禁止打开远程链接查看源码或在线文档。4.2 高频答辩问题清单及应答思路结合我带毕设答辩的经验这类AI医学图像项目的高频问题集中在模型原理、数据处理、系统设计三个方向。每个问题都有一个“保命式应答模板”。第一个必问题为什么选深度学习和CNN而不是传统机器学习方法应答思路分两层——传统方法HOG、LBP特征SVM需要人工设计特征而DR病变的形态特征微动脉瘤、出血点、渗出物大小、颜色、位置密度差异很大规则特征很难全面覆盖CNN通过端到端学习能自动提取层次化特征在公开数据集上的精度明显高于传统方法。再说一句“我用ResNet50迁移学习在验证集上达到了XX%的准确率”来落地。第二个必问题数据从哪里来标注可靠吗应答思路——主要使用公开数据集数据集中每张影像由若干位眼科医师独立标注后综合确定标签同时我在训练前做过数据清洗和噪声样本剔除并用可视化方式检查了模型关注的区域是否符合临床逻辑。第三个必问题为什么选这几种模型做对比应答思路——ResNet是CNN的经典代表显存和推理性能均衡EfficientNet在相同FLOPs下精度更高Swin Transformer代表当前视觉特征提取的新范式。通过对比实验说明不同网络结构在该场景下的精度与耗时差异。第四个必问题系统的检测结果能不能直接作为诊断依据这里必须强调系统定位是辅助筛查工具不能替代临床诊断。模型的输出需要结合患者病史、其他检查结果由医生综合判断。如果评委追问漏诊问题坦诚说明模型在难例如早期微动脉瘤仅一到两个上确实存在局限并通过敏感度指标说明系统堤坝了大部分中等以上病例。第五个必问题项目工作量和技术难点分别是什么应答思路——工作量体现为“数据清洗模型训练系统开发实验对比”全套流程难点体现在数据类别极度不平衡、眼底图像存在亮度不均等问题以及PyQT与Python推理端的数据流转和线程设计。要会用一两句话讲清楚自己做的增量工作而不是只套用现成代码。4.3 论文与成果对应关系的展示技巧答辩PPT中极好用的一个结构是“三屏对应”左屏放论文中的实验对比表中屏放系统的界面截图右屏放一段推理输出的时间曲线或loss曲线。让评委同时看到论文里的理论设计和系统的实际效果会明显增加说服力。可以从训练日志中截取loss下降曲线和验证集准确率的曲线图插入PPT让评委觉得训练过程真实可信。5. 常见问题与避坑实录踩过的坑都在这里5.1 环境搭建与依赖版本冲突这个项目涉及的依赖包括PyTorch、PyQT5、OpenCV、NumPy、scikit-learn等版本冲突非常常见。其中最典型的是OpenCV的cv2与PyQT的信号类型混用时出现的类型转换错误——cv2读入的是BGR格式的numpy数组PyQT显示需要先转RGB或直接用QImage的Format_BGR888格式两种思路都行但别搞混。推荐的安装顺序是先装PyTorch选择匹配CUDA版本的指令再装PyQT5最后装其余依赖。尽量全程使用同一个虚拟环境创建工具不要在系统环境里裸装否则各个包之间的依赖关系很容易被破坏。环境装好后第一时间做一个“验证脚本”跑通模型加载和GUI初始化的最小样本确保环境可用再开始写功能代码。5.2 训练精度与演示效果不一致最常见的问题训练时验证集准确率很高但拿一张网上下载的眼底图到GUI里检测效果很差。主要原因是数据分布不一致——公开训练集的图像多经过标准化的采集设备处理而网图或手机拍摄的眼底图可能存在色彩偏移、清晰度下降等不同的成像条件。此外模型的过拟合也会导致对“陌生风格图”泛化差。解决思路是训练中加入更强的随机增强模拟亮度不均、模糊、噪声或者收集几十张不同来源的真实眼底图做微调。演示时优先用测试集内部的图像因为模型的表现是最真实的、可复现的。千万不要拿一张完全脱离训练分布的图去演示然后被评委当场验证翻车。5.3 PyQT界面卡顿与内存泄漏卡顿的原因多半是主线程执行了耗时操作——加载大图视网膜图像动辄几兆像素、模型推理、从磁盘读取报告模板。把推理放到子线程可以解决大部分卡顿图片显示可以用QPixmap.scaled控制显示尺寸而不是直接加载原图否则内存会瞬间暴涨。内存泄漏常见原因是每次推理都新建numpy数组或PIL图像但没释放以及QImage转换时没有正确管理引用。建议在无操作循环里定期显示当前内存占用调试定位泄漏点。另外注意QLabel反复setPixmap时旧像素图要手动释放或直接新建QPixmap变量覆盖。5.4 模型文件过大和启动速度优化假设用ResNet50训练得到一个约90MB的PyTorch权重文件再加上PyTorch运行时打包的exe目录整体体积会超过1.5GB。如果答辩现场需要拷贝演示环境体验确实不太好。一个很实用的优化路径是把PyTorch模型转换成ONNX再用ONNX Runtime推理。ONNX格式文件通常和PyTorch原大小相当约90MB但运行时依赖只有几十MB整体体积减小明显。CPU上的推理速度也能提升因为ONNX Runtime做了算子融合优化。如果选择这条路需要在GUI代码把推理引擎从torch.model换成onnxruntime.InferenceSession预处理逻辑保持不变验证一遍结果一致性即可。 转换关键代码提示导出时的输入张量尺寸要和训练时的resize尺寸保持一致比如统一为(1, 3, 224, 224)。如果训练时使用了动态resize导出时需要固定尺寸否则运行时易出错。5.5 答辩现场的“应急三件套”最后分享一个线下演示的保命组合我每次实操都会准备一份预生成的检测结果截图万一现场环境不支持相机采集图像或模型加载异常直接展示截图也能说明问题。一份命令行启动的备用版本GUI启动失败时可以立即用命令行脚本跑通推理并把结果打印出来保住“系统可用”的基本盘。一份离线文档将PPT导出的PDF放副本在U盘万一现场投屏异常可以快速分发。说到底毕设的本质是证明你掌握了一套完整的工程方法想清楚问题选对技术路线做出来且能讲明白“为什么这样设计”。糖尿病视网膜病变检测这个题目技术不偏门、场景有价值、工作链条完整做出来本身就很有说服力。如果在做这个项目的过程中把上面提到的数据细节、模型细节、工程细节都真正过一遍那收获的不仅仅是一个用来毕业的项目而是一套将来做任何AI视觉系统都能复用的实战经验。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号