日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(4)paddle---PCB检测的例子

發布時間:2024/1/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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检测的例子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。