## 1.研究背景
随着电子产品的普及和应用范围的扩大,印刷电路板(Printed Circuit Board,PCB)作为电子产品的核心组成部分,其质量和可靠性对整个产品的性能和寿命起着至关重要的作用。然而,在PCB的制造过程中,由于材料、设备、工艺等因素的影响,往往会导致一些缺陷的产生,如焊接不良、线路断裂、短路等。这些缺陷不仅会影响产品的正常工作,还可能导致产品的损坏甚至危及用户的安全。
因此,对PCB板的缺陷进行准确、高效的检测和识别是至关重要的。传统的PCB板缺陷检测方法主要依赖于人工目视检查,这种方法存在着效率低、易出错、主观性强等问题。而随着计算机视觉和深度学习技术的快速发展,基于YOLOv5和OpenCV的PCB板缺陷系统应运而生。
YOLOv5是一种基于深度学习的目标检测算法,其具有高效、准确、实时性强等优点。通过训练一个深度神经网络,YOLOv5可以实现对PCB板上各种缺陷的自动检测和识别。而OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和分析功能,可以用于对PCB板图像进行预处理和后处理。
## 2.研究意义:
1. 提高检测效率和准确性:相比传统的人工目视检查方法,基于YOLOv5和OpenCV的系统可以实现对PCB板缺陷的自动检测和识别,大大提高了检测的效率和准确性。同时,由于YOLOv5具有实时性强的特点,可以实时监测PCB板的生产过程,及时发现和修复缺陷,提高了产品的质量和可靠性。
2. 降低成本和提高生产效率:传统的人工目视检查方法需要大量的人力和时间投入,成本高且效率低下。而基于YOLOv5和OpenCV的系统可以实现自动化检测,减少了人力投入和检测时间,降低了成本,提高了生产效率。
3. 推动计算机视觉和深度学习技术的应用:基于YOLOv5和OpenCV的PCB板缺陷系统是计算机视觉和深度学习技术在电子制造领域的典型应用。通过该系统的研究和应用,可以推动计算机视觉和深度学习技术在其他领域的应用,促进技术的进步和创新。
总之,基于YOLOv5和OpenCV的PCB板缺陷系统具有重要的研究意义和实际应用价值。通过该系统的研究和应用,可以提高PCB板缺陷的检测效率和准确性,降低成本,提高生产效率,推动计算机视觉和深度学习技术的应用。这对于提高电子产品的质量和可靠性,促进电子制造业的发展具有重要的意义。
# 3.图片演示
![2.png](b67f650636c18ca5622d446b4cb92720.webp)
![3.png](479ff0e7ac072664cfe1c46a25f3331a.webp)
![4.png](0405f896ba703f8a423ba84d168549a1.webp)
# 4.视频演示
[改进YOLOv5&OpenCV的PCB板缺陷检测系统(源码和部署教程)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1mG411f7eE/?vd_source=ff015de2d29cbe2a9cdbfa7064407a08)
## 5.核心代码讲解
#### 5.1 ui.py
```python
def load_model(
weights='./best.pt', # model.pt path(s)
data=ROOT / 'data/coco128.yaml', # dataset.yaml path
device='', # cuda device, i.e. 0 or 0,1,2,3 or cpu
half=False, # use FP16 half-precision inference
dnn=False, # use OpenCV DNN for ONNX inference
):
# Load model
device = select_device(device)
model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data)
stride, names, pt, jit, onnx, engine = model.stride, model.names, model.pt, model.jit, model.onnx, model.engine
# Half
half &= (pt or jit or onnx or engine) and device.type != 'cpu' # FP16 supported on limited backends with CUDA
if pt or jit:
model.model.half() if half else model.model.float()
return model, stride, names, pt, jit, onnx, engine
def run(model, img, stride, pt,
imgsz=(640, 640), # inference size (height, width)
conf_thres=0.15, # confidence threshold
iou_thres=0.15, # NMS IOU threshold
max_det=1000, # maximum detections per image
device='', # cuda device, i.e. 0 or 0,1,2,3 or cpu
classes=None, # filter by class: --class 0, or --class 0 2 3
agnostic_nms=False, # class-agnostic NMS
augment=False, # augmented inference
half=False, # use FP16 half-precision inference
):
cal_detect = []
device = select_device(device)
names = model.module.names if hasattr(model, 'module') else model.names # get class names
# Set Dataloader
im = letterbox(img, imgsz, stride, pt)[0]
# Convert
im = im.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB
im = np.ascontiguousarray(im)
im = torch.from_numpy(im).to(device)
im = im.half() if half else im.float() # uint8 to fp16/32
im /= 255 # 0 - 255 to 0.0 - 1.0
if len(im.shape) == 3:
im = im[None] # expand for batch dim
pred = model(im, augment=augment)
pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
# Process detections
for i, det in enumerate(pred): # detections per image
if len(det):
# Rescale boxes from img_size to im0 size
det[:, :4] = scale_coords(im.shape[2:], det[:, :4], img.shape).round()
# Write results
for *xyxy, conf, cls in reversed(det):
c = int(cls) # integer class
label = f'{names[c]}'
lbl = names[int(cls)]
print(lbl)
#if lbl not in [' Chef clothes',' clothes']:
#continue
cal_detect.append([label, xyxy,str(float(conf))[:5]])
return cal_detect
```
该程序文件是一个基于YOLOv5的芯片表面缺陷检测系统。主要功能包括加载模型、运行模型进行目标检测、显示检测结果。
程序文件首先导入了一系列的库和模块,包括argparse、platform、shutil、time、numpy、cv2、torch等。然后定义了一些全局变量和函数。
load_model函数用于加载模型,参数包括模型权重路径、数据集配置文件路径、设备类型等。该函数会返回加载的模型、步长、类别名称等信息。
run函数用于运行模型进行目标检测,参数包括模型、输入图像、步长、模型输入尺寸、置信度阈值等。该函数会返回检测到的目标信息。
det_yolov5v6函数用于对输入的图像或视频进行目标检测,参数为输入路径。该函数会调用run函数进行目标检测,并在图像或视频上绘制检测结果。
Thread_1类是一个继承自QThread的线程类,用于在后台运行目标检测任务。
Ui_MainWindow类是一个用户界面类,用于创建和管理程序的图形界面。该类定义了界面的布局和控件,并绑定了相应的事件处理函数。
程序的主函数部分首先加载模型,然后创建一个Qt应用程序和主窗口,并将Ui_MainWindow类实例化为ui对象。最后启动应用程序的事件循环。
整个程序的功能是在图形界面中选择输入文件,然后点击开始识别按钮,程序会调用目标检测函数对输入文件进行目标检测,并在界面上显示检测结果。
#### 5.2 models\common.py
```python
class SwinTransformerBlock(nn.Module):
def __init__(self, c1, c2, num_heads, num_layers, window_size=8):
super().__init__()
self.conv = None
if c1 != c2:
self.conv = Conv(c1, c2)
# remove input_resolution
self.blocks = nn.Sequential(*[SwinTransformerLayer(dim=c2, num_heads=num_heads, window_size=window_size,
shift_size=0 if (i % 2 == 0) else window_size // 2) for i in range(num_layers)])
def forward(self, x):