自动检查和缺陷检测系统使用 AI 来检查零部件的故障和缺陷。通过这种方法,制造厂能够自动检测成品表面的缺陷,该方法广泛应用于金属、半导体晶圆和隐形眼镜等制造领域。
本项目为满足实际工业部署和实时性需求选择PP-PicoDet模型,降低了检测硬件的配置需求,实现了从图像中识别出钢铁表面的缺陷位置,并给出锚点框的坐标,同时对不同的缺陷进行分类的功能。
本数据集来自NEU表面缺陷检测数据集,收集了6种典型的热轧带钢表面缺陷,即氧化铁皮压入(RS)、斑块(Pa)、开裂(Cr)、点蚀(PS)、夹杂(In)和划痕(Sc)。
数据集来源:钢铁缺陷检测挑战赛-训练集数据
钢铁缺陷检测挑战赛-测试集数据
方案选择PP-PicoDet轻量化模型,主要看中PP-PicoDet体积小、速度快、精度较高的优势,非常适合本项目的部署环境和性能要求。同时,飞桨提供的预训练模型也可以最大程度上提升模型的收敛速度和精度。
paddleDetection 已更新至2.4 版本,picodet增强版 将 backbone 从 ESnet 换成了 LCNet,将 neck 中的 CSP module 换成了 LCNet module。CSP-PAN
环境要求:
PaddlePaddle = 2.4.0
Python = 3.7.4
PaddleDetection = 2.4 (PaddleDetection官方说明)
#克隆PaddleDetection仓库
# 只有第一次运行空项目时需要执行
!git clone https://github.com/PaddlePaddle/PaddleDetection.git
#配置目标检测路径 (进入到PaddleDetection工作目录)#没加~第二次运行找不到
%cd ~/PaddleDetection/
#安装Python依赖库。Python依赖库在requirements.txt中给出。(本地)
!pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
!pip install paddledet>=2.2.2 -i https://mirror.baidu.com/pypi/simple
# 编译安装paddledet
# 每次启动项目后都需要先执行
!python setup.py install
#!python ppdet/modeling/tests/test_architectures.py
#不加#运行测试后单卡训练运行会报错,去掉该段程序也会报错(该段代码需带#运行)
# unzip 解压文件-d创建解压后文件存放目录,并rm移除多余的目录 断网再次运行需删除PaddleDetection/dataset/steel这个文件夹
! unzip /home/aistudio/data/data105746/train.zip -d /home/aistudio/PaddleDetection/dataset/steel
!rm -r /home/aistudio/data/steel/__MACOSX
! unzip /home/aistudio/data/data105747/test.zip -d /home/aistudio/PaddleDetection/dataset/steel
!rm -r /home/aistudio/data/steel/__MACOSX
# 安装paddlex 用于拆分数据集
# 升级pip
!pip install --upgrade pip -i https://mirror.baidu.com/pypi/simple
!pip install "paddlex>2.0.0" -i https://mirror.baidu.com/pypi/simple
#/home/aistudio/data/steel/train/文件夹下的ANNOTATIONS和IMAGES---移动变为Annotations和JPEGImages文件夹
!mv /home/aistudio/PaddleDetection/dataset/steel/train/ANNOTATIONS /home/aistudio/PaddleDetection/dataset/steel/train/Annotations
!mv /home/aistudio/PaddleDetection/dataset/steel/train/IMAGES /home/aistudio/PaddleDetection/dataset/steel/train/JPEGImages
#使用paddleX拆分数据集(可参考5.3处链接)
!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/PaddleDetection/dataset/steel/train --val_value 0.2 --test_value 0.1
0.7的训练集,0.2的验证集,0.1的测试集,Train数量为:980、Eval 数量为:280,测试的数量为:140
2022-12-11 13:22:30 [INFO] Dataset split starts…
2022-12-11 13:22:30 [INFO] Dataset split done.
2022-12-11 13:22:30 [INFO] Train samples: 980
2022-12-11 13:22:30 [INFO] Eval samples: 280
2022-12-11 13:22:30 [INFO] Test samples: 140
2022-12-11 13:22:30 [INFO] Split files saved in /home/aistudio/PaddleDetection/dataset/steel/train
# 临时环境安装
!pip install pycocotools -i https://mirror.baidu.com/pypi/simple
!pip install lap -i https://mirror.baidu.com/pypi/simple
数据格式转换,数据拆分 下面是Paddle提供的两个处理数据的命令说明文档。 PadlleX:
https://github.com/PaddlePaddle/PaddleX/tree/develop/docs/data
PaddleDetection: https://github.com/PaddlePaddle/PaddleDetection/blob/release%2F2.3/docs/tutorials/PrepareDataSet.md
%cd /home/aistudio/PaddleDetection/
#转换train
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/PaddleDetection/dataset/steel/train/ \
--voc_anno_list /home/aistudio/PaddleDetection/dataset/steel/train/train_list.txt \
--voc_label_list /home/aistudio/PaddleDetection/dataset/steel/train/labels.txt \
--voc_out_name /home/aistudio/PaddleDetection/dataset/steel/train/voc_train.json
#/home/aistudio/PaddleDetection/dataset/steel/train
#转换eval
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/PaddleDetection/dataset/steel/train/ \
--voc_anno_list /home/aistudio/PaddleDetection/dataset/steel/train/val_list.txt \
--voc_label_list /home/aistudio/PaddleDetection/dataset/steel/train/labels.txt \
--voc_out_name /home/aistudio/PaddleDetection/dataset/steel/train/voc_val.json
#转换test
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/PaddleDetection/dataset/steel/train/ \
--voc_anno_list /home/aistudio/PaddleDetection/dataset/steel/train/test_list.txt \
--voc_label_list /home/aistudio/PaddleDetection/dataset/steel/train/labels.txt \
--voc_out_name /home/aistudio/PaddleDetection/dataset/steel/train/voc_test.json
!rm -r /home/aistudio/PaddleDetection/dataset/steel/train/Annotations/*
!mv /home/aistudio/PaddleDetection/dataset/steel/train/*.json /home/aistudio/PaddleDetection/dataset/steel/train/Annotations/
通常一个项目模型完整的落地流程可以总结为如下6个步骤,其中需要根据评估和预测的结果,对模型进行反复的优化和再训练:
也可以参考 PaddleDetecion 提供的 快速上手指南。另外,在实际项目的推进过程中,可以根据实际情况决定是否采用模型压缩的相关手段。
PicoDet-s-416 的配置文件,由 1 个入口配置文件,和5个相关联的子配置文件组成。入口配置文件位于:
PaddleDetection/configs/picodet/picodet_s_416_coco_lcnet.yml
相关的 5 个子配置文件为:
‘…/datasets/coco_detection.yml’,
‘…/runtime.yml’,
‘base/picodet_v2.yml’,
‘base/optimizer_300e.yml’,
‘base/picodet_416_reader.yml’,
接下来我们从子配置文件开始,依次说明每个配置文件的用途和需要修改的部分。
入口配置文件位于:PaddleDetection/configs/datasets/coco_detection.yml
设置数据集的配置信息。根据本案例的情况,请按照如下内容进行修改 num_classes、image_dir、anno_path、dataset_dir:
metric: COCO
num_classes: 6 #数据集有6个分类
TrainDataset:
!COCODataSet
image_dir: JPEGImages
anno_path: Annotations/voc_train.json
dataset_dir: dataset/steel/train
data_fields: [‘image’, ‘gt_bbox’, ‘gt_class’, ‘is_crowd’]
EvalDataset:
!COCODataSet
image_dir: JPEGImages
anno_path: Annotations/voc_val.json
dataset_dir: dataset/steel/train
TestDataset:
!ImageFolder
image_dir: JPEGImages
anno_path: Annotations/voc_test.json # Also support txt (like VOC’s label_list.txt)
dataset_dir: dataset/steel/train # If set, anno_path will be ‘dataset_dir/anno_path’
因本案例是检测钢铁表面缺陷的,因此num_classes有6个分类。
这是控制模型训练的主配置文件位于:PaddleDetection/configs/picodet/picodet_s_416_coco_lcnet.yml,其中设置的参数会覆盖掉子配置文件中的相关参数。这也是为什么我们6.1.3子配置文件中基本保留了默认配置而不做修改,原因就在于,在主配置文件内集中修改参数,可以更方便的修改训练参数,避免要修改的参数过于分散。为缩短实验时间epoch: 30 和snapshot_epoch: 1
按如下内容修改主配置文件的内容:
BASE: [
‘…/datasets/coco_detection.yml’,
‘…/runtime.yml’,
‘base/picodet_v2.yml’,
‘base/optimizer_300e.yml’,
‘base/picodet_416_reader.yml’,
]
pretrain_weights: https://paddledet.bj.bcebos.com/models/picodet_s_416_coco_lcnet.pdparams
weights: output/picodet_s_416_coco_lcnet/model_final
find_unused_parameters: True
use_ema: true
use_gpu: true
epoch: 30
snapshot_epoch: 1
LCNet:
scale: 0.75
feature_maps: [3, 4, 5]
LCPAN:
out_channels: 96
PicoHeadV2:
conv_feat:
name: PicoFeat
feat_in: 96
feat_out: 96
num_convs: 2
num_fpn_stride: 4
norm_type: bn
share_cls_reg: True
use_se: True
feat_in_chan: 96
TrainReader:
batch_size: 8
LearningRate:
base_lr: 0.06
schedulers:
Batch Size指模型在训练过程中,前向计算一次(即为一个step)所用到的样本数量
如若使用多卡训练, batch_size会均分到各张卡上(因此需要让batch size整除卡数)
Batch Size跟机器的显存/内存高度相关,batch_size越高,所消耗的显存/内存就越高
step与epoch的关系:1个epoch由多个step组成,例如训练样本有800张图像,train_batch_size为8, 那么每个epoch都要完整用这800张图片训一次模型,而每个epoch总共包含800//8即100个step
运行时配置文件 runtime.yml 用于设置运行时的参数,主要包括:
这里我们暂且保留默认值,不做修改即可。
模型网络参数 picodet_v2.yml
用于设置模型的网络参数,也包括预训练集的加载,这里为了可以快速开始实际训练,我们也暂时保留默认的参数,不做修改。
训练优化参数 optimizer_300e.yml
主要说明了学习率和优化器的配置。其中比较重要的参数是训练轮数 epoch 和 学习率 base_lr。同样,我们暂时不在这里修改,稍后再设置。
# GPU 单卡训练
%cd ~/PaddleDetection
!export CUDA_VISIBLE_DEVICES=0 # windows和Mac下不需要执行该命令
!python tools/train.py -c configs/picodet/picodet_s_416_coco_lcnet.yml --use_vdl=true --vdl_log_dir=vdl_dir/scalar --eval
# GPU单卡评估
!python tools/eval.py -c configs/picodet/picodet_s_416_coco_lcnet.yml -o weights=output/picodet_s_416_coco_lcnet/model_final.pdparams
我们来看一下 PaddleDetection 模型评估结果中的指标各自代表什么意思。
模型预测也很简单,一行代码搞定,其中最常用的参数有:
–output_dir: 保存检测结果的文件夹,默认保存在output文件夹。
–draw_threshold: 可视化时分数的阈值,默认大于0.5的box会显示出来。
–save_txt: 将图片的预测结果保存到文本文件中,与预测结果图片在同一文件夹下。
#模型预测
!python tools/infer.py -c configs/picodet/picodet_s_416_coco_lcnet.yml --infer_img=dataset/steel/test/IMAGES/1693.jpg -o weight=output/picodet_s_416_coco_lcnet/model_final.pdparams
在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际的工业部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。 导出后的模型会保存在:
output_inference/picodet_s_416_coco_lcnet/
包含如下文件:
infer_cfg.yml
model.pdiparams
model.pdiparams.info
model.pdmodel
导出后的文件,将用于后续的模型部署。
# 导出模型
!python tools/export_model.py -c configs/picodet/picodet_s_416_coco_lcnet.yml -o weight=output/picodet_s_416_coco_lcnet/model_final.pdparams
!python deploy/python/infer.py --model_dir=output_inference/picodet_s_416_coco_lcnet\
--image_file=/home/aistudio/PaddleDetection/dataset/steel/test/IMAGES/1403.jpg\
--device=GPU
import cv2
import matplotlib.pyplot as plt
import numpy as np
image = cv2.imread('output/1693.jpg')
plt.figure()
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
可视化—设置logdir–选择PaddleDetection/vdl_dir文件夹—启动VisualDL服务
本次项目的实践,从选题、确定数据集、选择模型、训练、评估、预测到导出模型,实现模型的可视化,是一次难得的全流程项目体验,感谢飞桨,提供的平台和算力,感谢高睿大佬aistudioID(TowerNet)对此次任务的耐心指导。
最后欢迎大家fork指导我的项目:基于PP-PicoDet的钢铁缺陷检测
参考文献
https://aistudio.baidu.com/aistudio/projectdetail/4031589?contributionType=1
https://aistudio.baidu.com/aistudio/projectdetail/3344390?contributionType=1
https://aistudio.baidu.com/aistudio/projectdetail/3151246?channelType=0&channel=0
https://aistudio.baidu.com/aistudio/projectdetail/3846170?channelType=0&channel=0
https://aistudio.baidu.com/aistudio/projectdetail/4670836?channelType=0&channel=0
https://aistudio.baidu.com/aistudio/projectdetail/1885319?channelType=0&channel=0
https://www.guyuehome.com/37172