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

目录

  • 参考引用
  • 一、数据集介绍
  • 二、环境配置
  • 三、构建训练数据集
  • 四、修改配置文件
  • 五、训练及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 randomtrainval_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 joinsets = ['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/wdh = 1./size[1]     # 1/hx = (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)# 遍历目标objfor 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# 通过类别名称找到idcls_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 = 对应的文件名_idconvert_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# classesnc: 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,将内容进行修改

# Parametersnc: 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.mzph.cn/news/112204.shtml

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

相关文章

有什么小程序可以下载视频号的视频?

​最近有一些朋友问我&#xff0c;【视频号下载助手】和【视频下载bot】小程序&#xff0c;有什么作用&#xff1f; 首先视频号下载助手是协助用户进行下载的&#xff0c;但由于下载要符合平台规定&#xff0c;我们就将视频下载助手与视频下载bot小程序想结合的模式&#xff0…

YOLO目标检测——红白细胞血小板数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红白细胞血小板计数和分类数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签&…

yxy销售网站后台管理系统

springbootmybatisthymeleaf 第一个练习的项目就是小商品零售平台后台管理系统&#xff0c;但是当时由于业务不熟练&#xff0c;需求分析先不做好&#xff0c;导致在开发的过程中出现了很多问题。 这次首先把需求确定&#xff0c;详细的做好前期准备工作&#xff0c;再来进行…

吴恩达开新课了:面向所有人的生成式 AI 课程!我已偷偷学了起来

作者 | 智商掉了一地 斯坦福大学的吴恩达教授可能是许多人接触 AI 的启蒙课导师吧&#xff0c;在过去的十多年中&#xff0c;他的《Machine Learning》课程已经对数百万的学习者产生了积极影响。 ▲image.png 而随着 ChatGPT 的推出&#xff0c;大模型和各类生成式人工智能&am…

你知道谁是计算机之父吗?

“计算机之父” 这个词通常用来指代计算机科学领域的杰出人物&#xff0c;他们在计算机科学和技术的发展中发挥了重要作用。有多位人物被认为是计算机之父&#xff0c;其中包括&#xff1a; 查尔斯巴贝奇&#xff08;Charles Babbage&#xff09;&#xff1a;是英国的一位杰出的…

博客后台模块续更(四)

八、博客后台模块-Excel表格 1. 接口分析 在分类管理中点击导出按钮可以把所有的分类导出到Excel文件 请求方式 请求地址 请求头 GET /content/category/export 需要token请求头 响应体&#xff1a; 直接导出一个Excel文件 失败的话响应体如下&#xff1a; {"c…

通过尖端技术创造价值:释放生成式 AI 的力量

塔曼纳 一、说明 近年来&#xff0c;世界见证了人工智能&#xff08;AI&#xff09;的重大进步&#xff0c;生成式AI是最具革命性的技术之一。生成式人工智能已成为一种强大的方法&#xff0c;使机器能够创建新的原创内容&#xff0c;使其成为不同行业各种应用背后的驱动力。在…

window系统如何管理多版本node

何时需要切换node版本 如果你正在维护一个旧项目&#xff0c;同时也在进行新项目&#xff0c;两个项目所依赖的node版本害不同&#xff0c;那么你可以就需要经常切换node版本。项目中可能依赖于某些npm包&#xff0c;而这些包对特定版本的Node有要求。需要满足这些要求以确保依…

隐式类型转换

什么是隐式类型转换&#xff0c;多参数的造函数隐式类型转换&#xff0c;和单参数的构造函数隐式类型转换有什么区别 C中有三种主要的隐式类型转换&#xff1a; 1:多参数的构造函数隐式类型转换 2:单参数的构造函数隐式类型转换 3:成员函数隐式类型转换。…

EasyCVR视频汇聚平台显示有视频流但无法播放是什么原因?该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

【试题032】C语言关系运算符例题

1.题目&#xff1a;设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为&#xff1f; 2.代码分析&#xff1a; //设int a2,b4,c5;&#xff0c;则表达式ab!c>b>a的值为?int a 2, b 4, c 5;printf("%d\n", (a b ! c > b > a));//分析&#xff…

element ui 中 el-button重新渲染后disabled属性失效

调试发现:disabled绑定的值和显示没有保持一致&#xff0c;发现是disabled属性失效 解决方式&#xff1a; 给标签添加key 比如&#xff1a;key“isOldVersion” <el-form-item><el-button type"primary" style"margin-left: 100px;" click"…

N-128基于springboot,vue酒店管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis 本系统功…

HarmonyOS 音视频开发概述

在音视频开发指导中&#xff0c;将介绍各种涉及音频、视频播放或录制功能场景的开发方式&#xff0c;指导开发者如何使用系统提供的音视频 API 实现对应功能。比如使用 TonePlayer 实现简单的提示音&#xff0c;当设备接收到新消息时&#xff0c;会发出短促的“滴滴”声&#x…

零基础新手也能会的H5邀请函制作教程

随着科技的的发展&#xff0c;H5邀请函已经成为了各种活动、婚礼、会议等场合的常见邀约方式。它们不仅可以提供动态、互动的体验&#xff0c;还能让邀请内容更加丰富多彩。下面&#xff0c;我们将通过乔拓云平台&#xff0c;带领大家一步步完成H5邀请函的制作。 1. 选择可靠的…

Leetcode 21 合并两个有序链表 (链表)

Leetcode 21 合并两个有序链表 &#xff08;链表&#xff09; 解法1 复杂的第一版本&#xff08;优化大于和等于合并见方法二&#xff09;解法2 注意注意&#xff1a;先添加元素toadd.next list1&#xff0c;添加之后才可以移动指针toadd toadd.next 解法1 复杂的第一版本&a…

【Java 进阶篇】深入了解 Bootstrap 按钮和图标

按钮和图标在网页设计中扮演着重要的角色&#xff0c;它们是用户与网站或应用程序交互的关键元素之一。Bootstrap 是一个流行的前端框架&#xff0c;提供了丰富的按钮样式和图标库&#xff0c;使开发者能够轻松创建吸引人的界面。在本文中&#xff0c;我们将深入探讨 Bootstrap…

【Python生活脚本】视频转Gif动图

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-20 ❤️❤️ 本篇更新记录 2023-10-20 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

pytorch nn.Embedding 读取gensim训练好的词/字向量(有例子)

最近在跑深度学习模型&#xff0c;发现Embedding随机性太强导致模型结果有出入&#xff0c;因此考虑固定初始随机向量&#xff0c;既提前训练好词/字向量&#xff0c;不多说上代码&#xff01;&#xff01; 1、利用gensim训练字向量&#xff08;词向量自行修改&#xff09; #…

谷歌云:下一代开发者和企业解决方案的强力竞争者

自从2018年Oracle前研发总裁Thomas Kurian加入谷歌云&#xff08;Google Cloud&#xff09;并出任谷歌云CEO以来&#xff0c;业界对于谷歌云的发展就十分好奇。而谷歌云的前任CEO Diane Greene曾是VMware的创始人之一&#xff0c;那么两任企业级技术和解决方案出身的CEO&#x…