(4)paddle---PCB检测的例子
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检测的例子相关推荐
- 工程师必看:常见的PCB检测方法有哪些?
PCB 检测,是 PCB 生产过程中极其重要的步骤,是必不可少的生产流程. 所谓 PCB 检测,就是检验 PCB 设计的合理性.测试其在生产过程中可能出现的问题或缺陷,确保产品的功能性和外观,提高最终 ...
- Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子
Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子 我们从github找到一个用fast-rcnn训练模型用于目标物体检测的例子,文中是实现检测扑克牌的 ...
- pcb成型板aoi检测_AOI在PCB检测中的应用
描述 印制电路板(简称PCB)是组装电子零件用的基板,PCB板的制造品质直接影响电子产品的可靠性.随着电子组装向更高密度.更小尺寸的PCB混合技术的纵深发展,为减少进入下步工序的缺陷电路板的数量,对P ...
- 【一键检测】这么高效的PCB检测工具,早点知道就好了
[一键检测]这么高效的PCB检测工具,早点知道就好了 高效检测PCB,打板钱排除设计问题,顺利打板量产. 国内首款免费PCB可制造性可装配分析软件,分享如何利用该款工具高效完成工作.和30万+工程师小 ...
- 金鉴实验室 PCBA切片分析 PCB检测
目的:电子元器件表面及内部缺陷检查及SMT制程改善&验证. 适用范围: 适用于电子元器件结构剖析,PCBA焊接缺陷,焊点上锡形态及缺陷检测等. 使用仪器:精密切割机,镶埋机,研磨及抛光机,金相 ...
- opencv联合dlib人脸检测例子二(加快检测)
本篇博客是在opencv联合dlib人脸检测例子的基础上改进了下,加快检测流程 观察了下,opencv利用haar级联分类器检测人脸区域的速度要稍快于dlib的frontal_face_detecto ...
- 论文研究 | 基于机器视觉的 PCB 缺陷检测算法研究现状及展望
前面分享了机器视觉在汽车行业与交通行业的应用,其实机器视觉在工业上的应用是最广泛也是最具挑战性的,其中PCB板缺陷检测一直是机器视觉待攻克的难题.印刷电路板(PCB)是电子零件的基板,需求量极大,承载 ...
- 分享||PCB线路板检测最常用的七种方法 2021-09-28
检测pcb板的目的是为了找出pcb板缺陷并进行修复,确保线路板的生产质量,提高产品合格率.目前pcb板检测方法可分为两大类:电气测试方法和视觉测试方法.今天小编和大家分享7种常用的pcb检测方法,具体 ...
- 基于OPENCV和图像减法的PCB缺陷检测
基于OPENCV和图像减法的PCB缺陷检测 原文地址:PCB defect detection USING OPENCV with image subtraction method Abstract ...
最新文章
- 【ORACLE技术嘉年华PPT】MySQL压力测试经验
- 学习网络请求返回json对应的model
- php onmouse,html在鼠标按钮在元素上按下时触发的事件属性onmousedown
- JMS Java消息服务(Java Message Service)
- Java笔记:与系统交互、系统相关的类,Object类
- Jquery插件(一) webupload上传插件
- matlab迭代次数,怎么知道程序中的迭代次数呢
- xiao77论坛php,论坛
- MySQL_数据库表记录的操作
- 平面/UI设计师社区交流网站集设|给你的作品多一个展示机会
- Jersey框架入门学习
- layui表格中显示内容换行
- php微信商家转账到零钱 发起商家转账API
- KernelBase.dll中有未经处理的异常,求助大神!!!
- scrollIntoView 滚不动
- 王者荣耀是如何从C++代码变到游戏的?
- PV操作经典例题——哲学家进餐问题
- Webex Player 安装文件,解决了不能播放问题,win7也能使用
- QQ2018手机版 v7.9.0
- 在线音乐付费用户达5600万再创新纪录、付费率破9%,腾讯音乐娱乐集团Q4及全年财报多项业绩突破增长