备案网站可以做接码平台么,晋城市建设局网站,网站建设培训教程新手入门到精通,怎么做自己的音乐网站目录 参考引用一、数据集介绍二、环境配置三、构建训练数据集四、修改配置文件五、训练及tensorboard可视化六、效果测试七、遇到的BUG 参考引用 
你的陈某某-基于YOLOv5的PCB板缺陷检测 
一、数据集介绍 
印刷电路板#xff08;PCB#xff09;瑕疵数据集。它是一个公共合成P… 目录 参考引用一、数据集介绍二、环境配置三、构建训练数据集四、修改配置文件五、训练及tensorboard可视化六、效果测试七、遇到的BUG 参考引用 
你的陈某某-基于YOLOv5的PCB板缺陷检测 
一、数据集介绍 
印刷电路板PCB瑕疵数据集。它是一个公共合成PCB数据集包含1386张图像具有6种缺陷漏孔、鼠咬、开路、短路、杂散、杂铜用于图像检测、分类和配准任务。 
下载地址数据集  
数据样本示例 二、环境配置 
1、Gitub官网下载yolov5源码官方地址 
2、Anaconda 安装配置省略 
3、创建新的环境python3.8就行因为使用的是7.0的版本3.6有点低。 
conda create -n pytorch python3.8.54、安装pytorchpytorch官网  
conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia5、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(trainvaltest建议按照811比例划分)
│   ├── train.txt  写着用于训练的图片名称
│   ├── val.txt  写着用于验证的图片名称
│   ├── trainval.txt  train与val的合集
│   ├── test.txt  写着用于测试的图片名称2、训练数据生成分为两个代码训练集划分代码与用于yolo训练的txt格式代码 
1训练集划分代码 
在PCB_DATASET文件夹下新建ImageSets文件夹。 
用途主要是将数据集分类成训练数据集和测试数据集默认trainvaltest按照比例进行随机分类运行后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]  \nif 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  同时一张图片对应的类别有多个所以对应的的信息也有多个# 对应的通过year 找到相应的文件夹并且打开相应image_id的xml文件其对应bund文件in_file  open(D:\\pcb\\PCB_DATASET\\Annotations\\%s.xml % (image_id), encodingutf-8)# 准备在对应的image_id 中写入对应的label分别为# object-class x y width heightout_file  open(label_path\\%s.txt % (image_id), w, encodingutf-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文件中或difficult1则跳过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:对所有的文件数据集进行遍历做了两个工作将所有图片文件都遍历一遍并且将其所有的全路径都写在对应的txt文件中去方便定位同时对所有的图片文件进行解析和转化将其对应的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_sizeworkers根据自己电脑属性进行设置。 
我的–weights–cfg–data设置如下 parser.add_argument(--weights, typestr, defaultyolov5s.pt, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/yolov5s-pcb.yaml, helpmodel.yaml path)parser.add_argument(--data, typestr, defaultdata/PCB.yaml, helpdataset.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 --logdirruns或者python -m tensorboard.main --logdirruns d、复制其中的网址去浏览器中打开推荐谷歌 
e、可视化结果如下能够边训练边观察 3、在NVIDIA GeForce GTX 1650 8G显卡训练结果如下batch_size16workers8  
注意可能 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 Pillow9.5 -i https://pypi.tuna.tsinghua.edu.cn/simple/