基于PaddleDetection的电路板瑕疵检测

news2024/11/25 0:23:15

文章目录

  • 1. 数据集与框架介绍
  • 2. 任务详情
  • 3. Cascade R-CNN简介
  • 4. 数据分析
    • 各类别样本的数量
    • 真实框的宽高比
    • 真实框在原图的大小比例
  • 5. 相关配置
    • 数据增强
    • 数据集路径和评估指标
    • 学习率和优化器配置
    • 预训练CascadeRCNN 的配置
    • 日志记录
  • 6. 训练预测
  • 7. 参考链接

1. 数据集与框架介绍

印刷电路板(PCB)瑕疵数据集:PCB疵数据集,是一个公共的合成PCB数据集,由北京大学发布,其中包含1386张图像以及6种缺陷(缺失孔,鼠咬伤,开路,短路,杂散,伪铜),用于检测、分类和配准任务。我们选取了其中适用于检测任务的693张图像,随机选择593张图像作为训练集,100张图像作为验证集。

PaddleDetection:飞桨推出的PaddleDetection是端到端目标检测开发套件,旨在帮助开发者更快更好地完成检测模型的训练、精度速度优化到部署全流程。该框架中提供了丰富的数据增强、网络组件、损失函数等模块,集成了模型压缩和跨平台高性能部署能力。

2. 任务详情

利用 Cascade R-CNN算法完成印刷电路板瑕疵检测。评估方法采用COCO数据集评分指标

3. Cascade R-CNN简介

R-CNN 和其变体通常用于需要高精度目标检测的应用,如自动驾驶、视频监控、图像识别等。
项目中使用的Cascade R-CNN算法 是在 Faster R-CNN 的基础上的进一步改进,它采用了级联结构。
级联结构由多个 R-CNN 检测器组成,每个检测器逐步细化候选区域和边界框。
每个检测器的输出作为下一个检测器的输入,这样可以提高检测精度,尤其是在小目标和复杂场景中。

Cascade R-CNN、R-CNN、Faster R-CNN和Fast R-CNN的主要特点和差异:

特征/算法R-CNNFast R-CNNFaster R-CNNCascade R-CNN
基础架构选择性搜索 + CNN选择性搜索 + CNN + ROI池化RPN + CNN + ROI池化级联的R-CNN/Fast R-CNN/Faster R-CNN
候选区域生成选择性搜索算法选择性搜索算法内置的RPN级联的候选区域细化
特征提取对每个区域独立提取对整个图像提取一次,共享特征对整个图像提取一次,共享特征多阶段特征提取和细化
分类器SVMSoftmaxSoftmax级联的分类器
边界框回归级联的边界框细化
速度较快非常快较慢(由于级联结构)
精度中等最高(特别是对于小目标)
计算资源中等中等高(由于级联检测)
适用场景通用目标检测通用目标检测通用目标检测,实时应用小目标检测,复杂场景
主要贡献引入基于区域的CNN通过ROI池化提高速度通过RPN实现端到端训练通过级联结构提高检测精度

4. 数据分析

各类别样本的数量

import json
from collections import defaultdict
import matplotlib.pyplot as plt
%matplotlib inline

with open("/home/aistudio/work/PCB_DATASET/Annotations/train.json") as f:
    data = json.load(f)

imgs = {}
for img in data['images']:
    imgs[img['id']] = {
        'h': img['height'],
        'w': img['width'],
        'area': img['height'] * img['width'],
    }

hw_ratios = []
area_ratios = []
label_count = defaultdict(int)
for anno in data['annotations']:
    hw_ratios.append(anno['bbox'][3]/anno['bbox'][2])
    area_ratios.append(anno['area']/imgs[anno['image_id']]['area'])
    label_count[anno['category_id']] += 1
label_count, len(data['annotations']) / len(data['images'])
  1. 从标签来看,总共6个类别。
  2. 各类别之间的框数量相对较平均,不需要调整默认的损失函数。(如果类别之间相差较大,建议调整损失函数,如BalancedL1Loss)
  3. 平均每张图的框数量在4个左右,属于比较稀疏的检测,使用默认的keep_top_k即可。

真实框的宽高比

plt.hist(hw_ratios, bins=100, range=[0, 2])
plt.show()

在这里插入图片描述

目标框长宽比分布

可以看到大部分集中在1.0左右,但也有部分在0.5~1之间, 少部分在1.25~2.0之间。虽说anchor会进行回归得到更加准确的框,但是一开始给定一个相对靠近的anchor宽高比会让回归更加轻松

真实框在原图的大小比例

plt.hist(area_ratios, bins=100, range=[0, 0.005])
plt.show()

这是真实框在原图的大小比例,可以看到大部分框只占到了原图的0.1%,甚至更小,因此基本都是很小的目标,这个也可以直接看一下原图和真实框就能发现。所以在初始的anchor_size设计时需要考虑到这一点,我这里anchor_size是从8开始的,也可以考虑从4开始,应该都可以的。
比如anchor_sizes可设置为:anchor_sizes: [[8],[16],[32], [64], [128]]

在这里插入图片描述

目标框占原图面积分布

5. 相关配置

数据增强

增强方式:RandomResize、RandomFlip、NormalizeImage

worker_num: 2  # 定义工作进程数,用于数据加载和处理

TrainReader:  # 训练数据读取器配置
  sample_transforms:  # 数据样本转换操作列表
  - Decode: {}  # 解码图像
  - RandomResize:  # 随机调整图像大小
    {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], interp: 2, keep_ratio: True}
  - RandomFlip: {prob: 0.5}  # 随机翻转图像,概率为0.5
  - NormalizeImage:  # 归一化图像
    {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}  # 调整数据维度顺序
  batch_transforms:  # 批量数据转换操作列表
  - PadBatch: {pad_to_stride: 32}  # 填充批次以满足特定stride
  batch_size: 1  # 定义每个批次的样本数
  shuffle: true  # 是否在每个epoch开始时打乱数据
  drop_last: true  # 是否丢弃最后一个不完整的批次
  collate_batch: false  # 是否合并批次数据

EvalReader:  # 评估数据读取器配置,与训练配置类似但通常不打乱数据
  # 配置项与TrainReader相同,不再赘述

TestReader:  # 测试数据读取器配置,通常用于模型推断
  # 配置项与TrainReader相似,但可能不涉及数据增强操作,不再赘述

数据集路径和评估指标

metric: COCO  # 使用COCO数据集的评估指标进行模型性能评估
num_classes: 7  # 数据集中目标类别的总数
TrainDataset:  # 训练数据集配置
  !COCODataSet  # 使用COCO数据集格式
    image_dir: images  # 训练图像存放的文件夹
    anno_path: Annotations/train.json  # 训练数据的注释文件路径
    dataset_dir: /home/aistudio/work/PCB_DATASET  # 数据集所在的根目录
    data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']  # 数据集中包含的字段列表

EvalDataset:  # 评估数据集配置,使用COCO数据集格式
  !COCODataSet
    image_dir: images  # 评估图像存放的文件夹
    anno_path: Annotations/val.json  # 评估数据的注释文件路径
    dataset_dir: /home/aistudio/work/PCB_DATASET  # 评估数据集所在的根目录

TestDataset:  # 测试数据集配置
  !ImageFolder  # 使用ImageFolder数据集格式,适用于通用图像文件夹
    anno_path: /home/aistudio/work/PCB_DATASET/Annotations/val.json  # 测试数据的注释文件路径

学习率和优化器配置

epoch: 12  # 训练过程中要执行的完整数据集遍历次数,即总的epoch数为12

LearningRate:  # 学习率相关配置
  base_lr: 0.01  # 初始学习率设置为0.01
  schedulers:  # 学习率调度器的配置列表,用于在训练过程中调整学习率
  - !PiecewiseDecay  # 使用分段衰减策略
    gamma: 0.1  # 每次衰减因子为0.1
    milestones: [8, 11]  # 在epoch索引8和11处衰减学习率
  - !LinearWarmup  # 使用线性预热策略
    start_factor: 0.001  # 预热开始时的学习率因子为0.001
    steps: 1000  # 预热期的步数为1000

OptimizerBuilder:  # 优化器构建器配置
  optimizer:  # 优化器的配置
    momentum: 0.9  # 动量优化器的动量参数设置为0.9
    type: Momentum  # 优化器类型为Momentum(动量优化器)
  regularizer:  # 正则化器的配置
    factor: 0.0001  # L2正则化因子设置为0.0001
    type: L2  # 正则化类型为L2(欧几里得范数)

预训练CascadeRCNN 的配置

architecture: CascadeRCNN  # 模型的架构,这里是Cascade R-CNN
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams  # 预训练模型权重的URL

CascadeRCNN:
  backbone: ResNet  # 模型的主干网络,这里是ResNet
  neck: FPN  # 特征融合网络,这里是FPN
  rpn_head: RPNHead  # 区域提议网络的头部,用于生成候选区域
  bbox_head: CascadeHead  # 边界框预测头部,这里是CascadeHead
  # post process  # 后处理配置的注释说明
  bbox_post_process: BBoxPostProcess  # 边界框后处理模块

ResNet:
  depth: 50  # ResNet网络的深度,这里是50层
  norm_type: bn  # 归一化类型,这里使用Batch Normalization
  freeze_at: 0  # 冻结网络中前N层的权重,这里是0层,即不冻结
  return_idx: [0,1,2,3]  # 返回的特征层索引
  num_stages: 4  # ResNet网络的阶段数

FPN:
  out_channel: 256  # FPN输出的特征通道数

RPNHead:
  anchor_generator:  # 锚点生成器配置
    aspect_ratios: [0.5, 1.0, 2.0]  # 锚点的纵横比
    anchor_sizes: [[32], [64], [128], [256], [512]]  # 锚点的大小
    strides: [4, 8, 16, 32, 64]  # 锚点在不同特征层上的步长
  rpn_target_assign:  # RPN目标分配配置
    batch_size_per_im: 256  # 每个图像上的目标总数
    fg_fraction: 0.5  # 正样本占目标总数的比例
    negative_overlap: 0.3  # 负样本的IoU阈值
    positive_overlap: 0.7  # 正样本的IoU阈值
    use_random: True  # 是否使用随机采样
  train_proposal:  # 训练时的候选区域生成配置
    min_size: 0.0  # 最小候选区域的大小
    nms_thresh: 0.7  # NMS的阈值
    pre_nms_top_n: 2000  # NMS前保留的候选区域数量
    post_nms_top_n: 2000  # NMS后保留的候选区域数量
    topk_after_collect: True  # 是否在收集后进行topk操作
  test_proposal:  # 测试时的候选区域生成配置,类似train_proposal

CascadeHead:
  head: CascadeTwoFCHead  # CascadeHead使用的头部网络,这里是CascadeTwoFCHead
  roi_extractor:  # ROI特征提取器配置
    resolution: 7  # 特征图的分辨率
    sampling_ratio: 0  # 采样比例
    aligned: True  # 是否对齐采样
  bbox_assigner: BBoxAssigner  # 边界框分配器

BBoxAssigner:
  batch_size_per_im: 512  # 每个图像上的目标总数
  bg_thresh: 0.5  # 背景样本的IoU阈值
  fg_thresh: 0.5  # 前景样本的IoU阈值
  fg_fraction: 0.25  # 前景样本占目标总数的比例
  cascade_iou: [0.5, 0.6, 0.7]  # Cascade R-CNN中不同阶段的IoU阈值
  use_random: True  # 是否使用随机采样

CascadeTwoFCHead:
  out_channel: 1024  # CascadeTwoFCHead的输出通道数

BBoxPostProcess:
  decode:  # 边界框解码配置
    name: RCNNBox  # 解码器名称
    prior_box_var: [30.0, 30.0, 15.0, 15.0]  # 锚点框的先验方差
  nms:  # 非极大值抑制配置
    name: MultiClassNMS  # NMS名称
    keep_top_k: 100  # 保留的边界框数量
    score_threshold: 0.05  # 边界框的得分阈值
    nms_threshold: 0.5  # NMS的阈值

日志记录

use_gpu: true  # 是否使用GPU进行训练,设置为true表示使用GPU
log_iter: 20  # 训练过程中每多少个迭代记录一次日志信息
save_dir: output  # 模型保存的目录
snapshot_epoch: 1  # 每多少个epoch保存一次模型快照

6. 训练预测

V100 16G训练593张图片40min完毕,最后一轮的效果如下:

在这里插入图片描述
模型在IoU阈值为0.50时表现非常好,但在更严格的IoU阈值和大型对象上表现有所下降。模型的召回率随着考虑的检测数增加而提高,但仍然有改进的空间,特别是在只选择一个最佳预测时。


如果在linux系统训练时,可每隔一秒查看gpu使用状况:

watch -n 1 nvidia-smi


最后选择一张PCB图片预测:

python -u ./tools/infer.py -c yaml配置文件 -infer_img=图片路径 -o weights=最好模型路径 use_gpu=true

预测效果:
在这里插入图片描述


7. 参考链接

casacde rcnn算法参考文章:
https://segmentfault.com/a/1190000022160962
https://cloud.tencent.com/developer/article/1443483
https://blog.csdn.net/qq_41542989/article/details/123690363

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

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

相关文章

【Sa-Token|3】Sa-Token集成到现有微服务详细介绍

一、系统架构调整 用户中心:保持现有的用户登录、注册接口不变。多个项目:前后端分离,保持现有逻辑不变。网关服务:新增或配置网关服务,处理所有请求并进行 Token 校验和转发。统一 Token 管理:通过 Sa-Tok…

VC++学习(5)——文本编程,插入符的初始化,图形插入符;文字始终在窗口;字符输入功能,回车换行,删除,左键定位;字体修改,字体平滑变色

目录 引出第五讲 文本编程新建项目输入线的初始化根据字体大小定义插入符大小创建图形插入符文字始终保存在窗口中CString类通过字符串资源 路径层字符输入的功能键盘输入消息鼠标左键消息保存点击位置的坐标 输入回车键的处理删除文字的实现 字符输入功能代码字体的修改模拟卡…

js如何使得四舍五入的百分比之和为100%

在JavaScript中,如果你想要确保一组四舍五入后的百分比之和严格等于100%,那么你不能直接对每个百分比进行四舍五入,因为四舍五入会引入误差。但是,你可以采用一种策略,即先对所有的百分比进行常规的四舍五入&#xff0…

ffmpeg音视频开发从入门到精通——ffmpeg下载编译与安装

音视频领域学习ffmpeg的重要性 音视频领域中ffmpeg的广泛应用,包括直播、短视频、网络视频、实时互动和视频监控等领域。掌握FM和音视频技术可以获得更好的薪酬。 学习建议音视频学习建议与实战应用 音视频处理机制的学习,需要勤加练习,带…

WIFI7技术之超强MLO (Multi-Link Operation)技术

随着科技的飞速发展,无线网络已成为我们日常生活中不可或缺的一部分。从最初的WIFI71到现在的WIFI7,无线网络技术不断突破,为用户提供更快、更稳定的网络体验。本文将探讨下WIFI7的MLO(Multi-Link Operation,多链路操作…

【SpringBoot3.x】自定义开发通用SDK

1. 前言 相信大家学习SpringBoot到现在,使用Maven构建项目时,会在pom.xml文件中引入各种各样的依赖,那么我们如何将自己常用的一些工具类库进行封装成starter或者SDK供其他项目使用呢,本博客就会带着大家一步一步创建自定义的SDK…

力扣1793.好子数组的最大分数

力扣1793.好子数组的最大分数 对于每个数 求其左右两侧小于它高度的元素下标(单调栈) class Solution {public:int maximumScore(vector<int>& nums, int k) {int n nums.size();vector<int> left(n,-1);stack<int> st;for(int i0;i<n;i){while(!…

技术分享 | 基于 API 解析的 Python 爬虫

最近各大高校纷纷翻拍 Coincidence 抖肩舞&#xff0c;需要对这种流行现象进行数据分析。数据分析首先需要有数据&#xff0c;本文介绍了爬取 B 站相应视频的评论、弹幕、播放量、点赞数等数据的方法。爬虫有多种实现方法&#xff0c;大型的网络爬虫多基于成熟的爬虫框架&#…

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失&#xff0c;因此就此作罢。对于 macOS 用户来说&#xff0c;当文件被删除时&#xff0c;垃圾箱已被清空&#xff0c;他们可能不知道如何恢…

spring-gateway配置说明

在开发过程中遇到的一些配置问题&#xff0c;记录下来以供参考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依赖eureka 服务发现并自动将发现服务器加入到router中的时候&#xff0c;需要指定对应的服务进行添加&#xff0c;根据文档…

算法训练与程序竞赛题目集合(L3)

目录 L3-001 凑零钱 输入格式&#xff1a; 输出格式&#xff1a; 输入样例 1&#xff1a; 输出样例 1&#xff1a; 输入样例 2&#xff1a; 输出样例 2&#xff1a; L3-002 特殊堆栈 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&…

伦敦银趋势线的有效性怎么验证?

怎么才能画出一根能发挥作用的趋势线呢&#xff1f;这是很多投资者追求的目标。其实要趋势线能发挥作用&#xff0c;我们在画它的时候就要进行一些验证&#xff0c;将通过了验证的趋势线保留下来&#xff0c;那些没通过的就删除&#xff0c;这样得到能发挥作用的趋势线的概率就…

Springboot 共享车位系统小程序-计算机毕设 附源码93439

Springboot 共享车位系统小程序 摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于springboot共享车位系统小程序。 对于本共享车位系统的设计来说&#xff0c;…

【深度学习驱动流体力学】剖析流体力学可视化paraview原理

目录 1.paraview版本2.配置过程检查插件库文件配置 ParaView 环境变量启动 ParaView 并检查插件3.可视化测试插件功能3.加载数据进行可视化第一步: 导入案例第二步:查看当前目录未更新前的内容第三步:使用 blockMesh 命令生成腔体案例的网格第四步:运行仿真icoFoam第五步:使用 …

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板&#xff0c;黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

E84-晶圆载具交接自动化

E84是一种通讯协议&#xff0c;它的核心作用在于为通讯传感器/设备的开发提供基础架构。 E84协议详细阐述了晶圆载具&#xff08;如FOUP/POD等&#xff09;在工厂自动化物料搬运系统&#xff08;AMHS&#xff09;与机台装载端口&#xff08;LP&#xff09;之间&#xff0c;如何…

X86+FPGA, NXP+FPGA:工控稳“固”之选 赋能CPCI/VPX智能轨交新变革

工业IPC在目前大时代背景下面临机遇,但挑战同样也不少。在轨道交通领域&#xff0c;工控机必须具备高可靠性和稳定性&#xff0c;能够在复杂且严苛的工作环境中长时间无故障运行&#xff1b;需要满足严格的实时性和响应性能要求&#xff0c;确保能够迅速准确地处理传感器信号和…

4K高质量视频素材库,剪辑必备

找免费4K 高质量视频素材&#xff0c;就上这8个网站&#xff0c;剪辑必备&#xff0c;赶紧收藏吧&#xff01; 1、baotu 【实拍视频】免费下载_实拍视频素材​ibaotu.com/shipin/7-5026-0-0-0-1.html?spmzhkolws​编辑 国内高质量素材网站&#xff0c;涵盖设计、新媒体、视频…

语言模型测试系列【10】

一个巧合&#xff0c;又测到了新的区别&#xff0c;以下是关于python代码生成的测试效果。 语言模型 文心一言讯飞星火通义千问2.5豆包360智脑百小应腾讯元宝KimiC知道商量智谱清言 这次的测试问题来源于**智谱AI开放平台**的介绍&#xff0c;正好有个python生成的效果说明…

qt 一个可以拖拽的矩形

1.概要 2.代码 2.1 mycotrl.h #ifndef MYCOTRL_H #define MYCOTRL_H#include <QWidget> #include <QMouseEvent>class MyCotrl: public QWidget {Q_OBJECT public://MyCotrl();MyCotrl(QWidget *parent nullptr); protected:void paintEvent(QPaintEvent *even…