基于 Mask R-CNN+ PyQt5的药片缺陷分割检测系统

一、项目概述本项目实现了一个基于 Mask R-CNN 深度学习模型的药片缺陷检测系统能够自动识别和定位药片表面的污染contamination和裂纹crack两类缺陷。系统提供了完整的训练流程、GUI 可视化界面和推理工具适用于药品质量检测场景。二、系统架构2.1 核心技术栈深度学习框架: PyTorch torchvision模型架构: Mask R-CNN (ResNet-50-FPN backbone)数据增强: Albumentations界面开发: PyQt5预训练权重: COCO 数据集2.2 数据集结构magnesium/ ├── train/ │ ├── images/ # 420 张训练图片 │ └── labels/ # LabelMe JSON 标注 ├── val/ │ ├── images/ # 86 张验证图片 │ └── labels/ └── test/ ├── images/ # 7 张测试图片 └── labels/数据集包含两类缺陷污染 (contamination): 药片表面异物裂纹 (crack): 药片表面裂痕三、核心技术实现3.1 数据预处理LabelMe JSON 标注解析系统使用 OpenCV 将多边形标注转换为实例分割 maskdef _polygon_to_mask(self, points, img_shape): 将多边形顶点转换为二值 mask mask np.zeros(img_shape, dtypenp.uint8) points_array np.array(points, dtypenp.int32) cv2.fillPoly(mask, [points_array], 1) return mask3.2 数据增强策略使用 Albumentations 库进行多样化增强def get_train_transforms(): return A.Compose([ A.HorizontalFlip(p0.5), A.VerticalFlip(p0.5), A.Rotate(limit15, p0.5), A.RandomBrightnessContrast(p0.3), A.GaussianBlur(blur_limit3, p0.2), A.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ToTensorV2() ], bbox_paramsA.BboxParams(formatpascal_voc, label_fields[labels]))3.3 模型设计Mask R-CNN 架构def get_model_maskrcnn(num_classes, pretrainedTrue, trainable_backbone_layers3): 构建 Mask R-CNN 模型 # 加载预训练模型 model torchvision.models.detection.maskrcnn_resnet50_fpn( pretrainedpretrained, trainable_backbone_layerstrainable_backbone_layers ) # 替换分类头3 类背景 污染 裂纹 in_features model.roi_heads.box_predictor.cls_score.in_features model.roi_heads.box_predictor FastRCNNPredictor(in_features, num_classes) # 替换 mask 预测头 in_features_mask model.roi_heads.mask_predictor.conv5_mask.in_channels model.roi_heads.mask_predictor MaskRCNNPredictor( in_features_mask, 256, num_classes ) return model架构特点骨干网络ResNet-50 FPN特征金字塔网络RPN区域提议网络生成候选框RoI Align 提取精确特征双分支输出边界框分类 实例分割 mask四、 训练策略4.1 验证损失计算Mask R-CNN 在eval()模式下只返回预测结果无法获取损失。解决方案是在验证时保持train()模式但禁用梯度计算def validate_one_epoch(model, data_loader, device, epoch, total_epochs): 验证一个 epoch model.train() # 保持 train 模式以计算 loss total_loss 0.0 with torch.no_grad(): # 不计算梯度 for images, targets in data_loader: images [img.to(device) for img in images] targets [{k: v.to(device) for k, v in t.items()} for t in targets] # 计算损失模型在 train 模式下才返回 loss_dict loss_dict model(images, targets) losses sum(loss for loss in loss_dict.values()) total_loss losses.item() return total_loss / len(data_loader)4.2 训练配置优化器: SGD (momentum0.9, weight_decay0.0005) 学习率: 0.003 调度器: CosineAnnealingLR 批次大小: 2 训练轮数: 24 可训练 backbone 层数: 3五、 GUI 可视化训练系统实现了功能完整的 PyQt5 训练界面图5-1 训练界面系统界面包含参数配置区学习率、批次大小、训练轮数等超参数设置训练控制开始/停止按钮、进度条实时日志显示训练过程输出损失曲线动态更新训练和验证损失混淆矩阵实时展示分类性能核心实现使用多线程避免界面卡顿class TrainingThread(QThread): 训练线程 output_signal pyqtSignal(str) progress_signal pyqtSignal(int, int) loss_signal pyqtSignal(float, float) finished_signal pyqtSignal(bool, str) def run(self): # 启动训练子进程 self.process subprocess.Popen( self.command, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, textTrue, encodingutf-8 ) # 解析输出流发送信号更新界面 for line in iter(self.process.stdout.readline, ): if Epoch in line: self.progress_signal.emit(current_epoch, total_epochs) self.output_signal.emit(line)六、缺陷检测推理6.1 NMS 去重机制推理时使用非极大值抑制NMS去除重复检测框# 推理时使用 NMS 去除重复检测框 nms_keep torchvision.ops.nms( boxes, scores, iou_threshold0.5 ) boxes boxes[nms_keep] scores scores[nms_keep] labels labels[nms_keep] masks masks[nms_keep]七、可视化结果图7-1 污染检测边界框图7-2 污染检测mask系统在检测到药片表面的污染缺陷后同时输出红色边界框标注缺陷位置红色 mask 标注缺陷精确轮廓置信度分数0.99 表示 99% 确信度图7-3 污染检测轮廓图7-4 污染检测填充 mask使用skimage.measure.find_contours提取 mask 轮廓from skimage import measure # 提取轮廓 contours measure.find_contours(mask, 0.5) for contour in contours: plt.plot(contour[:, 1], contour[:, 0], linewidth2, colorred)图7-5 裂纹检测裂纹缺陷检测结果蓝色区域表示检测到的药片表面裂纹边界框和置信度 1.00 表示模型对该检测非常确定。八、训练结果分析8.1 损失曲线图8-1 损失曲线系统自动生成训练和验证损失曲线展示模型收敛过程def plot_loss_curve(train_losses, val_losses, output_path): 绘制损失曲线 plt.figure(figsize(10, 6)) epochs range(1, len(train_losses) 1) plt.plot(epochs, train_losses, b-, label训练损失, linewidth2) plt.plot(epochs, val_losses, r-, label验证损失, linewidth2) plt.xlabel(训练轮次 (Epoch), fontsize12) plt.ylabel(损失值 (Loss), fontsize12) plt.title(训练和验证损失曲线, fontsize14, fontweightbold) plt.legend() plt.grid(True, alpha0.3) plt.savefig(output_path, dpi300)九、性能指标最优训练结果lr0.003, cosine scheduler, 24 epochs训练时间: 16 分 36 秒最佳验证损失: 0.2740第 21 轮训练损失: 0.7505 → 0.3062模型参数量: 约 4400 万44M可训练参数: 约 3500 万十、错误分析系统实现了完整的错误分析功能def analyze_detection_errors(model, data_loader, device): 分析检测错误并生成混淆矩阵 error_stats { missed: 0, # 漏检真实缺陷未检测到 false_positive: 0, # 过检误报的缺陷 misclassified: 0 # 误判类别错误 } # 计算 IoU 匹配 for pred_box, gt_box in zip(pred_boxes, gt_boxes): iou compute_iou(pred_box, gt_box) if iou iou_threshold: if pred_label ! gt_label: error_stats[misclassified] 1 else: error_stats[false_positive] 1 return error_stats错误样本自动保存到output/error_analysis/目录便于后续分析优化。十一、项目文件结构Mask R-CNN/ ├── dataset.py # 数据集加载和预处理 ├── model.py # Mask R-CNN 模型定义 ├── train.py # 命令行训练脚本 ├── train_gui.py # GUI 训练界面PyQt5 ├── visualize.py # 推理和可视化工具 ├── utils.py # 工具函数checkpoint、seed 等 ├── requirements.txt # 依赖包列表 ├── magnesium/ # 数据集目录 └── output/ # 训练输出 ├── best_model.pth # 最佳模型权重 ├── final_model.pth # 最终模型权重 ├── loss_curve.png # 损失曲线图 ├── confusion_matrix.png # 混淆矩阵 ├── training_log.txt # 训练日志 └── error_analysis/ # 错误样本分析 ├── missed_detection/ ├── false_positive/ └── misclassified/十二、总结项目实现了一个功能完整的药片缺陷检测系统结合了深度学习的强大性能和工程化的实用性。通过 Mask R-CNN 模型系统能够精确定位和分割药片表面的污染和裂纹缺陷验证集损失达到 0.2740展现了良好的检测性能。GUI 界面和详细的错误分析功能使得系统易于使用和优化适合在实际药品质量检测场景中应用。十三、视频演示Mask R-CNN药片
报考提示:本文涉及的批次、材料要求可能随上级文件调整,报名前建议再确认一次。你所在的工种、城市、当前进度如果拿不准,可以直接电话 18236992212 或在线预约,我们按你的情况单独捋一遍流程,不白跑。
证书真伪提醒:凡是说"不用考试直接拿证""花钱买证""包过免考"的,基本都是假证或骗局。正规特种作业操作证必须本人参考、本人答题,办下来的证在应急管理部官网、河南省厅平台都能查到电子记录。查不到的证,上岗被查到要担责任,千万别图省事。拿不准的,先打 18236992212 问一句。
报考流程

从咨询到拿证,六步走完

不管这篇资讯讲的是哪个工种,报名到取证的流程都是这六步,照着走不绕弯。

01

咨询定工种

说清岗位和单位要求,确认该考哪类证。

02

材料预审

按清单准备,拍照发来免费预审。

03

报名建档

提交报名信息,同步本批次窗口。

04

考前辅导

理论题库加实操要点针对性训练。

05

参加考试

理论机考加实操考核,按批次安排。

06

取证复审

查证领证,到期前提醒复审换证。

报名咨询前台接待

正规培训通道

走应急管理部门认可的报名与培训渠道,本人参考本人答题。

材料免费预审

报名前拍照发来逐项核对,缺什么错什么当场指出来。

批次提前通知

河南应急厅批次一有消息,第一时间同步报名学员。

费用透明无隐形

报名前把费用明细一次性说清,包含哪些、怎么收都写明。

电话咨询

18236992212,说清工种和城市,我们按你的情况给建议。

邮箱咨询

809451989@qq.com,材料拍照发来,免费预审。

在线预约

留下姓名、电话、工种,我们安排专人回访对接。

濮阳 / 许昌

两地设服务点,就近安排报名与考试对接。

常见问题

关于报考,常被问到的几个问题

看完这篇资讯,下面这些问题顺便一起答了。

我现在报名,大概多久能参加考试?

材料预审通过、报名建档后,一般排在最近的一个批次。具体时间取决于河南应急管理厅当期批次安排和机位,濮阳、许昌本地考点通常每月都有场次。报名时我们会告诉你本批次的报名截止时间和预计考试时间。

没有相关工作经验,能直接考吗?

大部分工种允许零基础报名,经正规培训后参考。部分岗位对学历、体检有要求,具体以工种对照条件为准。不确定自己符不符合的,先说说你的情况,我们帮你判断该报哪个。

考试没过可以补考吗?怎么收费?

理论和实操分别考核,单科不合格一般有补考机会,补考按当期批次重新排期。费用明细我们会在报名前一次性说清,没有隐形收费。

企业要一批人考证,能统一办理吗?

可以。建筑、化工、制造类企业批量申报走企业团报通道,统一建档、对公收费、台账整理一起办,安全管理员配套我们也能对接。

拿到证以后多久要复审?在哪复审?

特种作业操作证每 3 年复审一次,满 6 年需要换证。复审不必须回发证地,濮阳、许昌本地都能办,异地也能对接。建议提前一两个月开始准备,别等证书过期了才想起这件事。

怎么查自己的证是不是真的?

上应急管理部官网或河南省厅政务平台,输入身份证号和证件号就能查电子记录。查不到的、或者有人跟你说"不用考试直接拿证"的,基本都是假证,上岗被查到要担责任,别图省事吃这个亏。

整个下来大概要花多少钱?

不同工种费用不一样,跟培训课时、考试次数挂钩。我们会在报名前把费用明细一次性说清,包含哪些、不包含哪些写在明面上,没有隐形收费。补考另行排期,费用按当期标准走。

我条件好像不太够,还能考吗?

年龄、学历、体检这几项卡得最严,哪项差一点、怎么补,各工种要求不同。别自己猜,把你的情况说清楚——多大年龄、什么学历、有没有相关经验——我们帮你判断该报哪个工种、差的条件怎么补,能考就告诉你怎么考,不能考也不耽误你时间。

个人预约 / 企业团报

文章里没说清的,直接问我们

你的工种、城市、当前进度,说一句就行。材料、批次、费用按你的情况单独捋,不套模板。