基于PaddleDetection的电路板瑕疵检测

文章目录

  • 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 inlinewith 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}  # 填充批次以满足特定stridebatch_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数据集格式!COCODataSetimage_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数为12LearningRate:  # 学习率相关配置base_lr: 0.01  # 初始学习率设置为0.01schedulers:  # 学习率调度器的配置列表,用于在训练过程中调整学习率- !PiecewiseDecay  # 使用分段衰减策略gamma: 0.1  # 每次衰减因子为0.1milestones: [8, 11]  # 在epoch索引8和11处衰减学习率- !LinearWarmup  # 使用线性预热策略start_factor: 0.001  # 预热开始时的学习率因子为0.001steps: 1000  # 预热期的步数为1000OptimizerBuilder:  # 优化器构建器配置optimizer:  # 优化器的配置momentum: 0.9  # 动量优化器的动量参数设置为0.9type: Momentum  # 优化器类型为Momentum(动量优化器)regularizer:  # 正则化器的配置factor: 0.0001  # L2正则化因子设置为0.0001type: L2  # 正则化类型为L2(欧几里得范数)

预训练CascadeRCNN 的配置

architecture: CascadeRCNN  # 模型的架构,这里是Cascade R-CNN
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams  # 预训练模型权重的URLCascadeRCNN:backbone: ResNet  # 模型的主干网络,这里是ResNetneck: FPN  # 特征融合网络,这里是FPNrpn_head: RPNHead  # 区域提议网络的头部,用于生成候选区域bbox_head: CascadeHead  # 边界框预测头部,这里是CascadeHead# post process  # 后处理配置的注释说明bbox_post_process: BBoxPostProcess  # 边界框后处理模块ResNet:depth: 50  # ResNet网络的深度,这里是50层norm_type: bn  # 归一化类型,这里使用Batch Normalizationfreeze_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_proposalCascadeHead:head: CascadeTwoFCHead  # CascadeHead使用的头部网络,这里是CascadeTwoFCHeadroi_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.mzph.cn/web/33377.shtml

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

相关文章

问题:以下哪个不是报名“天天特价“活动必须具有的条件( ) #其他#其他#媒体

问题:以下哪个不是报名"天天特价"活动必须具有的条件( ) A、店铺信誉达到一钻 B、开通淘金币抵扣 C、宝贝月销量达到10个 D、店铺同类产品要达到10个以上 参考答案如图所示

C++观察者模式

一、定义 观察者(Observer)模式 定义如下:是一种对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 二、观察者模式组成: 抽象目标角色&#xff08…

易优cms远程调试

易优cms自ThinkPHP5.0版本开始,提供了Socket日志驱动用于本地和远程调试。 Socket调试 只需要在配置文件中设置如下: ‘log’ > [ ‘type’ > ‘socket’, ‘host’ > ‘slog.thinkphp.cn’, //日志强制记录到配置的client_id ‘force_c…

无人机捕获的视频跟踪UAV123数据集(目标检测)

亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 摘要&a…

TC3xx启动的功能安全机制浅析(2)

目录 1.引入 2. 应用启动阶段 3.小结 1.引入 TC3xx启动的功能安全机制浅析(1)-CSDN博客我们简述了SM基本概念以及芯片启动阶段Safety机制,接下来我们继续描述应用启动阶段相关功能安全机制 2. 应用启动阶段 在用户启动阶段,与功能安全相关的内容…

港股再遭重挫,市场到底在恐慌什么?

恒指上周五挫逾300点后,今日早间延续低迷低开超百点,随后一路震荡下行,最低见17789.57点。整体市场都表现相当低迷,但17750附近有一定支撑。截至收盘,恒指收跌0.00%。 港股持续在万八关徘徊,国资委旗下国新…

时间?空间?复杂度??

1.什么是时间复杂度和空间复杂度? 1.1算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称为空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空…

node.js环境安装以及Vue-CLI脚手架搭建项目教程

目录 ▐ vue-cli 搭建项目的优点 ▐ 安装node.js环境 ▐ 搭建vue脚手架项目 ▐ 项目结构解读 ▐ 常用命令 ▐ 创建组件 ▐ 组件路由 ▐ vue-cli 搭建项目的优点 传统的前端项目架构由多个html文件,且每个html文件都是相互独立的,导入外部组件时需…

【STM32】中断应用概述

前面我们知道在手册中有一个中断向量表,初步了解了中断的概念。 1.NVIC简介 NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。 在固件库中,NVIC的结构体定义可谓是…

【第27章】Vue实战篇之用户头像修改

文章目录 前言一、界面搭建二、头像回显三、头像上传1. 自动上传1.1 表单1.2 事件 2. 更新用户头像2.1 调用接口2.2 界面代码2.3 事件代码 总结 前言 这里来完成修改用户头像的功能。 一、界面搭建 <script setup>import { Plus, Upload } from element-plus/icons-vue…

RabbitMQ的高可用机制有了解过嘛

面试官&#xff1a;RabbitMQ的高可用机制有了解过嘛 候选人&#xff1a; 嗯&#xff0c;熟悉的~ 我们当时项目在生产环境下&#xff0c;使用的集群&#xff0c;当时搭建是镜像模式集群&#xff0c;使用了3台机器。 镜像队列结构是一主多从&#xff0c;所有操作都是主节点完成&a…

Listary——最好用的电脑搜索文件软件

简易版&#xff1a; https://www.listary.com/download-completion?versionstable 完整功能版&#xff1a; Microsoft PowerToys | Microsoft Learn

android——解决bug的流程以及细节

目录 心态 一、如何定位到有问题的bug代码 (1)搜索大法 (2)log输出大法 (3)profiler查看大法 (4)万能法找到页面 二、解决棘手bug的步骤 (1)先看再想最后动手 (2)改变现状 (3)是技术问题还是业务问题 (4)张张嘴远胜于动动手 (5)bug解决不了&#xff0c;那就解决提出…

华为仓颉编程语言震撼发布!Hello Cangjie!

引言 2024 年度华为开发者大会&#xff08;HDC&#xff09;在 6 月 21 日拉开帷幕&#xff0c;鸿蒙 NEXT&#xff08;HarmonyOS NEXT&#xff09;操作系统在万众瞩目中横空出世。 华为常务董事、终端 BG 董事长余承东激动地表示 &#xff0c;从 2019 年 8 月 9 日至今共 1778 天…

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长&#xff0c;在这个色彩缤纷的季节&#xff0c;SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心&#xff08;北京朝阳馆&#xff09;隆重开幕。新老朋友共聚一堂&#xff0c;把酒话桑麻。 为期4天的国际学术会…

【FFmpeg】AVPacket结构体

【FFmpeg】AVPacket结构体 1.AVPacket结构体的定义 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用ffmpeg库进行SDL2解码后渲染 流程分析&#xff1a; 【FFmpeg】编码链…

Cython 是什么

Cython 是一个 Python 编译器&#xff0c;它将 Python 代码编译成 C 代码。这意味着您可以使用 Python 的语法来编写代码&#xff0c;但通过 Cython 编译后&#xff0c;它将以接近 C 语言的速度运行。 特点 静态类型&#xff1a;Cython 提供了静态类型检查&#xff0c;这意味着…

不出网上线CS的各种姿势(内网横向)

情况一&#xff1a;存在一台中转机器 存在一台中转机器&#xff0c;这台机器出网&#xff0c;这种是最常见的情况。 经常是拿下一台边缘机器&#xff0c;其有多块网卡&#xff0c;用于连接内外网&#xff0c;内网机器都不出网。这种情况下拿这个边缘机器做中转&#xff0c;就…

分享几个小红书获取笔记详情API接口调用实例

item_get_video-获得小红书笔记详情 smallredbook.item_get_video 公共参数 名称类型必须描述keyString是调用key&#xff08;API支持测试&#xff0c;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[i…

react 父子组件的渲染机制 优化手段

**优化后** 优化思路&#xff1a;将使用了state的组件拆分为一个子组件&#xff0c;state在子组件中使用(将state下发到子组件)&#xff0c;state变化时仅当前组件重渲染。// 优化后写法 const Component () > { return ( ) } const ButtonWithDialog () > { const […