【CV综合实战】基于深度学习的工业压力表智能检测与读数系统【2】表盘指针与刻度分割模型训练

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发8.【基于深度学习的行人跌倒检测系统
9.【基于深度学习的PCB板缺陷检测系统10.【基于深度学习的生活垃圾分类目标检测系统
11.【基于深度学习的安全帽目标检测系统12.【基于深度学习的120种犬类检测与识别系统
13.【基于深度学习的路面坑洞检测系统14.【基于深度学习的火焰烟雾检测系统
15.【基于深度学习的钢材表面缺陷检测系统16.【基于深度学习的舰船目标分类检测系统
17.【基于深度学习的西红柿成熟度检测系统18.【基于深度学习的血细胞检测与计数系统
19.【基于深度学习的吸烟/抽烟行为检测系统20.【基于深度学习的水稻害虫检测与识别系统
21.【基于深度学习的高精度车辆行人检测与计数系统22.【基于深度学习的路面标志线检测与识别系统
23.【基于深度学习的智能小麦害虫检测识别系统24.【基于深度学习的智能玉米害虫检测识别系统
25.【基于深度学习的200种鸟类智能检测与识别系统26.【基于深度学习的45种交通标志智能检测与识别系统
27.【基于深度学习的人脸面部表情识别系统28.【基于深度学习的苹果叶片病害智能诊断系统
29.【基于深度学习的智能肺炎诊断系统30.【基于深度学习的葡萄簇目标检测系统
31.【基于深度学习的100种中草药智能识别系统32.【基于深度学习的102种花卉智能识别系统
33.【基于深度学习的100种蝴蝶智能识别系统34.【基于深度学习的水稻叶片病害智能诊断系统
35.【基于与ByteTrack的车辆行人多目标检测与追踪系统36.【基于深度学习的智能草莓病害检测与分割系统
37.【基于深度学习的复杂场景下船舶目标检测系统38.【基于深度学习的农作物幼苗与杂草检测系统
39.【基于深度学习的智能道路裂缝检测与分析系统40.【基于深度学习的葡萄病害智能诊断与防治系统
41.【基于深度学习的遥感地理空间物体检测系统42.【基于深度学习的无人机视角地面物体检测系统
43.【基于深度学习的木薯病害智能诊断与防治系统44.【基于深度学习的野外火焰烟雾检测系统
45.【基于深度学习的脑肿瘤智能检测系统46.【基于深度学习的玉米叶片病害智能诊断与防治系统
47.【基于深度学习的橙子病害智能诊断与防治系统48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统74.【基于深度学习的水面垃圾智能检测识别系统
75.【基于深度学习的遥感视角船只智能检测系统76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统
79.【基于深度学习的果园苹果检测与计数系统80.【基于深度学习的半导体芯片缺陷检测系统
81.【基于深度学习的糖尿病视网膜病变检测与诊断系统82.【基于深度学习的运动鞋品牌检测与识别系统
83.【基于深度学习的苹果叶片病害检测识别系统84.【基于深度学习的医学X光骨折检测与语音提示系统
85.【基于深度学习的遥感视角农田检测与分割系统86.【基于深度学习的运动品牌LOGO检测与识别系统
87.【基于深度学习的电瓶车进电梯检测与语音提示系统88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统
89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统90.【基于深度学习的舌苔舌象检测识别与诊断系统
91.【基于深度学习的蛀牙智能检测与语音提示系统92.【基于深度学习的皮肤癌智能检测与语音提示系统

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

基本功能演示

【CV综合实战】基于深度学习的工业压力表智能检测与读数系统【python源码+Pyqt5界面+数据集+训练代码】

摘要:在工业环境中,压力表作为关键的监控设备,用于实时监测各种系统和流程中的压力变化,对确保生产安全与效率至关重要。本文基于YOLO11的深度学习框架,通过783张实际场景中拍摄的工业压力表相关图片,训练了可进行压力表目标检测的模型,然后用Unet网络,通过414张分图片训练压力表指针与刻度分割模型,对检测出的压力表指针与刻度进行分割,然后通过OpenCV进行后处理的读数读取。最终基于以上内容制作了一款带UI界面的工业压力表智能检测与读数系统,更便于实际应用。该系统是基于pythonPyQT5开发的,支持图片视频以及摄像头进行压力表数据读取,并保存检测结果。本文提供了完整的Python代码和使用教程,给感兴趣的小伙伴参考学习,完整的代码资源文件获取方式见文末

点击跳转至文末《完整相关文件及源码》获取


引言

该系列文章主要介绍一个《基于深度学习的工业压力表智能检测与读数系统》的制作流程:包含了项目所有源码与模型训练数据集、训练代码与训练结果等内容。最终实现效果如下:
在这里插入图片描述

该系统制作主要包括以下几步:

  1. 压力表目标检测模型的训练,该项目使用的是YOLO11
  2. 压力表指针与刻度分割模型的训练,该项目使用的是Unet
  3. OpenCV对分割结果进行后处理,并读取压力表读数;
  4. 系统软件界面的制作。

上一篇文章《【CV综合实战】基于深度学习的工业压力表智能检测与读数系统【1】压力表位置检测》实现了第一步:压力表的位置检测。
这篇文章介绍第二步,通过训练分割模型对检测出的压力表指针与刻度进行分割。 分割效果示例如下:
在这里插入图片描述

分割检测模型训练基本流程

本文介绍的第一步中,目标检测模型的训练流程如下:

  1. 搜集与整理数据集:搜集整理实际场景中工业压力表的相关数据图片,并进行压力表指针与刻度数据标注,为模型训练提供训练数据集;
  2. 训练模型:基于整理的数据集训练Unet分割模型,实现压力表中指针与刻度分割,为后续读取压力表读数做准备;
  3. 模型性能评估:对训练出的模型在验证集上进行了充分的结果评估和对比分析,主要目的是为了揭示模型在关键指标(如Precision、Recall、mPA和mIOU等指标)上的表现情况

Unet模型简介

🔍 一、模型概要

U-Net是一种专为图像分割设计的卷积神经网络,由Olaf Ronneberger于2015年首次提出。其名称源于独特的U型对称结构,最初用于生物医学图像分割(如细胞、器官分割),后扩展至遥感、自动驾驶等领域。核心优势在于:

  • 小样本高效性:在有限数据下表现优异,适合医学影像等标注成本高的场景;
  • 精准边界分割:通过跳跃连接保留空间细节,实现像素级分类。

⚙️ 二、核心原理

1. 编码器-解码器结构

  • 编码器(下采样路径)
    • 由卷积层(Conv 3×3 + ReLU)和最大池化层(MaxPool 2×2)堆叠组成,逐步压缩图像尺寸(如572×572→32×32),提取高层语义特征。
    • 每层通道数翻倍(64→128→256→512),增强特征抽象能力。
  • 解码器(上采样路径)
    • 通过转置卷积(Transposed Conv 2×2)逐步恢复分辨率,结合跳跃连接融合编码器的低级特征,提升定位精度。

2. 跳跃连接(Skip Connections)

  • 作用:将编码器各层的特征图与解码器对应层拼接(Concatenate),解决下采样中的细节丢失问题。
  • 优势
    • 多尺度特征融合:低层空间信息(边缘、纹理)与高层语义信息互补;
    • 缓解梯度消失:加速训练收敛。

3. 损失函数与优化

  • 损失函数:加权交叉熵损失(Weighted Cross-Entropy),对相邻目标边界赋予更高权重(如细胞间距<5像素)。
  • 优化算法:带动量的随机梯度下降(SGD,动量=0.99),采用He初始化权重。

三、架构解析

在这里插入图片描述

1. 输入输出设计

  • 输入:原始图像(如572×572×1灰度图),无填充(no padding)导致输出尺寸缩小。
  • 输出:分割掩码(388×388×2),通过1×1卷积映射至类别通道(如背景/前景)。

2. 关键组件

组件操作作用
双卷积层2×[Conv 3×3 → ReLU]基础特征提取
下采样MaxPool 2×2压缩空间尺寸,增加通道数
上采样Transposed Conv 2×2 → 特征拼接 → 双卷积层恢复分辨率,融合多级特征
跳跃连接裁剪编码器特征图与解码器拼接保留细节信息

💡 现代改进

  • 添加批归一化(BN层)和填充(Padding)保持输入输出尺寸一致;
  • 采用双线性插值替代转置卷积减少锯齿效应。

四、工作流程

  1. 数据预处理:标准化像素值、随机弹性变形增强数据鲁棒性;
  2. 特征提取:编码器逐层下采样,生成多层次特征图;
  3. 特征重建:解码器上采样并拼接跳跃特征,逐步恢复分辨率;
  4. 分割预测:末端1×1卷积输出像素类别概率,应用Softmax生成分割图。

模型训练、评估与推理

本项目使用的是Unet模型进行分割模型训练,训练完成后对模型在验证集上的表现进行全面的性能评估及对比分析。总体流程包括:数据集准备、模型训练、模型评估。

1. 数据集准备与训练

通过网络上搜集关于实际场景中工业压力表的相关图片,并使用Labelme标注工具对每张图片进行分割标注,分2个类别['指针','刻度']

最终数据集一共包含414张图片,其中训练集包含374张图片验证集包含40张图片
部分图像及标注如下图所示:
在这里插入图片描述
注意:由于mask的像素点类别是用0,1,2序号表示的【以满足模型训练数据要求】,所以标注的图片看起来是黑色的。
在这里插入图片描述

2.模型训练

准备好数据集后,将图片数据以如下格式放置在项目目录中。在项目目录中新建datasets目录,同时将检测的图片分为训练集与验证集放入Data目录下。
在这里插入图片描述

数据准备完成后,通过调用train.py文件进行模型训练,核心代码如下:

#coding:utf-8
# 加载数据
train_loader = torch.utils.data.DataLoader(train_dataset,
                                               batch_size=batch_size,
                                               num_workers=num_workers,
                                               shuffle=True,
                                               pin_memory=True,
                                               collate_fn=train_dataset.collate_fn)

val_loader = torch.utils.data.DataLoader(val_dataset,
                                         batch_size=1,
                                         num_workers=num_workers,
                                         pin_memory=True,
                                         collate_fn=val_dataset.collate_fn)
# 初始化模型
model = create_model(num_classes=num_classes)
model.to(device)

params_to_optimize = [p for p in model.parameters() if p.requires_grad]

# 创建优化器
optimizer = torch.optim.SGD(
    params_to_optimize,
    lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay
)

scaler = torch.cuda.amp.GradScaler() if args.amp else None

# 创建学习率更新策略,这里是每个step更新一次(不是每个epoch)
lr_scheduler = create_lr_scheduler(optimizer, len(train_loader), args.epochs, warmup=True)
start_time = time.time()
for epoch in range(args.start_epoch, args.epochs):
    train_loss, lr = train_one_epoch(model, optimizer, train_loader, device, epoch, num_classes,
                                    lr_scheduler=lr_scheduler, print_freq=args.print_freq, scaler=scaler)

    val_info, dice, val_loss = evaluate(model, val_loader, device=device, num_classes=num_classes)

3. 训练结果评估

模型训练完成后,会自动在SaveWeightsAndResults目录下生成评估结果与相应的训练曲线。当然,也可以重新运行项目中的validation.py脚本进行模型评估。生成的训练结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行validation.py模型评估脚本的话,评估结果如下:

{'global correct': 98.97600412368774, 
'PA': ['99.3', '91.9', '89.9'], 
'IoU': ['98.9', '82.2', '77.2'], 
'precision': ['99.6', '88.6', '84.5'], 
'recall': ['99.3', '91.9', '89.9'],
 'mPA': 93.71547102928162, 
 'mean IoU': 86.10977530479431, 
 'mean precision': 90.90912938117981, 
 'mean recall': 93.71547102928162}
dice coefficient: 0.883

4. 使用模型进行推理

模型训练完成后,训练结果模型Unet_Train/SaveWeightsAndResults/20250701-165644/last.pth文件。我们可以使用该文件进行后续的推理检测,运行predict.py文件。
图片推理核心代码如下:

def main():
    # 分割类别数目【不含背景】
    classes = 2  # exclude background
    # 模型路径
    weights_path = "SaveWeightsAndResults/20250701-165644/best.pth"
    # 预测的图片路径
    img_path = "datasets/valid/images/6.jpg"
    assert os.path.exists(weights_path), f"weights {weights_path} not found."
    assert os.path.exists(img_path), f"image {img_path} not found."

    with open(palette_path, "rb") as f:
        pallette_dict = json.load(f)
        pallette = []
        for v in pallette_dict.values():
            pallette += v

    # get devices
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print("using {} device.".format(device))

    # create model
    model = UNet(in_channels=3, num_classes=classes+1, base_c=32)

    # load weights
    model.load_state_dict(torch.load(weights_path, map_location='cpu')['model'])
    model.to(device)

    # load image
    original_img = Image.open(img_path).convert('RGB')

    # from pil image to tensor and normalize
    data_transform = transforms.Compose([transforms.ToTensor(),
                                         transforms.Normalize(mean=Config.mean, std=Config.std)])
    img = data_transform(original_img)
    # print("img.shape: {}".format(img.shape)) #torch.Size([3, 216, 256])
    # expand batch dimension
    img = torch.unsqueeze(img, dim=0)
    # print("img.shape: {}".format(img.shape)) #torch.Size([1, 3, 216, 256])

    model.eval()  # 进入验证模式
    with torch.no_grad():
        # init model
        img_height, img_width = img.shape[-2:]
        init_img = torch.zeros((1, 3, img_height, img_width), device=device)
        # 模型初始化推理
        model(init_img)

执行上述代码后,会将压力表上的指针与刻度进行分割,结果如下:
原图
在这里插入图片描述
模型分割结果

在这里插入图片描述
更多结果示例如下:
在这里插入图片描述

总结

本文详细介绍了《工业压力表智能检测与读数系统》实现的第二步:压力表指针与刻度分割
下一篇文章将详细介绍如何使用OpenCV对分割后的图片进行处理,进行压力表读数读取。


关于该系统涉及到的完整源码、UI界面代码、数据集、训练代码、训练好的模型、测试图片视频等相关文件,均已打包上传,感兴趣的小伙伴可以通过下载链接自行获取。

【获取方式】

关注末尾名片GZH【阿旭算法与机器学习】,发送【源码】获取下载方式

本文涉及到的完整全部程序文件:包括python源码、数据集、训练好的结果文件、训练代码、UI源码、测试图片视频等(见下图),获取方式见文末:
在这里插入图片描述

在这里插入图片描述

注意:该代码基于Python3.9开发,运行界面的主程序为MainProgram.py,其他测试脚本说明见上图。为确保程序顺利运行,请按照程序运行说明文档txt配置软件运行所需环境。


好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值