基于Segformer实现PCB缺陷检测(步骤 + 代码)

导  读

    本文主要介绍基于Segformer实现PCB缺陷检测 ,并给出步骤和代码。    

背景介绍

图片

    PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性,还可以大大减少检测时间。传统方法涉及手动检查,无法扩展且容易出错。利用机器学习,特别是 Segformer模型,提供自动化且精确的解决方案。

      

实现步骤

    下面是具体步骤: 

  【1】安装所需环境。首先,我们安装所需的库。其中,albumentations用于数据增强,transformers允许访问 Segformer等预训练模型,并xmltodict帮助解析数据集的XML注释。

pip install evaluate albumentations transformers accelerate xmltodict

  【2】数据集。这个项目中使用的数据集由Roboflow提供。可以从下面链接获取:

https://universe.roboflow.com/diplom-qz7q6/defects-2q87r/dataset/16

图片

该数据集分为测试文件夹和训练文件夹,由XML格式的图像及其相应注释组成。

# Create train and test setstrain_folder = "drive/..../train/images/"test_folder = "drive/.../validation/images/"
train_img_paths = sorted([train_folder + f for f in os.listdir(train_folder) if f.endswith("jpg")])test_img_paths = sorted([test_folder + f for f in os.listdir(test_folder) if f.endswith("jpg")])train_xml_paths = [f[:-3] + "xml" for f in train_img_paths]test_xml_paths = [f[:-3] + "xml" for f in test_img_paths]
train_ds = {"image_paths": train_img_paths, "xml_paths": train_xml_paths}test_ds = {"image_paths": test_img_paths, "xml_paths": test_xml_paths}

    XML文件包含多边形标注信息,指示PCB图像上缺陷的位置。该函数process_mask读取XML标注信息并将其转换为掩码(类似图像的数组)。该掩模对应于PCB图像上的缺陷区域,基本上将缺陷与电路板的其余部分分开。

    该函数首先使用OpenCV读取原始图像。在我们初始化与输入图像大小相同的蒙版之后。根据可视化标志,蒙版可以是3通道RGB蒙版(如彩色图像)或1通道灰度蒙版。最初,该掩码中的所有值都设置为零,这意味着没有缺陷。

  【3】缺陷标注解析。对于每个缺陷标注信息:识别缺陷类型,提取缺陷的多边形形状,该多边形被绘制到初始化的蒙版上。最后,该函数弥合了XML标注信息和适合训练的格式之间的差距。给定 PCB图像及其相应的XML 注释,它会生成一个分割掩模,突出显示有缺陷的区域。掩模可以是适合训练模型的数字格式,也可以是用于人工检查的视觉格式。​​​​​​​

def process_mask(img_path, xml_path, visualize=False):    img = cv2.imread(img_path)    num_dim = 3 if visualize else 1    mask = np.zeros((img.shape[0], img.shape[1], num_dim))
    # Read xml content from the file    with open(xml_path, "r") as file:      xml_content = file.read()
    data = xmltodict.parse(xml_content)
    # If has defect mask    if "object" in data["annotation"]:        objects = data["annotation"]["object"]
        # Single defects are annotated as a single dict, not a list        if not isinstance(objects, List):          objects = [objects]
        for obj in objects:          defect_type = obj["name"]          polygon = obj["polygon"]          poly_keys = list(polygon.keys())
          # Get number of (x, y) pairs - polygon coords          poly_keys = [int(k[1:]) for k in poly_keys]          num_poly_points = max(poly_keys)
          # Parse ordered polygon coordinates          poly_coords = []          for i in range(1, num_poly_points+1):              poly_coords.append([                  int(float(polygon[f"x{i}"])),                  int(float(polygon[f"y{i}"]))              ])          poly_coords = np.array(poly_coords)
          # Draw defect segment on mask          fill_color = color_map[defect_type] if visualize else id_cat_map[defect_type]          mask = cv2.fillPoly(mask, pts=[poly_coords], color=fill_color)
    #Optional    if visualize:        cv2.imwrite("output.jpg", mask)        mask = Image.open("output.jpg")
    return mask

  【4】探索性数据分析。在训练模型之前,最好先了解数据。在这里,我们检查缺陷类型的分布并在样本图像上可视化缺陷。

图片

图片

图片

图片

    缺陷热力图显示了常见的缺陷位置,箱线图显示了缺陷尺寸的分布。

图片

    该函数旨在通过读取边界框详细信息来计算 XML 注释中存在的每个缺陷的大小。

def get_defect_sizes(xml_paths):    sizes = []    for xml_path in xml_paths:        with open(xml_path) as f:            data = xmltodict.parse(f.read())            objects = []            if 'object' in data['annotation']:                objects = data['annotation']['object']            if not isinstance(objects, list):                objects = [objects]            for obj in objects:                bndbox = obj['bndbox']                width = int(bndbox['xmax']) - int(bndbox['xmin'])                height = int(bndbox['ymax']) - int(bndbox['ymin'])                sizes.append(width * height)    return sizes

    最后,群图重点关注缺陷尺寸在整个数据集中的分布和扩散。

图片

  【5】数据增强。该albumentations库用于人为扩展训练数据集,有助于提高模型的泛化能力。唯一指定的增强是水平翻转,它将以 50% 的概率水平翻转图像。​​​​​​​

transform = A.Compose([    A.HorizontalFlip(p=0.5)])

图片

 【6】图像预处理。将图像及其掩模预处理为适合Segformer模型的格式。

preprocessor = SegformerImageProcessor()

    我们将定义一个继承自PyTorchDataset类的自定义数据集类。这个自定义数据集允许我加载和预处理 PCB 图像及其相应的缺陷掩模。

    使用 OpenCV 加载图像。使用前面讨论的函数生成缺陷掩模process_mask。使用之前初始化的图像预处理图像及其掩模SegformerImageProcessor。此步骤将图像转换为张量格式,并确保它们具有适合 Segformer 模型的大小和标准化。返回预处理的图像和掩模张量。​​​​​​​

class DefectSegmentationDataset(Dataset):  def __init__(self, dataset, mode):    self.image_paths = dataset["image_paths"]    self.xml_paths = dataset["xml_paths"]
  def __len__(self):    return len(self.image_paths)
  def __getitem__(self, idx):    # Read image    image = cv2.imread(self.image_paths[idx])
    # Get mask    mask = process_mask(self.image_paths[idx], self.xml_paths[idx])    mask = mask.squeeze()    mask = Image.fromarray(mask.astype("uint8"), "L")
    # Return preprocessed inputs    inputs = preprocessor(image, mask, ignore_index=None, return_tensors="pt")    inputs["pixel_values"] = inputs["pixel_values"].squeeze(0)    inputs["labels"] = inputs["labels"].squeeze(0)    return inputs

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/230465.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测-Two Stage-Mask RCNN

文章目录 前言一、Mask RCNN的网络结构和流程二、Mask RCNN的创新点总结 前言 前文目标检测-Two Stage-Faster RCNN提到了Faster RCNN主要缺点是: ROI Pooling有两次量化操作,会引入误差影响精度 Mask RCNN针对这一缺点做了改进,此外Mask …

C/C++动态内存分配 malloc、new、vector(简单讲述)

路虽远,行则将至 事虽难,做则必成 今天来主要讲C中动态内存分配 其中会穿插一些C的内容以及两者的比较 如果对C语言中的动态内存分配还不够理解的同学 可以看看我之前的博客:C语言动态分配 在讲解C的动态内存分配之前 我们先讲一下C内存模型 &#xff1…

楼宇智慧能源消耗监测管理系统,楼宇中的能源“管家”

随着人口的增加,楼宇数据呈上涨趋势,但是楼宇智能建设在我国普及性远远不足,相比传统楼宇控制,智能楼宇控制系统对于楼宇内部的用电设备控制,能够更加的节约能源,降低成本。对于现代化楼宇而言,…

ORACLE P6 v23.12 最新虚拟机(VM)全套系统环境分享

引言 根据上周的计划,我简单制作了两套基于ORACLE Primavera P6 最新发布的23.12版本预构建了虚拟机环境,里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primavera销售代…

C#最佳工具集合:IDE、分析、自动化工具等

C#是企业中广泛使用的编程语言,特别是那些依赖微软的程序语言。如果您使用C#构建应用程序,则最有可能使用Visual Studio,并且已经寻找了一些扩展来对您的开发进行管理。但是,这个工具列表可能会改变您编写C#代码的方式。 C#编程的…

模拟器怎么代理IP?代理IP对手机设置模拟器有哪些影响?

一、代理IP的基本概念和作用流冠代理IP是一种网络服务,可以帮助用户隐藏自己的真实IP地址,通过代理服务器进行网络请求,从而保护用户的隐私和安全。在模拟器中,代理IP的作用也是如此,可以帮助模拟器隐藏真实的IP地址&a…

Hubery-个人项目经历记录

研究生期间很有幸的进入到了崔老师的组,从此也就进入到了分析人体生理信号的领域,充满挑战的同时也充满了乐趣。借着CSDN整理一下近几年来参与的项目,这里蕴含着我各种美好的回忆,也作为一个展示自己的平台吧。 开始之前&#xff…

小红书12月内容趋势分析

为洞察小红书平台的内容创作趋势及品牌营销策略,新红推出12月月度榜单,从创作者、品牌、热搜词多方面入手,解析月榜数据,为从业者提供参考。 以下为12月部分榜单解析,想要查看更多行业榜单,创作优质内容&am…

【MySQL】常用存储引擎,数据库管理,数据表管理,数据库账户管理

目录 一 常用的数据引擎(4) 1.1 InnoDB存储引擎 1.2 MyISAM存储引擎 1.3 Memory存储引擎 1.4 ARCHIVE存储引擎 二 数据库管理 2.1 元数据库概念与分类 2.2 相关操作命令 三 数据表的管理 3.1 三大范式 3.2 数据类型 四 数据库账户管理 五 思维导图 一 常用的数据…

探索AliExpress商品详情API:使用与解析

一、引言 AliExpress是阿里巴巴旗下全球领先的B2C在线交易平台,为全球数亿消费者提供安全、便捷、高效的购物体验。随着电子商务的快速发展,获取商品详情成为了电商应用程序中的一项重要功能。AliExpress商品详情API(aliexpress.item_get&am…

Vue中的选项式 API 和组合式 API,两者有什么区别

Vue中的选项式 API(Option API)和组合式 API(Composition API)是两种不同的组件编写方式,它们各有特点和适用场景: 选项式 API(Option API): 传统方法:Vue最初的编程范式…

redis服务迁移数据工具--RDM

一、背景: 在日常的运维工作经常遇见各种数据迁移工作,例如mysql数据库迁移、redis数据库迁移、minio数据迁移等等工作。这里介绍一下redis数据库的迁移过程。 二、迁移思路: redis服务/集群的数据迁移思路是需要新建一个配置、密码一样的re…

【字典树Trie】LeetCode-139. 单词拆分

139. 单词拆分。 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode&q…

openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理

文章目录 openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理185.1 提交升级操作步骤 185.2 升级版本回滚操作步骤 185.3 异常处理升级问题FAQ openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理 185.1 提交升级…

grep笔记240103

常用选项:: -i:忽略大小写进行匹配。 -v:反向匹配,只打印不匹配的行。 -n:显示匹配行的行号。 -r:递归查找子目录中的文件。 -l:只打印匹配的文件名。 -c:只打印匹配的行…

rk3588中编译带有ffmpeg的opencv

有朋友有工程需要,将视频写成mp4,当然最简单的方法当然是使用opencv的命令 cv::VideoWriter writer;bool bRet writer.open("./out.mp4", cv::VideoWriter::fourcc(m, p, 4, v), 15, cv::Size(640, 512), 1); 但是奈何很难编译成功&#xff…

NGUI基础-图集制作(保姆级教程)

目录 图集是什么 如何打开图集制作工具 制作步骤 图集的三个关键配置 相关参数介绍 Atlas Material Texture Padding Tim Alpha PMA shader Unity Packer TrueColor Auto-upgrade Force Square Pre-processor 图集是什么 Unity图集(Sprite Atlas&…

AI:109-基于机器学习的文本图像关联分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

SecOC中新鲜度值和MAC都按照完整的值来生成,但是在发送和认证的时候只会截取一部分。这边截取的部分一般取多长?由什么参数设定?

新鲜度值(Freshness Value, FV)和消息验证码(Message Authentication Code, MAC)是SecOC协议中用于保证数据的真实性和新鲜度的重要信息。它们的长度取决于不同的因素,如加密算法、安全级别、通信带宽等。 一般来说,FV和MAC的长度越长,安全性越高,但也会占用更多的通信…

ROS Gazebo的基本使用

Gazebo 提供了一个实时的三维虚拟环境,用于模拟各种复杂的真实世界条件,包括光照、地形、物理碰撞以及传感器模型(如激光雷达、摄像头等)。通过 ROS 和 Gazebo 的结合,开发者可以在无需实际硬件的情况下设计、测试和验…