1、主要参考

(1)大佬教程

基于PaddleDetection的PCB瑕疵检测_AI Studio的博客-CSDN博客

(2)blibli视频

253-14_PCB电路板缺陷检测_项目配置文件_dec_哔哩哔哩_bilibili

(3)coco数据集说明

『深度应用』目标检测coco数据集格式介绍 - 腾讯云开发者社区-腾讯云

2、模型的下载

(1)下载地址

北京大学智能机器人开放实验室

印刷电路板(PCB)瑕疵数据集。它是一个公共合成PCB数据集,包含1386张图像,具有6种缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜),用于图像检测、分类和配准任务

看了一下,上面地址下载的数据集,是voc格式的

(2)根据百度教程来的话可以通过AIstudio直接下载

3、模型的特征查看

(1)查看各个缺陷的分布情况(类别数是否均匀,如果不均匀可以考虑调整loss的计算方法

(2)查看锚框的长宽比,看看都是什么形状的

(3)看看锚框的大小(和原图大小的比值,看看是不是都是小物体

(4)文件pcb_dataset_analysis.py如下

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#查看各个缺陷的分布情况(类别数是否均匀,如果不均匀可以考虑调整loss的计算方法)
print( label_count, len(data['annotations']) / len(data['images']) )#查看锚框的长宽比,看看都是什么形状的
plt.hist(hw_ratios, bins=100, range=[0, 2])
plt.show()#看看锚框的大小(和原图大小的比值,看看是不是都是小物体)
plt.hist(area_ratios, bins=100, range=[0, 0.005])
plt.show()

1)各个缺陷的分布和每张图的缺陷数如下

#查看各个缺陷的分布情况(类别数是否均匀,如果不均匀可以考虑调整loss的计算方法)
print( label_count, len(data['annotations']) / len(data['images']) )

2)长宽比的分布如下

#查看锚框的长宽比,看看都是什么形状的
plt.hist(hw_ratios, bins=100, range=[0, 2])
plt.show()

3)锚框和图的面积比如下

#看看锚框的大小(和原图大小的比值,看看是不是都是小物体)
plt.hist(area_ratios, bins=100, range=[0, 0.005])
plt.show()

4、下载paddle的object项目

4.1 下载

(1)paddle官网

飞桨PaddlePaddle-源于产业实践的开源深度学习平台

(2)下载指定PaddleDetection

(3)对应的github地址如下

https://github.com/PaddlePaddle/PaddleDetection

4.2安装相关环境

#(1)在对应目录下
conda activate chenpaddle_cp310#(2)安装相关环境
pip install -r requirements.txt pip install pycocotools

5、基于faster-rcnn的PCB缺陷检测

(1)一下参考来自官网

基于PaddleDetection的PCB瑕疵检测-FasterRCNN - 飞桨AI Studio

(2)配置参数

在检测目录下创建chenfastrcnn 目录,然后创建文件pcb_faster_rcnn_r50_fpn_3x_coco.yml内容如下

metric: COCO           # Label评价指标,coco IoU:0.5:0.95
num_classes: 7         # 类别数量,coco类别比实际类别(voc类别)+1TrainDataset:!COCODataSetimage_dir: imagesanno_path: Annotations/train.jsondataset_dir: /home/chen/deep_data/pcb/PCB_DATASET_AI_STUDIO/PCB_DATASETdata_fields: ['image', 'gt_bbox', 'gt_class']#, 'is_crowd'EvalDataset:!COCODataSetimage_dir: imagesanno_path: Annotations/val.jsondataset_dir: /home/chen/deep_data/pcb/PCB_DATASET_AI_STUDIO/PCB_DATASETTestDataset:!ImageFolderanno_path: Annotations/val.jsonuse_gpu: true                          # 根据硬件选择是否使用GPU
log_iter: 10                           # 日志窗口的尺度
save_dir: output/     # 模型输出文件夹
snapshot_epoch: 1                      # 生成快照的频率,即每1个周期生成一次epoch: 24                      ### 训练周期:24LearningRate:                  ### 学习率:阶段学习率base_lr: 0.0025              # 起始学习率:0.0025 schedulers:- !PiecewiseDecay            ## 阶段学习率gamma: 0.1                 # 每次学习率变化为原来的1/10milestones: [16, 22]       # 总共进行两次学习率的降低- !LinearWarmup              ## 慢启动,共执行200次迭代,学习率为初始学习率的0.1start_factor: 0.1steps: 200OptimizerBuilder:              ### 优化方法:基于动量的SGDoptimizer:momentum: 0.9type: Momentumregularizer:factor: 0.0001type: L2architecture: FasterRCNN                   # 总框架类型
# 预训练模型
pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams## 检测模型的体系结构,包含骨干、支路、区域建议、BBox头和BBox头后处理
FasterRCNN:backbone: ResNet                        # 主干网络:ResNetneck: FPN                               # 特征金字塔网络rpn_head: RPNHead                       # 区域建议头:基于FPN的RPNHeadbbox_head: BBoxHead                     # BBox头:BBoxHead# post process   bbox_post_process: BBoxPostProcess      # BBox后处理器ResNet:# index 0 stands for res2depth: 50                               # 深度50,即ResNet50norm_type: bn                           # 正则化类型BN,基本上是唯一选择freeze_at: 0                            # 冻结部分,ResNet的前两层return_idx: [0,1,2,3]                   # 提取特征的位置,即用于FPN的特征,其实index为0num_stages: 4FPN:out_channel: 256                        # FPN通道数:256RPNHead:anchor_generator:                                    ## Anchor生成器aspect_ratios: [0.5, 1.0, 2.0]                     # Anchor的比例1:2,1:1,2:1anchor_sizes: [[32], [64], [128], [256], [512]]    # Anchor的尺度strides: [4, 8, 16, 32, 64]                        # Anchor的步长rpn_target_assign:                                   ## RPN设置batch_size_per_im: 256                             # RPN采样数量: 256 fg_fraction: 0.5                                   # 正样本数量: 256*0.5=128   negative_overlap: 0.3                              # 负样本IoU<0.3 positive_overlap: 0.7                              # 正阳IoU>0.7use_random: Truetrain_proposal:                                      ## 训练建议框设置min_size: 0.0                                      nms_thresh: 0.7                                    # 训练阶段nms阈值pre_nms_top_n: 2000                                # 第一阶段nms数量post_nms_top_n: 1000                               # 第二阶段nms数量topk_after_collect: Truetest_proposal:                                       ## 测试建议框设置min_size: 0.0nms_thresh: 0.7                                    # 测试阶段nms阈值     pre_nms_top_n: 1000                                # 第一阶段nms数量post_nms_top_n: 1000                               # 第二阶段nms数量BBoxHead:                                              ## BBox头head: TwoFCHead                                      # 两个FC头roi_extractor:resolution: 7                                      # RoIPooling特征层的尺度7×7sampling_ratio: 0aligned: True                                      # 启用RoIAlignbbox_assigner: BBoxAssignerBBoxAssigner:batch_size_per_im: 512                               # batch数量:512bg_thresh: 0.5                                       # 背景阈值<0.5fg_thresh: 0.5                                       # 前景阈值>0.5fg_fraction: 0.25use_random: TrueTwoFCHead:out_channel: 1024                                    # 全连接层特征维度(后面紧跟分类和回归层):1024BBoxPostProcess:decode: RCNNBoxnms:name: MultiClassNMSkeep_top_k: 100score_threshold: 0.05nms_threshold: 0.5worker_num: 2TrainReader: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}- 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}batch_size: 1      # 每批大尺度shuffle: true      # 是否随机drop_last: true    # 最后一个batch不足batch_sizes时,是否将多余数据进行丢弃EvalReader:sample_transforms:- Decode: {}- Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}- 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}batch_size: 1shuffle: falsedrop_last: falsedrop_empty: falseTestReader:sample_transforms:- Decode: {}- Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}- 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}batch_size: 1shuffle: falsedrop_last: false

(2)在PaddleDetection-release-2.5目录下的终端中执行如下命令

CUDA_VISIBLE_DEVICES=0python -u tools/train.py -c /home/chen/chen_deep/02PaddleDetection/PaddleDetection-release-2.5/chenfastrcnn/pcb_faster_rcnn_r50_fpn_3x_coco.yml --eval 或者python -u tools/train.py -c /home/chen/chen_deep/02PaddleDetection/PaddleDetection-release-2.5/chenfastrcnn/pcb_faster_rcnn_r50_fpn_3x_coco.yml --eval -o use_gpu=True或者python -u tools/train.py -c /home/chen/chen_deep/02PaddleDetection/PaddleDetection-release-2.5/chenfastrcnn/pcb_faster_rcnn_r50_fpn_3x_coco.yml --eval -o use_gpu=False

(3)训练得到的模型在output下面

(4)测试以下图片,以下命令还有问题,会报错

python -u tools/infer.py -c /home/chen/chen_deep/02PaddleDetection/PaddleDetection-release-2.5/chenfastrcnn/pcb_faster_rcnn_r50_fpn_3x_coco.yml                 --infer_img=/home/chen/deep_data/pcb/PCB_DATASET_AI_STUDIO/PCB_DATASET/images/04_missing_hole_10.jpg                 -o weights=output/pcb_faster_rcnn_r50_fpn_3x_coco/best_model.pdparams use_gpu=True

6、基于PP-YOLOE+的PCB缺陷检测

(1)以下引用参考来自paddle官网

基于PP-YOLOE+的PCB缺陷检测 - 飞桨AI Studio基于PP-YOLOE+实现的PCB缺陷检测方案全流程实战,覆盖训练、调优、部署等 - 飞桨AI Studiohttps://aistudio.baidu.com/aistudio/projectdetail/4670836

黑盒教程真有意思 :(

(2)其中ppyoloe_plus_crn_m_80e_obj365_pretrained_pcb.yml内容如下

_BASE_: ['./_base_/pcb_detection.yml','../../runtime.yml','../_base_/optimizer_80e.yml','../_base_/ppyoloe_plus_crn.yml','../_base_/ppyoloe_plus_reader.yml',
]log_iter: 100
snapshot_epoch: 5
weights: output/ppyoloe_plus_crn_m_80e_coco_pretrained_pcb/model_finalpretrain_weights: https://bj.bcebos.com/v1/paddledet/models/ppyoloe_plus_crn_m_80e_coco.pdparams
depth_mult: 0.67
width_mult: 0.75

(3)'./_base_/pcb_detection.yml',文件如下

metric: COCO
num_classes: 6TrainDataset:!COCODataSetimage_dir: imagesanno_path: pcb_cocoanno/train.jsondataset_dir: dataset/PCB_coco/data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']EvalDataset:!COCODataSetimage_dir: imagesanno_path: pcb_cocoanno/val.jsondataset_dir: dataset/PCB_coco/TestDataset:!ImageFolderanno_path: pcb_cocoanno/val.json # also support txt (like VOC's label_list.txt)dataset_dir: dataset/PCB_coco/ # if set, anno_path will be 'dataset_dir/anno_path'

(4)'../../runtime.yml',文件内容如下

use_gpu: true
use_xpu: false
log_iter: 20
save_dir: output
snapshot_epoch: 1
print_flops: false# Exporting the model
export:post_process: True  # Whether post-processing is included in the network when export model.nms: True           # Whether NMS is included in the network when export model.benchmark: False    # It is used to testing model performance, if set `True`, post-process and NMS will not be exported.fuse_conv_bn: False

(5) '../_base_/optimizer_80e.yml',内容如下

epoch: 80LearningRate:base_lr: 0.001schedulers:- !CosineDecaymax_epochs: 96- !LinearWarmupstart_factor: 0.epochs: 5OptimizerBuilder:optimizer:momentum: 0.9type: Momentumregularizer:factor: 0.0005type: L2

(6)ppyoloe_plus_crn.yml

architecture: YOLOv3
norm_type: sync_bn
use_ema: true
ema_decay: 0.9998
ema_black_list: ['proj_conv.weight']
custom_black_list: ['reduce_mean']YOLOv3:backbone: CSPResNetneck: CustomCSPPANyolo_head: PPYOLOEHeadpost_process: ~CSPResNet:layers: [3, 6, 6, 3]channels: [64, 128, 256, 512, 1024]return_idx: [1, 2, 3]use_large_stem: Trueuse_alpha: TrueCustomCSPPAN:out_channels: [768, 384, 192]stage_num: 1block_num: 3act: 'swish'spp: truePPYOLOEHead:fpn_strides: [32, 16, 8]grid_cell_scale: 5.0grid_cell_offset: 0.5static_assigner_epoch: 30use_varifocal_loss: Trueloss_weight: {class: 1.0, iou: 2.5, dfl: 0.5}static_assigner:name: ATSSAssignertopk: 9assigner:name: TaskAlignedAssignertopk: 13alpha: 1.0beta: 6.0nms:name: MultiClassNMSnms_top_k: 1000keep_top_k: 300score_threshold: 0.01nms_threshold: 0.7

(7)ppyoloe_plus_crn.yml

worker_num: 4
eval_height: &eval_height 640
eval_width: &eval_width 640
eval_size: &eval_size [*eval_height, *eval_width]TrainReader:sample_transforms:- Decode: {}- RandomDistort: {}- RandomExpand: {fill_value: [123.675, 116.28, 103.53]}- RandomCrop: {}- RandomFlip: {}batch_transforms:- BatchRandomResize: {target_size: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768], random_size: True, random_interp: True, keep_ratio: False}- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}- Permute: {}- PadGT: {}batch_size: 8shuffle: truedrop_last: trueuse_shared_memory: truecollate_batch: trueEvalReader:sample_transforms:- Decode: {}- Resize: {target_size: *eval_size, keep_ratio: False, interp: 2}- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}- Permute: {}batch_size: 2TestReader:inputs_def:image_shape: [3, *eval_height, *eval_width]sample_transforms:- Decode: {}- Resize: {target_size: *eval_size, keep_ratio: False, interp: 2}- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}- Permute: {}batch_size: 1

(4)paddle---PCB检测的例子相关推荐

  1. 工程师必看:常见的PCB检测方法有哪些?

    PCB 检测,是 PCB 生产过程中极其重要的步骤,是必不可少的生产流程. 所谓 PCB 检测,就是检验 PCB 设计的合理性.测试其在生产过程中可能出现的问题或缺陷,确保产品的功能性和外观,提高最终 ...

  2. Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子

    Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子 我们从github找到一个用fast-rcnn训练模型用于目标物体检测的例子,文中是实现检测扑克牌的 ...

  3. pcb成型板aoi检测_AOI在PCB检测中的应用

    描述 印制电路板(简称PCB)是组装电子零件用的基板,PCB板的制造品质直接影响电子产品的可靠性.随着电子组装向更高密度.更小尺寸的PCB混合技术的纵深发展,为减少进入下步工序的缺陷电路板的数量,对P ...

  4. 【一键检测】这么高效的PCB检测工具,早点知道就好了

    [一键检测]这么高效的PCB检测工具,早点知道就好了 高效检测PCB,打板钱排除设计问题,顺利打板量产. 国内首款免费PCB可制造性可装配分析软件,分享如何利用该款工具高效完成工作.和30万+工程师小 ...

  5. 金鉴实验室 PCBA切片分析 PCB检测

    目的:电子元器件表面及内部缺陷检查及SMT制程改善&验证. 适用范围: 适用于电子元器件结构剖析,PCBA焊接缺陷,焊点上锡形态及缺陷检测等. 使用仪器:精密切割机,镶埋机,研磨及抛光机,金相 ...

  6. opencv联合dlib人脸检测例子二(加快检测)

    本篇博客是在opencv联合dlib人脸检测例子的基础上改进了下,加快检测流程 观察了下,opencv利用haar级联分类器检测人脸区域的速度要稍快于dlib的frontal_face_detecto ...

  7. 论文研究 | 基于机器视觉的 PCB 缺陷检测算法研究现状及展望

    前面分享了机器视觉在汽车行业与交通行业的应用,其实机器视觉在工业上的应用是最广泛也是最具挑战性的,其中PCB板缺陷检测一直是机器视觉待攻克的难题.印刷电路板(PCB)是电子零件的基板,需求量极大,承载 ...

  8. 分享||PCB线路板检测最常用的七种方法 2021-09-28

    检测pcb板的目的是为了找出pcb板缺陷并进行修复,确保线路板的生产质量,提高产品合格率.目前pcb板检测方法可分为两大类:电气测试方法和视觉测试方法.今天小编和大家分享7种常用的pcb检测方法,具体 ...

  9. 基于OPENCV和图像减法的PCB缺陷检测

    基于OPENCV和图像减法的PCB缺陷检测 原文地址:PCB defect detection USING OPENCV with image subtraction method Abstract ...

最新文章

  1. 【ORACLE技术嘉年华PPT】MySQL压力测试经验
  2. 学习网络请求返回json对应的model
  3. php onmouse,html在鼠标按钮在元素上按下时触发的事件属性onmousedown
  4. JMS Java消息服务(Java Message Service)
  5. Java笔记:与系统交互、系统相关的类,Object类
  6. Jquery插件(一) webupload上传插件
  7. matlab迭代次数,怎么知道程序中的迭代次数呢
  8. xiao77论坛php,论坛
  9. MySQL_数据库表记录的操作
  10. 平面/UI设计师社区交流网站集设|给你的作品多一个展示机会
  11. Jersey框架入门学习
  12. layui表格中显示内容换行
  13. php微信商家转账到零钱 发起商家转账API
  14. KernelBase.dll中有未经处理的异常,求助大神!!!
  15. scrollIntoView 滚不动
  16. 王者荣耀是如何从C++代码变到游戏的?
  17. PV操作经典例题——哲学家进餐问题
  18. Webex Player 安装文件,解决了不能播放问题,win7也能使用
  19. QQ2018手机版 v7.9.0
  20. 在线音乐付费用户达5600万再创新纪录、付费率破9%,腾讯音乐娱乐集团Q4及全年财报多项业绩突破增长

热门文章

  1. win7怎么修改计算机皮肤,Windows7系统是怎么修改UC浏览器的皮肤?
  2. c语言像素鸟游戏,mfc编写的像素鸟flappy bird 小游戏
  3. asp.net仓储物流管理系统
  4. 恒成立、能成立和恰成立三类命题赏析【初级和中级辅导】
  5. 阿里P8架构师分享:我是如和从月薪8K成长到年薪50W的架构师?
  6. 【泛微E9功能点】考勤管理-应用设置
  7. 深入解构车载激光雷达
  8. 要想让955≥996≥007,提升效率是关键!
  9. 对位带操作的理解和应用
  10. !=会命中索引么_真是命中! 通过流量分析衡量成功