• (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如下

    1. import json
    2. from collections import defaultdict
    3. import matplotlib.pyplot as plt
    4. %matplotlib inline
    5. with open("/home/aistudio/work/PCB_DATASET/Annotations/train.json") as f:
    6. data = json.load(f)
    7. imgs = {}
    8. for img in data['images']:
    9. imgs[img['id']] = {
    10. 'h': img['height'],
    11. 'w': img['width'],
    12. 'area': img['height'] * img['width'],
    13. }
    14. hw_ratios = []
    15. area_ratios = []
    16. label_count = defaultdict(int)
    17. for anno in data['annotations']:
    18. hw_ratios.append(anno['bbox'][3]/anno['bbox'][2])
    19. area_ratios.append(anno['area']/imgs[anno['image_id']]['area'])
    20. label_count[anno['category_id']] += 1
    21. #查看各个缺陷的分布情况(类别数是否均匀,如果不均匀可以考虑调整loss的计算方法)
    22. print( label_count, len(data['annotations']) / len(data['images']) )
    23. #查看锚框的长宽比,看看都是什么形状的
    24. plt.hist(hw_ratios, bins=100, range=[0, 2])
    25. plt.show()
    26. #看看锚框的大小(和原图大小的比值,看看是不是都是小物体)
    27. plt.hist(area_ratios, bins=100, range=[0, 0.005])
    28. 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. #(1)在对应目录下
    2. conda activate chenpaddle_cp310
    3. #(2)安装相关环境
    4. pip install -r requirements.txt
    5. pip install pycocotools

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

    (1)一下参考来自官网

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

    (2)配置参数

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

    1. metric: COCO # Label评价指标,coco IoU:0.5:0.95
    2. num_classes: 7 # 类别数量,coco类别比实际类别(voc类别)+1
    3. TrainDataset:
    4. !COCODataSet
    5. image_dir: images
    6. anno_path: Annotations/train.json
    7. dataset_dir: /home/chen/deep_data/pcb/PCB_DATASET_AI_STUDIO/PCB_DATASET
    8. data_fields: ['image', 'gt_bbox', 'gt_class']#, 'is_crowd'
    9. EvalDataset:
    10. !COCODataSet
    11. image_dir: images
    12. anno_path: Annotations/val.json
    13. dataset_dir: /home/chen/deep_data/pcb/PCB_DATASET_AI_STUDIO/PCB_DATASET
    14. TestDataset:
    15. !ImageFolder
    16. anno_path: Annotations/val.json
    17. use_gpu: true # 根据硬件选择是否使用GPU
    18. log_iter: 10 # 日志窗口的尺度
    19. save_dir: output/ # 模型输出文件夹
    20. snapshot_epoch: 1 # 生成快照的频率,即每1个周期生成一次
    21. epoch: 24 ### 训练周期:24
    22. LearningRate: ### 学习率:阶段学习率
    23. base_lr: 0.0025 # 起始学习率:0.0025
    24. schedulers:
    25. - !PiecewiseDecay ## 阶段学习率
    26. gamma: 0.1 # 每次学习率变化为原来的1/10
    27. milestones: [16, 22] # 总共进行两次学习率的降低
    28. - !LinearWarmup ## 慢启动,共执行200次迭代,学习率为初始学习率的0.1
    29. start_factor: 0.1
    30. steps: 200
    31. OptimizerBuilder: ### 优化方法:基于动量的SGD
    32. optimizer:
    33. momentum: 0.9
    34. type: Momentum
    35. regularizer:
    36. factor: 0.0001
    37. type: L2
    38. architecture: FasterRCNN # 总框架类型
    39. # 预训练模型
    40. pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams
    41. ## 检测模型的体系结构,包含骨干、支路、区域建议、BBox头和BBox头后处理
    42. FasterRCNN:
    43. backbone: ResNet # 主干网络:ResNet
    44. neck: FPN # 特征金字塔网络
    45. rpn_head: RPNHead # 区域建议头:基于FPN的RPNHead
    46. bbox_head: BBoxHead # BBox头:BBoxHead
    47. # post process
    48. bbox_post_process: BBoxPostProcess # BBox后处理器
    49. ResNet:
    50. # index 0 stands for res2
    51. depth: 50 # 深度50,即ResNet50
    52. norm_type: bn # 正则化类型BN,基本上是唯一选择
    53. freeze_at: 0 # 冻结部分,ResNet的前两层
    54. return_idx: [0,1,2,3] # 提取特征的位置,即用于FPN的特征,其实index0
    55. num_stages: 4
    56. FPN:
    57. out_channel: 256 # FPN通道数:256
    58. RPNHead:
    59. anchor_generator: ## Anchor生成器
    60. aspect_ratios: [0.5, 1.0, 2.0] # Anchor的比例1:2,1:1,2:1
    61. anchor_sizes: [[32], [64], [128], [256], [512]] # Anchor的尺度
    62. strides: [4, 8, 16, 32, 64] # Anchor的步长
    63. rpn_target_assign: ## RPN设置
    64. batch_size_per_im: 256 # RPN采样数量: 256
    65. fg_fraction: 0.5 # 正样本数量: 256*0.5=128
    66. negative_overlap: 0.3 # 负样本IoU<0.3
    67. positive_overlap: 0.7 # 正阳IoU>0.7
    68. use_random: True
    69. train_proposal: ## 训练建议框设置
    70. min_size: 0.0
    71. nms_thresh: 0.7 # 训练阶段nms阈值
    72. pre_nms_top_n: 2000 # 第一阶段nms数量
    73. post_nms_top_n: 1000 # 第二阶段nms数量
    74. topk_after_collect: True
    75. test_proposal: ## 测试建议框设置
    76. min_size: 0.0
    77. nms_thresh: 0.7 # 测试阶段nms阈值
    78. pre_nms_top_n: 1000 # 第一阶段nms数量
    79. post_nms_top_n: 1000 # 第二阶段nms数量
    80. BBoxHead: ## BBox头
    81. head: TwoFCHead # 两个FC头
    82. roi_extractor:
    83. resolution: 7 # RoIPooling特征层的尺度7×7
    84. sampling_ratio: 0
    85. aligned: True # 启用RoIAlign
    86. bbox_assigner: BBoxAssigner
    87. BBoxAssigner:
    88. batch_size_per_im: 512 # batch数量:512
    89. bg_thresh: 0.5 # 背景阈值<0.5
    90. fg_thresh: 0.5 # 前景阈值>0.5
    91. fg_fraction: 0.25
    92. use_random: True
    93. TwoFCHead:
    94. out_channel: 1024 # 全连接层特征维度(后面紧跟分类和回归层):1024
    95. BBoxPostProcess:
    96. decode: RCNNBox
    97. nms:
    98. name: MultiClassNMS
    99. keep_top_k: 100
    100. score_threshold: 0.05
    101. nms_threshold: 0.5
    102. worker_num: 2
    103. TrainReader:
    104. sample_transforms: # 数据预处理
    105. - Decode: {}
    106. - RandomResize: {target_size: [[640, 1333], [672, 1333], [704, 1333], [736, 1333], [768, 1333], [800, 1333]], interp: 2, keep_ratio: True}
    107. - RandomFlip: {prob: 0.5}
    108. - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
    109. - Permute: {}
    110. batch_transforms:
    111. - PadBatch: {pad_to_stride: 32}
    112. batch_size: 1 # 每批大尺度
    113. shuffle: true # 是否随机
    114. drop_last: true # 最后一个batch不足batch_sizes时,是否将多余数据进行丢弃
    115. EvalReader:
    116. sample_transforms:
    117. - Decode: {}
    118. - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
    119. - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
    120. - Permute: {}
    121. batch_transforms:
    122. - PadBatch: {pad_to_stride: 32}
    123. batch_size: 1
    124. shuffle: false
    125. drop_last: false
    126. drop_empty: false
    127. TestReader:
    128. sample_transforms:
    129. - Decode: {}
    130. - Resize: {interp: 2, target_size: [800, 1333], keep_ratio: True}
    131. - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
    132. - Permute: {}
    133. batch_transforms:
    134. - PadBatch: {pad_to_stride: 32}
    135. batch_size: 1
    136. shuffle: false
    137. drop_last: false

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

    1. CUDA_VISIBLE_DEVICES=0
    2. 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
    3. 或者
    4. 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
    5. 或者
    6. 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内容如下

    1. _BASE_: [
    2. './_base_/pcb_detection.yml',
    3. '../../runtime.yml',
    4. '../_base_/optimizer_80e.yml',
    5. '../_base_/ppyoloe_plus_crn.yml',
    6. '../_base_/ppyoloe_plus_reader.yml',
    7. ]
    8. log_iter: 100
    9. snapshot_epoch: 5
    10. weights: output/ppyoloe_plus_crn_m_80e_coco_pretrained_pcb/model_final
    11. pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/ppyoloe_plus_crn_m_80e_coco.pdparams
    12. depth_mult: 0.67
    13. width_mult: 0.75

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

    1. metric: COCO
    2. num_classes: 6
    3. TrainDataset:
    4. !COCODataSet
    5. image_dir: images
    6. anno_path: pcb_cocoanno/train.json
    7. dataset_dir: dataset/PCB_coco/
    8. data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
    9. EvalDataset:
    10. !COCODataSet
    11. image_dir: images
    12. anno_path: pcb_cocoanno/val.json
    13. dataset_dir: dataset/PCB_coco/
    14. TestDataset:
    15. !ImageFolder
    16. anno_path: pcb_cocoanno/val.json # also support txt (like VOC's label_list.txt)
    17. dataset_dir: dataset/PCB_coco/ # if set, anno_path will be 'dataset_dir/anno_path'

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

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

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

    1. epoch: 80
    2. LearningRate:
    3. base_lr: 0.001
    4. schedulers:
    5. - !CosineDecay
    6. max_epochs: 96
    7. - !LinearWarmup
    8. start_factor: 0.
    9. epochs: 5
    10. OptimizerBuilder:
    11. optimizer:
    12. momentum: 0.9
    13. type: Momentum
    14. regularizer:
    15. factor: 0.0005
    16. type: L2

    (6)ppyoloe_plus_crn.yml

    1. architecture: YOLOv3
    2. norm_type: sync_bn
    3. use_ema: true
    4. ema_decay: 0.9998
    5. ema_black_list: ['proj_conv.weight']
    6. custom_black_list: ['reduce_mean']
    7. YOLOv3:
    8. backbone: CSPResNet
    9. neck: CustomCSPPAN
    10. yolo_head: PPYOLOEHead
    11. post_process: ~
    12. CSPResNet:
    13. layers: [3, 6, 6, 3]
    14. channels: [64, 128, 256, 512, 1024]
    15. return_idx: [1, 2, 3]
    16. use_large_stem: True
    17. use_alpha: True
    18. CustomCSPPAN:
    19. out_channels: [768, 384, 192]
    20. stage_num: 1
    21. block_num: 3
    22. act: 'swish'
    23. spp: true
    24. PPYOLOEHead:
    25. fpn_strides: [32, 16, 8]
    26. grid_cell_scale: 5.0
    27. grid_cell_offset: 0.5
    28. static_assigner_epoch: 30
    29. use_varifocal_loss: True
    30. loss_weight: {class: 1.0, iou: 2.5, dfl: 0.5}
    31. static_assigner:
    32. name: ATSSAssigner
    33. topk: 9
    34. assigner:
    35. name: TaskAlignedAssigner
    36. topk: 13
    37. alpha: 1.0
    38. beta: 6.0
    39. nms:
    40. name: MultiClassNMS
    41. nms_top_k: 1000
    42. keep_top_k: 300
    43. score_threshold: 0.01
    44. nms_threshold: 0.7

    (7)ppyoloe_plus_crn.yml

    1. worker_num: 4
    2. eval_height: &eval_height 640
    3. eval_width: &eval_width 640
    4. eval_size: &eval_size [*eval_height, *eval_width]
    5. TrainReader:
    6. sample_transforms:
    7. - Decode: {}
    8. - RandomDistort: {}
    9. - RandomExpand: {fill_value: [123.675, 116.28, 103.53]}
    10. - RandomCrop: {}
    11. - RandomFlip: {}
    12. batch_transforms:
    13. - 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}
    14. - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
    15. - Permute: {}
    16. - PadGT: {}
    17. batch_size: 8
    18. shuffle: true
    19. drop_last: true
    20. use_shared_memory: true
    21. collate_batch: true
    22. EvalReader:
    23. sample_transforms:
    24. - Decode: {}
    25. - Resize: {target_size: *eval_size, keep_ratio: False, interp: 2}
    26. - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
    27. - Permute: {}
    28. batch_size: 2
    29. TestReader:
    30. inputs_def:
    31. image_shape: [3, *eval_height, *eval_width]
    32. sample_transforms:
    33. - Decode: {}
    34. - Resize: {target_size: *eval_size, keep_ratio: False, interp: 2}
    35. - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
    36. - Permute: {}
    37. batch_size: 1

  • 相关阅读:
    【Java-框架-SpringMVC】(01) SpringMVC框架的简单创建与使用,快速上手 - 简易版
    CnosDB 签约京清能源,助力分布式光伏发电解决监测系统难题。
    基于springboot+vue的问卷调查系统
    用C语言解决三个整数比大小,x,y,z三个整数求最小整数,从键盘上输入3个不同的整数×,y,Z,请设计一个算法找出其中最小的数,并画出流程图。
    委派构造函数
    Spring IOC
    在kubernetes里使用AppArmor限制容器对资源的访问
    Qemu kvm_qemu详细教程
    【linux学习】Vim编辑器
    算法导论23章最小生成树习题—23.2练习
  • 原文地址:https://blog.csdn.net/chencaw/article/details/127945630