基于YOLOv5-7.0的PCB板缺陷检测

news2024/11/20 11:30:25

目录

  • 参考引用
  • 一、数据集介绍
  • 二、环境配置
  • 三、构建训练数据集
  • 四、修改配置文件
  • 五、训练及tensorboard可视化
  • 六、效果测试
  • 七、遇到的BUG

参考引用

你的陈某某-基于YOLOv5的PCB板缺陷检测

一、数据集介绍

印刷电路板(PCB)瑕疵数据集。它是一个公共合成PCB数据集,包含1386张图像,具有6种缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜),用于图像检测、分类和配准任务。

下载地址:数据集
在这里插入图片描述

数据样本示例:

在这里插入图片描述

二、环境配置

1、Gitub官网下载yolov5源码:官方地址

2、Anaconda 安装配置(省略)

3、创建新的环境(python=3.8就行,因为使用的是7.0的版本,3.6有点低。)

conda create -n pytorch python=3.8.5

4、安装pytorch:pytorch官网
在这里插入图片描述

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

5、yolov5的依赖下载

根据下载的 yolov5中的requirements.txt进行安装(缺啥补啥)【注意:具体安装以yolov5的readme.md为主!】

pip install -r requirements.txt

三、构建训练数据集

1、先构建数据集文件夹

下载好的PCB_DATASET解压后。是下面这种格式。
在这里插入图片描述
官网下载的PCB数据按照缺陷类划分文件夹的

在这里插入图片描述
将每个文件夹内的东西都复制出来到这个文件中。
在这里插入图片描述
然后删掉分类的文件夹。

在这里插入图片描述
images文件夹内的内容也是一样的。

├── PCB_DATASET
│   ├── Annotations  进行 detection 任务时的标签文件,xml 形式,文件名与图片名一一对应
│   ├── images  存放 .jpg 格式的图片文件
│   ├── ImageSets  存放的是分类和检测的数据集分割文件,包含 train.txt,val.txt ,trainval.txt,test.txt
│   ├── labels  存放label标注信息的txt文件,与图片一一对应

├── ImageSets(train,val,test建议按照811比例划分)
│   ├── train.txt  写着用于训练的图片名称
│   ├── val.txt  写着用于验证的图片名称
│   ├── trainval.txt  train与val的合集
│   ├── test.txt  写着用于测试的图片名称

在这里插入图片描述

2、训练数据生成,分为两个代码(训练集划分代码与用于yolo训练的txt格式代码)

(1)训练集划分代码

在PCB_DATASET文件夹下新建ImageSets文件夹。

用途:主要是将数据集分类成训练数据集和测试数据集,默认train,val,test按照比例进行随机分类,运行后ImagesSets文件夹中会出现四个文件,主要是生成的训练数据集和测试数据集的图片名称。

import os
import random


trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'D:\\pcb\\PCB_DATASET\\Annotations'
txtsavepath = 'D:\\pcb\\PCB_DATASET\\ImageSets'
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open(txtsavepath+'\\trainval.txt', 'w')
ftest = open(txtsavepath+'\\test.txt', 'w')
ftrain = open(txtsavepath+'\\train.txt', 'w')
fval = open(txtsavepath+'\\val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

如下图。同时data目录下也会出现这四个文件,内容是训练数据集和测试数据集的图片路径。

在这里插入图片描述
(b)用于yolo训练的txt格式代码

用途:主要是将图片数据集标注后的xml文件中的标注信息读取出来并写入txt文件。

# xml解析包

import xml.etree.ElementTree as ET
import pickle
import os

# os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表

from os import listdir, getcwd
from os.path import join


sets = ['train', 'test', 'val']
classes = ['missing_hole', 'mouse_bite', 'open_circuit', 'short', 'spur', 'spurious_copper']
label_path = 'D:\\pcb\\PCB_DATASET\\labels'
ImageSets = 'D:\\pcb\\PCB_DATASET\\ImageSets'
images = 'D:\\pcb\\PCB_DATASET\\images'


# 进行归一化操作

def convert(size, box):  # size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax)
    dw = 1./size[0]     # 1/w
    dh = 1./size[1]     # 1/h
    x = (box[0] + box[1])/2.0   # 物体在图中的中心点x坐标
    y = (box[2] + box[3])/2.0   # 物体在图中的中心点y坐标
    w = box[1] - box[0]         # 物体实际像素宽度
    h = box[3] - box[2]         # 物体实际像素高度
    x = x*dw    # 物体中心点x的坐标比(相当于 x/原图w)
    w = w*dw    # 物体宽度的宽度比(相当于 w/原图w)
    y = y*dh    # 物体中心点y的坐标比(相当于 y/原图h)
    h = h*dh    # 物体宽度的宽度比(相当于 h/原图h)
    return (x, y, w, h)    # 返回 相对于原图的物体中心点的x坐标比,y坐标比,宽度比,高度比,取值范围[0-1]


# year ='2012', 对应图片的id(文件名)

def convert_annotation(image_id):
    '''
    将对应文件名的xml文件转化为label文件,xml文件包含了对应的bunding框以及图片长款大小等信息,
    通过对其解析,然后进行归一化最终读到label文件中去,也就是说
    一张图片文件对应一个xml文件,然后通过解析和归一化,能够将对应的信息保存到唯一一个label文件中去
    labal文件中的格式:calss x y w h  同时,一张图片对应的类别有多个,所以对应的bunding的信息也有多个
    '''
    # 对应的通过year 找到相应的文件夹,并且打开相应image_id的xml文件,其对应bund文件
    in_file = open('D:\\pcb\\PCB_DATASET\\Annotations\\%s.xml' % (image_id), encoding='utf-8')
    # 准备在对应的image_id 中写入对应的label,分别为
    # <object-class> <x> <y> <width> <height>
    out_file = open(label_path+'\\%s.txt' % (image_id), 'w', encoding='utf-8')
    # 解析xml文件
    tree = ET.parse(in_file)
    # 获得对应的键值对
    root = tree.getroot()
    # 获得图片的尺寸大小
    size = root.find('size')
    # 如果xml内的标记为空,增加判断条件
    if size != None:
        # 获得宽
        w = int(size.find('width').text)
        # 获得高
        h = int(size.find('height').text)
        # 遍历目标obj
        for obj in root.iter('object'):
            # 获得difficult ??
            difficult = obj.find('difficult').text
            # 获得类别 =string 类型
            cls = obj.find('name').text
            # 如果类别不是对应在我们预定好的class文件中,或difficult==1则跳过
            if cls not in classes or int(difficult) == 1:
                continue
            # 通过类别名称找到id
            cls_id = classes.index(cls)
            # 找到bndbox 对象
            xmlbox = obj.find('bndbox')
            # 获取对应的bndbox的数组 = ['xmin','xmax','ymin','ymax']
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('ymax').text))
            print(image_id, cls, b)
            # 带入进行归一化操作
            # w = 宽, h = 高, b= bndbox的数组 = ['xmin','xmax','ymin','ymax']
            bb = convert((w, h), b)
            # bb 对应的是归一化后的(x,y,w,h)
            # 生成 calss x y w h 在label文件中
            out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


# 返回当前工作目录

wd = getcwd()
print(wd)


for image_set in sets:
    '''
    对所有的文件数据集进行遍历
    做了两个工作:
    1.将所有图片文件都遍历一遍,并且将其所有的全路径都写在对应的txt文件中去,方便定位
    2.同时对所有的图片文件进行解析和转化,将其对应的bundingbox 以及类别的信息全部解析写到label 文件中去
         最后再通过直接读取文件,就能找到对应的label 信息
    '''
    # 先找labels文件夹如果不存在则创建
    if not os.path.exists(label_path):
        os.makedirs(label_path+'\\')
    # 读取在ImageSets/Main 中的train、test..等文件的内容
    # 包含对应的文件名称
    image_ids = open(ImageSets+'\\%s.txt' % (image_set)).read().strip().split()
    # 打开对应的2012_train.txt 文件对其进行写入准备
    list_file = open('D:\pcb\PCB_DATASET\\%s.txt' % (image_set), 'w')
    # 将对应的文件_id以及全路径写进去并换行
    for image_id in image_ids:
        list_file.write(images+'\\%s.jpg\n' % (image_id))
        # 调用  year = 年份  image_id = 对应的文件名_id
        convert_annotation(image_id)
    # 关闭文件
    list_file.close()

# os.system(‘comand’) 会执行括号中的命令,如果命令成功执行,这条语句返回0,否则返回1

# os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")

# os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")

运行后在labels文件夹中出现所有图片数据集的标注信息。

在这里插入图片描述

label文件夹中某文件内容如下:

在这里插入图片描述

四、修改配置文件

1、数据集方面:yolov5-7.0\data文件夹中,新建一个yolovs-pcb.yaml文件,内容设置如下:

train: D:\\pcb\\PCB_DATASET\\train.txt
val: D:\\pcb\\PCB_DATASET\\val.txt
test: D:\\pcb\\PCB_DATASET\\test.txt


# classes

nc: 6  # number of classes
names: [ 'missing_hole', 'mouse_bite', 'open_circuit', 'short', 'spur', 'spurious_copper' ]  # class names

注意:路径,类别、标签名字(与标注文件中一致)

2、网络参数方面:yolov5-7.0\model文件夹中,复制yolov5s.yaml文件,为yolov5s-pcb.yaml,将内容进行修改

# Parameters

nc: 6  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

更改其中的nc即标签类别数目。一共是6类。

3、trian.py修改

主要用到的几个参数:–weights,–cfg,–data,–epochs,–batch-size,–img-size,–project,-workers

重点注意:–weights,–cfg,–data,其他的默认即可(batch_size,workers根据自己电脑属性进行设置)。

我的–weights,–cfg,–data设置如下:

	parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='models/yolov5s-pcb.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/PCB.yaml', help='dataset.yaml path')

五、训练及tensorboard可视化

1、训练

两种方式:pycharm中运行或者终端cmd运行(看个人喜好)

2、训练过程可视化

啰嗦一句:yolov5-7.0文件夹中一个runs文件夹,其中有检测结果和训练结果,如runs\train\exp\results.csv中保存了每个epoch训练信息,如下所示:
在这里插入图片描述

可视化操作:

a、打开一个新的终端,激活环境
【注意:使用tensorboard不需要安装tensorflow,直接pip install xxx安装了即可使用,yolov5安装文档会通过pip install -r requirements.txt自己安装上,若没有再尝试单独装!】

b、cd …\yolov5-7.0

c、tensorboard --logdir=runs或者python -m tensorboard.main --logdir=runs

在这里插入图片描述

d、复制其中的网址,去浏览器中打开(推荐谷歌)

e、可视化结果如下(能够边训练边观察):

在这里插入图片描述

3、在NVIDIA GeForce GTX 1650 8G显卡训练结果如下(batch_size=16,workers=8):
在这里插入图片描述

注意:可能 runs\train文件夹中会有多个exp文件,如exp1,exp2等,这是代表每一次新的训练。
在这里插入图片描述
当然你也可以修改本次训练结果的文件夹的名称。

在这里插入图片描述

六、效果测试

在CMD终端运行:

python detect.py --source data_ready\01_missing_hole_01.jpg  --weights runs\train\exp\weights\best.pt

测试结果如下(好像效果不咋地,可以更换其他yolov5系列的网络试试,或者聚类重选anchor):

在这里插入图片描述

注:在pycharm中运行检测,只需更改train.py中的def parse_opt()函数中的–source与–weights即可。

七、遇到的BUG

1、‘FreeTypeFont’ object has no attribute ‘getsize’

运行时报错:AttributeError: ‘FreeTypeFont’ object has no attribute ‘getsize’
其实是pollow版本10.0之后,删除了getsize的方法,将pillow版本降低即可。

pip install Pillow==9.5 -i https://pypi.tuna.tsinghua.edu.cn/simple/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

速卖通测评补单的条件和步骤

速卖通测评补单对于卖家来说是一种低成本、高回报的推广营销方式&#xff0c;可以提高商品的流量、转化率、关键词质量分和链接权重。但是如果处理不当&#xff0c;可能会对店铺产生负面影响。下面是实现自养号给自己店铺测评的条件和步骤&#xff1a; 1. 稳定的测评环境系统 …

Shopee买家通系统的功能及优势介绍

Shopee买家通系统是一款专门针对虾皮买家号所开发的软件&#xff0c;完全模拟人类真实行为让操作看起来更真实&#xff0c;可以一键批量注册shoppe买家号、批量绑定地址及支付卡、设置关键词搜索加购及下单&#xff0c;内置防指纹技术可以创建独立运行环境防止账号关联。 五大优…

搭建Pytorch的GPU环境超详细

效果 1、下载和安装VS2019 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 登录需要用户名和密码 安装后需要联网下载组件的,安装的时候要勾选使用C++的桌面开发 2、下载和安装显卡驱动 查看自己的显卡型号 从英伟达下载和安装最新驱动

异常气体识别与飘移

Olfactory Target/Background Odor Detection via Self-expression Model 解决非目标气体检测 摘要&#xff1a;提出了SeELM模型&#xff08;自表达ELM模型&#xff09; 分为两步&#xff1a;1.对获得的数据集进行建模&#xff0c;计算出自我表达系数矩阵&#xff0c;2.对于异…

JAVA毕业设计099—基于Java+Springboot+Vue的在线智慧教育考试系统(源码+数据库)

基于JavaSpringbootVue的在线智慧教育考试系统(源码数据库)099 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(角色权限可自行分配) 学生系统功能 模块介绍登录用户名、密码试题题干支持文本、图片、数学公式、表格等考试主观题支持答题板作答之后保存文…

VR航天科普主题公园模拟太空舱体验馆vr航天模拟体验设备

VR航天航空体验馆巡展是一项非常受欢迎的展览活动&#xff0c;可以让公众在现场体验到航天飞行的乐趣。 普乐蛙VR展览组织者会设计一个航天航空主题的VR体验馆&#xff0c;并在馆内设置各种航天航空相关的展示内容&#xff0c;如太空舱、火箭发射、星际航行等。 其次&#xff0…

matlab 读写磁共振影像.nii 数据

问题描述&#xff1a; 参考LEiDA方法和周昌松老师的large-scale network 的分离整合的划分[1]&#xff0c;脑区划分结束后需要把脑区的结果用脑图的形式呈现出来&#xff0c;但是因为我划分脑区的结果都是保存在mat文件里&#xff0c;Brainnet Viewer 则需要使用 .nii 类型的文…

中国xx集团信息技术工程师面试

进入面试间&#xff0c;坐着三位面试官&#xff0c;压力扑面而来&#xff0c;三位面试官先做了自我介绍&#xff0c;介绍了一下面试的流程后才开始面试。 一、自我介绍 不多说。 二、看你学过数据挖掘这门课&#xff0c;能简单介绍一下有哪些章节&#xff0c;学了些什么&…

PHP 智能物业管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 智能物业管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP小区物业管理系统1 代码 https://download.csdn.net/download/qq_41221322/88444…

相似性搜索:第 7 部分--LSH 组合物

Vyacheslav Efimov – Medium S相似性搜索是一个问题&#xff0c;给定一个查询&#xff0c;目标是在所有数据库文档中找到与其最相似的文档。 一、说明 在数据科学中&#xff0c;相似性搜索经常出现在 NLP 领域、搜索引擎或推荐系统中&#xff0c;其中需要检索最相关的文档或项…

机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)

1.How Obstacle Avoidance works 1.1处罚条款 避障是作为整体轨迹优化的一部分来实现的。显然&#xff0c;优化涉及到找到指定成本函数&#xff08;目标函数&#xff09;的最小成本解&#xff08;轨迹&#xff09;。简单地说&#xff1a;如果一个计划的&#xff08;未来&…

python manage.py makemigrations报错key error

django 运行 python manage.py makemigrations 报错 KeyError 解决&#xff1a;不知道原因&#xff0c; 删除了migration记录就可以了

异或运算.

相同为0&#xff0c;不同为1。 1 ^ 10 0 ^ 00 1 ^ 01 0 ^ 11性质&#xff1a; 0 ^ N N N ^ N 0交换、结合 a ^ b b ^ a&#xff1b; (a ^ b) ^ c a ^ (b ^ c)&#xff1b; 因此异或全部的元素的结果就是那个只出现1次的元素。 实现两个值的交换&#xff0c;而不必使…

如何选择优质的静动态住宅代理IP提供商?用前必看

当前&#xff0c;当网络隐私和数据安全备受关注时&#xff0c;住宅代理的使用已成为不可或缺的资源。从网络抓取者和营销人员到安全爱好者和在线安全爱好者&#xff0c;住宅代理在执行任何在线活动时提供基本的匿名性。 然而&#xff0c;并非所有住宅代理提供商都是相同的&…

coreldraw2019安装包下载安装步骤教程

安装之前一定要退出杀毒软件&#xff0c;所有的杀毒软件都要退出。无论360&#xff0c;腾讯管家&#xff0c;或者电脑自带的安全中心&#xff0c;要不然会阻止安装。 第一步&#xff1a;打开安装包 CorelDRAW2019win下载如下:https://wm.makeding.com/iclk/?zoneid55678 Co…

企业著作权数据的价值:探索企业作品著作权API的应用

引言 随着知识经济的崛起&#xff0c;企业的知识产权和著作权保护变得愈发重要。企业拥有大量的著作权作品&#xff0c;包括文档、软件、设计、创意和更多。这些作品代表了企业的创新和核心价值。为了更好地保护和管理这些资产&#xff0c;企业可以探索企业作品著作权API的应用…

《Operating Systems:Three Easy Pieces》 操作系统导论【二】 虚拟化内存

【Operating Systems:Three Easy Pieces 操作系统导论 】 (九) 抽象&#xff1a;地址空间 早期系统 操作系统曾经是一组函数&#xff08;实际上是一个库&#xff09;&#xff0c;在内存中&#xff08;在本例中&#xff0c;从物理地址0开始&#xff09;&#xff0c;然后有一…

视频下载小助手儿开通了视频号下载功能

不少人对视频号都有视频下载的需要&#xff0c;但由于平台并不提供该功能&#xff0c;我们视频下载小助手儿&#xff0c;就提供了视频号的视频下载功能。 为什么起名叫下载小助手儿呢&#xff1f; 下载小助手儿更直观让用户了解到他可以下载视频号的视频&#xff0c;但不局限与…

Shopee买家通系统怎么用的?

Shopee买家通系统操作简单方便&#xff0c;可直接根据详细操作文档或操作演示视频进行设置操作。 1、自动批量注册买家号 准备好相应的账号资料后按照软件所需格式填写好之后即可运行注册&#xff0c;运行注册时可以自动输入手机号、自动处理遇到的图形验证、自动接收短信、自…

大模型时代如何拥抱原生AI?“云智一体”千帆改变AI格局

前言 前不久相信很多开发者都被一则“生成未来”视频直播刷屏朋友圈&#xff0c;而直播的正是百度的创始人李彦宏。10月17日&#xff0c;百度世界2023在北京首钢园召开&#xff0c;“大模型带来的智能涌现&#xff0c;这是我们开发AI原生应用的基础。”我们即将进入一个AI原生…