在最近的工作中,我遇到了一个需要使用深度学习分割来检测缺陷的项目。起初,使用MRCNN算法,但在操作过程中发现,由于算法框架太旧,在构建环境时会遇到各种奇怪的问题,所以放弃并转向百度Paddle的PaddleSeg分割算法。该笔记主要用于记录从施工环境到运行结果的整个过程和遇到的一些坑。
1、背景及硬件条件:
培训内容:汽车弹簧检测附铜缺陷检测;
训练环境:单卡GTX3060 12G CUDA11.2 CUDNN8.X Win10;
训练算法:基础PaddlePaddle的PaddleSeg算法;
数据:附铜照片(1024*处理后约91张,分为70个训练集,10个测试集,11个验证集;使用labelme标注完成后操作paddleseg数据集制作中的脚本,详见教程。
2、环境搭建
PaddleSeg以百度飞浆为基础PaddlePaddle框架分割算法,由于算法相对较新,更新和维护更多,在环境建设中遇到的问题并不多。首先在PaddleSeg 的Github主页(https://github.com/PaddlePaddle/PaddleSeg)下载PaddleSeg代码下来,然后cd在文件夹中执行一个pip下载所需的环境包。
这里需要注意的一点是下载paddlepaddle包的时候一定要去paddle去官网找对应cuda版本的paddlepaddle,不要直接用pip的版本!例如,项目环境是CUDA11.2.你需要去官网找到相应版本相应版本Paddle版本,然后中的内容复制粘贴到操作命令符下载。在这里paddle版本2.2.2.post112,的postxxx指的是对应的CUDA这里使用的版本是11.2所以是post112。如果不下载正确版本,后续启动训练时报也会找不到类似的cudartXX.dll这里要特别注意这样的错误。
至此,PaddleSeg环境建设基本完成,数据可以准备。
3、 标记和准备数据集
PaddleSeg支持标记精灵和labelme这里使用的分割标记labelme标记和安装数据labelme:
命令符直接操作labelme可启动标注软件:
具体的标记过程不会重复,但需要注意的是,标记需要相对非常准确,否则会影响以下模型的结果。
将标注结果 json在同一文件夹下放置文件和原始图像数据docs/data/transform.md教程,在cmd运行以下脚本进行数据转换。
其中,<PATH/TO/LABEL_JSON_FILE>为图片以及LabelMe产出的json文件所在文件夹的目录,同时也是转换后的标注集所在文件夹的目录,完成该步骤后数据集目录如下。
转换完成后,数据文件结构如下:
最后一步是将数据集分为训练集、验证集和测试集docs/data/data_prepare.md数据集按6:2:2的比例划分,生成训练所需的教程txt文档。
到目前为止,数据准备工作已经完成。
4、模型训练
Paddle框架架训练模型中,可以通过修改配置文件直接参考。由于数据背景相对简单,缺陷尺寸不是很小,参考PaddleSeg 工业质业质检配置文件采用DeeplabV3P算法,BackBone使用了ResNet50_vd,loss值使用了dice loss,具体可参照config文件夹中的配置文件。需要注意的是,yml文档中的配置class_num它包含背景类,因此如果数据需要预测的类型是n, class_num = n 1。需要注意的是,yml文档中的配置class_num它包含背景类,因此如果数据需要预测的类型是n, class_num = n 1.例如,我的数据集中只有一种预测类型,所以我的class_num就是2。
也可以通过操作以下指令进行模型训练paddle训练可视化软件 VisualDL对整个训练过程进行可视化监控。
5、训练完
训练完成后可以通过,下面两个指令对模型进行评估与预测,这里就不过多赘述。
以下是训练出来的结果,可以对比看看,总体来说还是比较准确的。