(4)paddle---PCB检测的例子
1、主要參考
(1)大佬教程
基于PaddleDetection的PCB瑕疵檢測_AI Studio的博客-CSDN博客
(2)blibli視頻
253-14_PCB電路板缺陷檢測_項(xiàng)目配置文件_dec_嗶哩嗶哩_bilibili
(3)coco數(shù)據(jù)集說明
『深度應(yīng)用』目標(biāo)檢測coco數(shù)據(jù)集格式介紹 - 騰訊云開發(fā)者社區(qū)-騰訊云
2、模型的下載
(1)下載地址
北京大學(xué)智能機(jī)器人開放實(shí)驗(yàn)室
?印刷電路板(PCB)瑕疵數(shù)據(jù)集。它是一個(gè)公共合成PCB數(shù)據(jù)集,包含1386張圖像,具有6種缺陷(漏孔、鼠咬、開路、短路、雜散、雜銅),用于圖像檢測、分類和配準(zhǔn)任務(wù)
看了一下,上面地址下載的數(shù)據(jù)集,是voc格式的
(2)根據(jù)百度教程來的話可以通過AIstudio直接下載
3、模型的特征查看
(1)查看各個(gè)缺陷的分布情況(類別數(shù)是否均勻,如果不均勻可以考慮調(diào)整loss的計(jì)算方法)
(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#查看各個(gè)缺陷的分布情況(類別數(shù)是否均勻,如果不均勻可以考慮調(diào)整loss的計(jì)算方法) 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)各個(gè)缺陷的分布和每張圖的缺陷數(shù)如下
#查看各個(gè)缺陷的分布情況(類別數(shù)是否均勻,如果不均勻可以考慮調(diào)整loss的計(jì)算方法)
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項(xiàng)目
4.1 下載
(1)paddle官網(wǎng)
飛槳PaddlePaddle-源于產(chǎn)業(yè)實(shí)踐的開源深度學(xué)習(xí)平臺
(2)下載指定PaddleDetection
?(3)對應(yīng)的github地址如下
https://github.com/PaddlePaddle/PaddleDetection
4.2安裝相關(guān)環(huán)境
#(1)在對應(yīng)目錄下 conda activate chenpaddle_cp310#(2)安裝相關(guān)環(huán)境 pip install -r requirements.txt pip install pycocotools5、基于faster-rcnn的PCB缺陷檢測
(1)一下參考來自官網(wǎng)
基于PaddleDetection的PCB瑕疵檢測-FasterRCNN - 飛槳AI Studio
(2)配置參數(shù)
在檢測目錄下創(chuàng)建chenfastrcnn?目錄,然后創(chuàng)建文件pcb_faster_rcnn_r50_fpn_3x_coco.yml內(nèi)容如下?
metric: COCO # Label評價(jià)指標(biāo),coco IoU:0.5:0.95 num_classes: 7 # 類別數(shù)量,coco類別比實(shí)際類別(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 # 根據(jù)硬件選擇是否使用GPU log_iter: 10 # 日志窗口的尺度 save_dir: output/ # 模型輸出文件夾 snapshot_epoch: 1 # 生成快照的頻率,即每1個(gè)周期生成一次epoch: 24 ### 訓(xùn)練周期:24LearningRate: ### 學(xué)習(xí)率:階段學(xué)習(xí)率base_lr: 0.0025 # 起始學(xué)習(xí)率:0.0025 schedulers:- !PiecewiseDecay ## 階段學(xué)習(xí)率gamma: 0.1 # 每次學(xué)習(xí)率變化為原來的1/10milestones: [16, 22] # 總共進(jìn)行兩次學(xué)習(xí)率的降低- !LinearWarmup ## 慢啟動,共執(zhí)行200次迭代,學(xué)習(xí)率為初始學(xué)習(xí)率的0.1start_factor: 0.1steps: 200OptimizerBuilder: ### 優(yōu)化方法:基于動量的SGDoptimizer:momentum: 0.9type: Momentumregularizer:factor: 0.0001type: L2architecture: FasterRCNN # 總框架類型 # 預(yù)訓(xùn)練模型 pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_cos_pretrained.pdparams## 檢測模型的體系結(jié)構(gòu),包含骨干、支路、區(qū)域建議、BBox頭和BBox頭后處理 FasterRCNN:backbone: ResNet # 主干網(wǎng)絡(luò):ResNetneck: FPN # 特征金字塔網(wǎng)絡(luò)rpn_head: RPNHead # 區(qū)域建議頭:基于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 # 凍結(jié)部分,ResNet的前兩層return_idx: [0,1,2,3] # 提取特征的位置,即用于FPN的特征,其實(shí)index為0num_stages: 4FPN:out_channel: 256 # FPN通道數(shù):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設(shè)置batch_size_per_im: 256 # RPN采樣數(shù)量: 256 fg_fraction: 0.5 # 正樣本數(shù)量: 256*0.5=128 negative_overlap: 0.3 # 負(fù)樣本IoU<0.3 positive_overlap: 0.7 # 正陽IoU>0.7use_random: Truetrain_proposal: ## 訓(xùn)練建議框設(shè)置min_size: 0.0 nms_thresh: 0.7 # 訓(xùn)練階段nms閾值pre_nms_top_n: 2000 # 第一階段nms數(shù)量post_nms_top_n: 1000 # 第二階段nms數(shù)量topk_after_collect: Truetest_proposal: ## 測試建議框設(shè)置min_size: 0.0nms_thresh: 0.7 # 測試階段nms閾值 pre_nms_top_n: 1000 # 第一階段nms數(shù)量post_nms_top_n: 1000 # 第二階段nms數(shù)量BBoxHead: ## BBox頭head: TwoFCHead # 兩個(gè)FC頭roi_extractor:resolution: 7 # RoIPooling特征層的尺度7×7sampling_ratio: 0aligned: True # 啟用RoIAlignbbox_assigner: BBoxAssignerBBoxAssigner:batch_size_per_im: 512 # batch數(shù)量: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: # 數(shù)據(jù)預(yù)處理- 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 # 是否隨機(jī)drop_last: true # 最后一個(gè)batch不足batch_sizes時(shí),是否將多余數(shù)據(jù)進(jìn)行丟棄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目錄下的終端中執(zhí)行如下命令
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)訓(xùn)練得到的模型在output下面
?(4)測試以下圖片,以下命令還有問題,會報(bào)錯(cuò)
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官網(wǎng)
基于PP-YOLOE+的PCB缺陷檢測 - 飛槳AI Studio基于PP-YOLOE+實(shí)現(xiàn)的PCB缺陷檢測方案全流程實(shí)戰(zhàn),覆蓋訓(xùn)練、調(diào)優(yōu)、部署等 - 飛槳AI Studiohttps://aistudio.baidu.com/aistudio/projectdetail/4670836
黑盒教程真有意思 :(
(2)其中ppyoloe_plus_crn_m_80e_obj365_pretrained_pcb.yml內(nèi)容如下
_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',文件內(nèi)容如下
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',內(nèi)容如下
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總結(jié)
以上是生活随笔為你收集整理的(4)paddle---PCB检测的例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32F429的DSP教程】第47
- 下一篇: Mendeley中正确设置GB/T 77