2019年7月的飞桨活动中,第一次接触飞桨开源深度学习框架,这也是我学习的第一个深度学习框架,一年的时间里见证了飞桨以简为先,由简至精。2020年4月,飞桨正式开源PaddleClas,包含23个系列的分类网络以及117个预训练模型和性能评估,从数据增广、骨干网络设计、损失定义、优化器设计、知识蒸馏、特征迁移学习等不同的角度对图像分类问题进行深入探索。
在本篇文章中,我尝试使用PaddleClas进行热轧钢带表面缺陷的分类任务,经过调试最终在测试集上的准确率达到了100%。
项目简介
类内缺陷在外观上存在较大差异,类间缺陷相似,类内缺陷在外观上存在很大相似。例如,划痕(最后一列)可能是水平划痕,垂直划痕和倾斜划痕等。 同样,类间缺陷也具有类似情况,例如,氧化皮,裂纹和表面凹痕。 另外,由于照明和材料变化的影响,类内缺陷图像的灰度是变化的。
环境搭建与数据处理 模型选择与参数配置 模型训练 模型评估 模型推理
环境搭建与数据处理
01 环境搭建
git clone https://github.com/PaddlePaddle/PaddleClas.git
cd PaddleClas pip install --upgrade -r requirements.txt
export PYTHONPATH=./:$PYTHONPATH
cd PaddleClas import os os.environ['PYTHONPATH']="/home/aistudio/PaddleClas"
02 数据处理
image_path_pre = os.path.join(all_file_dir, class_dir) img = Image.open(os.path.join(image_path_pre, file)) if random.uniform(0, 1) <= train_ratio: shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(train_image _dir, file)) train_file.write("{0} {1}\n".format(os.path.join("trainImageSet", file), label_id)) else: shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(eval_image_dir, file)) eval_file.write("{0} {1}\n".format(os.path.join("evalImageSet", file), label_id)) train.txt内的部分数据格式如下所示: trainImageSet/Cr_227.bmp 0 trainImageSet/Cr_87.bmp 0 trainImageSet/Cr_194.bmp 0 trainImageSet/Cr_93.bmp 0
模型选择参数配置
classes_num:6 分类数 total_images:1431 总图片数 save_interval:10 每隔多少个epoch保存模型 validate:True 是否在训练时评估 valid_interval:10 每隔多少个epoch进行模型评估 epochs:50 训练总epoch数 image_shape: [3, 224, 224] 图片大小
batch_size: 64 批大小 num_workers: 4 数据读取器worker数量 file_list: "./dataset/NEU-CLS/train.txt" train文件列表 data_dir: "./dataset/NEU-CLS" train文件路径
模型训练
python ../download_model.py ResNet50_vd_pretrained mv ../ResNet50_vd_pretrained ./
python -m paddle.distributed.launch --selected_gpus="0" tools/train.py \ -c ../ neu.yaml \ #配置文件路径 -o pretrained_model=./ResNet50_vd_pretrained #预训练模型存放路径
模型评估
configs/eval.yaml,直接修改 -o,设置需要评估的模型路径
python -m paddle.distributed.launch --selected_gpus="0" tools/eval.py \ -c .. /eval.yaml \ #配置文件路径 -o pretrained_model=output/ResNet50_vd/best_model/ppcls #评估模型路径
模型推理
persistable模型(fluid.save_persistabels保存的模型):一般作为模型的 checkpoint,可以加载后重新训练。persistable 模型保存的是零散的权重文件,每个文件代表模型中的一个 Variable,这些零散的文件不包含结构信息,需要结合模型的结构一起使用。 inference 模型(fluid.io.save_inference_model保存的模型):一般是模型训练完成后保存的固化模型,用于预测部署。
预测引擎 + inference 模型 训练引擎 + persistable 模型 训练引擎 + inference 模型
Ⅰ 选择训练好的模型并转化为inference 模型
python tools/export_model.py \
--model='ResNet50_vd' \ #模型名称
--pretrained_model=output/ResNet50_vd/best_model/ppcls \ #需要转换的模型路径
--output_path=./inference #输出的预测模型保存路径
保存在Inference目录下的预测模型包含 model、params 两个文件。
Ⅱ 通过预测引擎和inference模型进行推理
python tools/infer/predict.py --use_gpu=1 \ #是否使用 GPU 预测
-m inference/model \ #模型文件路径
-p inference/params \ #权重文件路径
-i "dataset/NEU-CLS/Rs/RS_5.bmp" \ #待预测的图片文件路径
心得体会