先看效果:
这是检测电路板断路的情况,整体图如下:
局部检测结果,放大如下:
前言
这篇记录如何在Linux环境上通过anaconda来安装飞浆的RT-DETR,并实现PCB板表面缺陷检测,性能刚刚的。
一、RT-DETR算法
最近PaddleDetection的develop分支中新出了RT-DETR的实时端到端目标检测框架,RT-DETR是第一个实时端到端目标检测器。通过高效的混合编码器,解耦尺度内交互和跨尺度融合来高效处理多尺度特征。此外,RT-DETR支持通过使用不同的解码器层来灵活调整推理速度,而不需要重新训练,这有助于实时目标检测器的实际应用。
二、安装步骤
1.安装PaddlePaddle
本文按照以下cmd文档来安装的:
https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.7/docs/tutorials/INSTALL_cn.md
代码如下(示例):
conda create -n paddle python=3.10
conda activate paddle
conda install paddlepaddle-gpu==2.6.1 cudatoolkit=11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge
cuda版本选择,可以从以下网址找到:
paddlepaddle+cuda
请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。
#在您的Python解释器中确认PaddlePaddle安装成功
python
Python 3.10.14 (main, May 6 2024, 19:42:50) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paddle
>>> paddle.utils.run_check()
Running verify PaddlePaddle program ...
I0520 10:31:50.053882 6689 program_interpreter.cc:212] New Executor is Running.
……
W0520 10:31:50.056286 6689 gpu_resources.cc:164] device: 0, cuDNN Version: 8.4.
I0520 10:31:50.895520 6689 interpreter_util.cc:624] Standalone Executor is Used.
PaddlePaddle works well on 1 GPU.
# 确认PaddlePaddle版本
python -c "import paddle; print(paddle.__version__)"
2.安装PaddleDetection
操作流程如下:
# 克隆PaddleDetection仓库
cd <path/to/clone/PaddleDetection>
git clone https://github.com/PaddlePaddle/PaddleDetection.git
# 安装其他依赖
cd PaddleDetection
pip install -r requirements.txt
# 编译安装paddledet
python setup.py install
# install完毕,会显示如下:
Using /home/wqt/anaconda3/envs/paddle/lib/python3.10/site-packages
Finished processing dependencies for paddledet==0.0.0
#验证paddledetection是否安装成功:
python ppdet/modeling/tests/test_architectures.py
测试通过后会提示如下信息:
.......
Ran 7 tests in 12.816s
OK
3.数据准备
本次数据集采用PKU-Market-PCB,该数据集用于印刷电路板(PCB)的瑕疵检测,提供了6种常见的PCB缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜)。 同时,该数据集提供了train_shots10,train_shots30用于小样本缺陷检测,感兴趣的可以通过更换数据集路径进行尝试。
数据集来源:https://robotics.pkusz.edu.cn/resources/dataset/
数据处理:
# 解压数据集(仅运行一次)
tar -xvf data/data185667/pcb.tar -C ./data/
# 组织数据目录
mkdir MyDataset
mkdir MyDataset/JPEGImages
#移动,可以改为cp
!mv data/pcb/images/* MyDataset/JPEGImages/
!mv data/pcb/pcb_cocoanno/* MyDataset/
4.模型选型
RT-DETR提供了四种模型进行选择,具体的模型选型可以根据自己数据集的情况选取精度与速度相适应的模型,本次采用RT-DETR-R101
3.1 找到配置文件
配置文件在PaddleDetection/configs/rtdetr/rtdetr_r101vd_6x_coco.yml,主要包含五个部分~~,为了方便更改,将其copy到根目录下~~
学习率训练轮数等超参数,因为官方是在4卡进行训练,因此在单卡情况下修改base_lr=0.0001/4 = 0.000025
此外,单步模型的保存太占空间,可以在/PaddleDetection/configs/runtime.yml中设置snapshot_epoch: 10,这样每10个循环就保存一次迭代的模型;
5.模型训练
训练100轮map为0.46,average FPS: 40
#运行命令行
python tools/train.py \
-c configs/rtdetr/rtdetr_r101vd_6x_coco.yml \
--use_vdl=True \
--vdl_log_dir=../work/ \
--eval
#运行过程显示,会先下载模型如下:
download INFO: Downloading ResNet101_vd_ssld_pretrained.pdparams from https://paddledet.bj.bcebos.com/models/pretrained/ResNet101_vd_ssld_pretrained.pdparams
#训练结果
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.460
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.908
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.387
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.367
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.467
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.412
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.135
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.546
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.600
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.367
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.606
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.563
[05/20 21:31:49] ppdet.engine INFO: Total sample number: 138, average FPS: 40.07899776115584
[05/20 21:31:49] ppdet.engine INFO: Best test bbox ap is 0.460.
[05/20 21:31:51] ppdet.utils.checkpoint INFO: Save checkpoint: output
总结下来,在该数据集上训练的时间为:大概1.5h不到。
6.模型测试
#运行命令行
python tools/infer.py \
-c configs/rtdetr/rtdetr_r101vd_6x_coco.yml \
-o weights=output/best_model \
--infer_img=MyDataset/JPEGImages/01_missing_hole_15.jpg \
--save_results=True
#结果显示:
W0520 22:16:06.763641 274477 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 8.9, Driver API Version: 12.2, Runtime API Version: 11.7
W0520 22:16:06.766463 274477 gpu_resources.cc:164] device: 0, cuDNN Version: 8.4.
[05/20 22:16:07] ppdet.utils.checkpoint INFO: Finish loading model weights: output/best_model.pdparams
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
[05/20 22:16:08] ppdet.metrics.metrics INFO: The bbox result is saved to bbox.json.
[05/20 22:16:08] ppdet.metrics.metrics INFO: The bbox result is saved to output/bbox.json and do not evaluate the mAP.
[05/20 22:16:08] ppdet.utils.download INFO: Downloading simfang.ttf from https://paddledet.bj.bcebos.com/simfang.ttf
[05/20 22:16:16] ppdet.engine INFO: Detection bbox results save in output/01_missing_hole_15.jpg
这是大图:
这是局部放大的图
总结
自此,基于Real-Time DETR的PCB板表面缺陷检测任务调试完成,但有关RT-DETR算法为什么如此流畅,里面的技巧在哪里,我们将进一步读原文,以了解内部原理。