|
| 1 | +简体中文 | [English](anomaly_detection_tutorial_en.md) |
| 2 | + |
| 3 | +# PaddleX 3.0 图像异常检测产线———食品外观质检教程 |
| 4 | + |
| 5 | +PaddleX 提供了丰富的模型产线,模型产线由一个或多个模型组合实现,每个模型产线都能够解决特定的场景任务问题。PaddleX 所提供的模型产线均支持快速体验,如果效果不及预期,也同样支持使用私有数据微调模型,并且 PaddleX 提供了 Python API,方便将产线集成到个人项目中。在使用之前,您首先需要安装 PaddleX, 安装方式请参考[ PaddleX 安装](../installation/installation.md)。此处以一个食品外观质检的任务为例子,介绍模型产线工具的使用流程。 |
| 6 | + |
| 7 | +## 1. 选择产线 |
| 8 | + |
| 9 | +首先,需要根据您的任务场景,选择对应的 PaddleX 产线,此处为食品外观质检,需要了解到这个任务属于异常检测任务,对应 PaddleX 的通用异常检测产线。如果无法确定任务和产线的对应关系,您可以在 PaddleX 支持的[模型产线列表](../support_list/pipelines_list.md)中了解相关产线的能力介绍。 |
| 10 | + |
| 11 | + |
| 12 | +## 2. 快速体验 |
| 13 | + |
| 14 | +PaddleX 提供了以下快速体验的方式,可以直接通过 PaddleX wheel 包在本地体验。 |
| 15 | + |
| 16 | + - 本地体验方式: |
| 17 | + ```bash |
| 18 | + paddlex --pipeline anomaly_detection \ |
| 19 | + --input https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/uad_hazelnut.png \ |
| 20 | + --save_path output |
| 21 | + ``` |
| 22 | + |
| 23 | + |
| 24 | + 快速体验产出推理结果示例: |
| 25 | + <center> |
| 26 | + |
| 27 | + <img src="https://raw.githubusercontent.com/cuicheng01/PaddleX_doc_images/main/images/practical_tutorials/image_anomaly_detection/01.png" width=600> |
| 28 | + |
| 29 | + </center> |
| 30 | + |
| 31 | +当体验完该产线之后,需要确定产线是否符合预期(包含精度、速度等),产线包含的模型是否需要继续微调,如果模型的速度或者精度不符合预期,则需要根据模型选择选择可替换的模型继续测试,确定效果是否满意。如果最终效果均不满意,则需要微调模型。本教程希望产出检测出食品榛子外观异常的模型,显然默认的权重(铁丝网 数据集训练产出的权重)无法满足要求,需要采集和标注数据,然后进行训练微调。 |
| 32 | + |
| 33 | +## 3. 选择模型 |
| 34 | + |
| 35 | +PaddleX 提供了 1 个端到端的高精度异常检测模型,具体可参考 [模型列表](../support_list/models_list.md),其中部分模型的benchmark如下: |
| 36 | + |
| 37 | +|模型名称|Avg(%)|GPU推理耗时(ms)|CPU推理耗时(ms)|模型存储大小|yaml 文件| |
| 38 | +|-|-|-|-|-|-| |
| 39 | +|STFPM|96.2|-|-|21.5 M|[STFPM.yaml](../../paddlex/configs/anomaly_detection/STFPM.yaml)| |
| 40 | + |
| 41 | +**注:以上精度指标为 **[MVTec AD](https://www.mvtec.com/company/research/datasets/mvtec-ad)** 验证集 平均异常分数。** |
| 42 | + |
| 43 | + |
| 44 | +## 4. 数据准备和校验 |
| 45 | +### 4.1 数据准备 |
| 46 | + |
| 47 | +本教程采用 `食品外观质检数据集` 作为示例数据集,可通过以下命令获取示例数据集。如果您使用自备的已标注数据集,需要按照 PaddleX 的格式要求对自备数据集进行调整,以满足 PaddleX 的数据格式要求。关于数据格式介绍,您可以参考 [PaddleX 分割任务模块数据标注教程](../data_annotations/cv_modules/semantic_segmentation.md)。 |
| 48 | + |
| 49 | +数据集获取命令: |
| 50 | +```bash |
| 51 | +cd /path/to/paddlex |
| 52 | +wget https://paddle-model-ecology.bj.bcebos.com/paddlex/data/anomaly_detection_hazelnut.tar -P ./dataset |
| 53 | +tar -xf ./dataset/anomaly_detection_hazelnut.tar -C ./dataset/ |
| 54 | +``` |
| 55 | + |
| 56 | +### 4.2 数据集校验 |
| 57 | + |
| 58 | +在对数据集校验时,只需一行命令: |
| 59 | + |
| 60 | +```bash |
| 61 | +python main.py -c paddlex/configs/anomaly_detection/STFPM.yaml \ |
| 62 | + -o Global.mode=check_dataset \ |
| 63 | + -o Global.dataset_dir=./dataset/anomaly_detection_hazelnut |
| 64 | +``` |
| 65 | + |
| 66 | +执行上述命令后,PaddleX 会对数据集进行校验,并统计数据集的基本信息。命令运行成功后会在 log 中打印出 `Check dataset passed !` 信息,同时相关产出会保存在当前目录的 `./output/check_dataset` 目录下,产出目录中包括可视化的示例样本图片和样本分布直方图。校验结果文件保存在 `./output/check_dataset_result.json`,校验结果文件具体内容为 |
| 67 | +``` |
| 68 | +{ |
| 69 | + "done_flag": true, |
| 70 | + "check_pass": true, |
| 71 | + "attributes": { |
| 72 | + "train_sample_paths": [ |
| 73 | + "check_dataset\/demo_img\/294.png", |
| 74 | + "check_dataset\/demo_img\/260.png", |
| 75 | + "check_dataset\/demo_img\/297.png", |
| 76 | + "check_dataset\/demo_img\/170.png", |
| 77 | + "check_dataset\/demo_img\/068.png", |
| 78 | + "check_dataset\/demo_img\/212.png", |
| 79 | + "check_dataset\/demo_img\/204.png", |
| 80 | + "check_dataset\/demo_img\/233.png", |
| 81 | + "check_dataset\/demo_img\/367.png", |
| 82 | + "check_dataset\/demo_img\/383.png" |
| 83 | + ], |
| 84 | + "train_samples": 391, |
| 85 | + "val_sample_paths": [ |
| 86 | + "check_dataset\/demo_img\/012.png", |
| 87 | + "check_dataset\/demo_img\/017.png", |
| 88 | + "check_dataset\/demo_img\/006.png", |
| 89 | + "check_dataset\/demo_img\/013.png", |
| 90 | + "check_dataset\/demo_img\/014.png", |
| 91 | + "check_dataset\/demo_img\/010.png", |
| 92 | + "check_dataset\/demo_img\/007.png", |
| 93 | + "check_dataset\/demo_img\/001.png", |
| 94 | + "check_dataset\/demo_img\/002.png", |
| 95 | + "check_dataset\/demo_img\/009.png" |
| 96 | + ], |
| 97 | + "val_samples": 70, |
| 98 | + "num_classes": 1 |
| 99 | + }, |
| 100 | + "analysis": { |
| 101 | + "histogram": "check_dataset\/histogram.png" |
| 102 | + }, |
| 103 | + "dataset_path": ".\/dataset\/hazelnut", |
| 104 | + "show_type": "image", |
| 105 | + "dataset_type": "SegDataset" |
| 106 | +} |
| 107 | +``` |
| 108 | +上述校验结果中,check_pass 为 True 表示数据集格式符合要求,其他部分指标的说明如下: |
| 109 | +
|
| 110 | +- attributes.num_classes:该数据集类别数为 1,此处类别数量为后续训练需要传入的类别数量; |
| 111 | +- attributes.train_samples:该数据集训练集样本数量为 391; |
| 112 | +- attributes.val_samples:该数据集验证集样本数量为 70; |
| 113 | +- attributes.train_sample_paths:该数据集训练集样本可视化图片相对路径列表; |
| 114 | +- attributes.val_sample_paths:该数据集验证集样本可视化图片相对路径列表; |
| 115 | +
|
| 116 | +另外,数据集校验还对数据集中所有类别的样本数量分布情况进行了分析,并绘制了分布直方图(histogram.png): |
| 117 | +<center> |
| 118 | +
|
| 119 | +<img src="https://raw.githubusercontent.com/cuicheng01/PaddleX_doc_images/main/images/practical_tutorials/anomaly_detection/02.png" width=600> |
| 120 | +
|
| 121 | +</center> |
| 122 | +
|
| 123 | +**注**:只有通过数据校验的数据才可以训练和评估。 |
| 124 | +
|
| 125 | +
|
| 126 | +### 4.3 数据集格式转换/数据集划分(非必选) |
| 127 | +
|
| 128 | +如需对数据集格式进行转换或是重新划分数据集,可通过修改配置文件或是追加超参数的方式进行设置。 |
| 129 | +
|
| 130 | +数据集校验相关的参数可以通过修改配置文件中 `CheckDataset` 下的字段进行设置,配置文件中部分参数的示例说明如下: |
| 131 | +
|
| 132 | +* `CheckDataset`: |
| 133 | + * `convert`: |
| 134 | + * `enable`: 是否进行数据集格式转换,为 `True` 时进行数据集格式转换,默认为 `False`; |
| 135 | + * `src_dataset_type`: 如果进行数据集格式转换,则需设置源数据集格式,数据可选源格式为 `LabelMe` 和 `VOC`; |
| 136 | + * `split`: |
| 137 | + * `enable`: 是否进行重新划分数据集,为 `True` 时进行数据集格式转换,默认为 `False`; |
| 138 | + * `train_percent`: 如果重新划分数据集,则需要设置训练集的百分比,类型为 0-100 之间的任意整数,需要保证和 `val_percent` 值加和为 100; |
| 139 | + * `val_percent`: 如果重新划分数据集,则需要设置验证集的百分比,类型为 0-100 之间的任意整数,需要保证和 `train_percent` 值加和为 100; |
| 140 | +
|
| 141 | +数据转换和数据划分支持同时开启,对于数据划分原有标注文件会被在原路径下重命名为 `xxx.bak`,以上参数同样支持通过追加命令行参数的方式进行设置,例如重新划分数据集并设置训练集与验证集比例:`-o CheckDataset.split.enable=True -o CheckDataset.split.train_percent=80 -o CheckDataset.split.val_percent=20`。 |
| 142 | +
|
| 143 | +## 5. 模型训练和评估 |
| 144 | +### 5.1 模型训练 |
| 145 | +
|
| 146 | +在训练之前,请确保您已经对数据集进行了校验。完成 PaddleX 模型的训练,只需如下一条命令: |
| 147 | +
|
| 148 | +```bash |
| 149 | +python main.py -c paddlex/configs/anomaly_detection/STFPM.yaml \ |
| 150 | + -o Global.mode=train \ |
| 151 | + -o Global.dataset_dir=./dataset/anomaly_detection_hazelnut \ |
| 152 | + -o Train.epochs_iters=4000 |
| 153 | +``` |
| 154 | + |
| 155 | +在 PaddleX 中模型训练支持:修改训练超参数、单机单卡/多卡训练等功能,只需修改配置文件或追加命令行参数。 |
| 156 | + |
| 157 | +PaddleX 中每个模型都提供了模型开发的配置文件,用于设置相关参数。模型训练相关的参数可以通过修改配置文件中 `Train` 下的字段进行设置,配置文件中部分参数的示例说明如下: |
| 158 | + |
| 159 | +* `Global`: |
| 160 | + * `mode`:模式,支持数据校验(`check_dataset`)、模型训练(`train`)、模型评估(`evaluate`); |
| 161 | + * `device`:训练设备,可选`cpu`、`gpu`、`xpu`、`npu`、`mlu`,除 cpu 外,多卡训练可指定卡号,如:`gpu:0,1,2,3`; |
| 162 | +* `Train`:训练超参数设置; |
| 163 | + * `epochs_iters`:训练迭代次数数设置; |
| 164 | + * `learning_rate`:训练学习率设置; |
| 165 | + |
| 166 | +更多超参数介绍,请参考 [PaddleX 通用模型配置文件参数说明](../module_usage/instructions/config_parameters_common.md)。 |
| 167 | + |
| 168 | +**注:** |
| 169 | +- 以上参数可以通过追加令行参数的形式进行设置,如指定模式为模型训练:`-o Global.mode=train`;指定前 2 卡 gpu 训练:`-o Global.device=gpu:0,1`;设置训练迭代次数为 5000:`-o Train.epochs_iters=5000`。 |
| 170 | +- 模型训练过程中,PaddleX 会自动保存模型权重文件,默认为`output`,如需指定保存路径,可通过配置文件中 `-o Global.output` 字段 |
| 171 | +- PaddleX 对您屏蔽了动态图权重和静态图权重的概念。在模型训练的过程中,会同时产出动态图和静态图的权重,在模型推理时,默认选择静态图权重推理。 |
| 172 | + |
| 173 | +**训练产出解释:** |
| 174 | + |
| 175 | +在完成模型训练后,所有产出保存在指定的输出目录(默认为`./output/`)下,通常有以下产出: |
| 176 | + |
| 177 | +* train_result.json:训练结果记录文件,记录了训练任务是否正常完成,以及产出的权重指标、相关文件路径等; |
| 178 | +* train.log:训练日志文件,记录了训练过程中的模型指标变化、loss 变化等; |
| 179 | +* config.yaml:训练配置文件,记录了本次训练的超参数的配置; |
| 180 | +* .pdparams、.pdema、.pdopt.pdstate、.pdiparams、.pdmodel:模型权重相关文件,包括网络参数、优化器、EMA、静态图网络参数、静态图网络结构等; |
| 181 | + |
| 182 | +### 5.2 模型评估 |
| 183 | + |
| 184 | +在完成模型训练后,可以对指定的模型权重文件在验证集上进行评估,验证模型精度。使用 PaddleX 进行模型评估,只需一行命令: |
| 185 | + |
| 186 | +```bash |
| 187 | +python main.py -c paddlex/configs/anomaly_detection/STFPM.yaml \ |
| 188 | + -o Global.mode=evaluate \ |
| 189 | + -o Global.dataset_dir=./dataset/anomaly_detection_hazelnut |
| 190 | +``` |
| 191 | + |
| 192 | +与模型训练类似,模型评估支持修改配置文件或追加命令行参数的方式设置。 |
| 193 | + |
| 194 | +**注:** 在模型评估时,需要指定模型权重文件路径,每个配置文件中都内置了默认的权重保存路径,如需要改变,只需要通过追加命令行参数的形式进行设置即可,如`-o Evaluate.weight_path=./output/best_model/model.pdparams`。 |
| 195 | + |
| 196 | +### 5.3 模型调优 |
| 197 | + |
| 198 | +在学习了模型训练和评估后,我们可以通过调整超参数来提升模型的精度。通过合理调整训练轮数,您可以控制模型的训练深度,避免过拟合或欠拟合;而学习率的设置则关乎模型收敛的速度和稳定性。因此,在优化模型性能时,务必审慎考虑这两个参数的取值,并根据实际情况进行灵活调整,以获得最佳的训练效果。 |
| 199 | + |
| 200 | +推荐在调试参数时遵循控制变量法: |
| 201 | + |
| 202 | +1. 首先固定训练迭代次数为 4000,批大小为 1。 |
| 203 | +2. 基于 STFPM 模型启动三个实验,学习率分别为:0.01,0.1,0.4。 |
| 204 | +3. 可以发现实验三精度最高的配置为学习率为 0.4,在该训练超参数基础上,增加训练论次数到5000,可以看到达到更优的精度。 |
| 205 | + |
| 206 | +学习率探寻实验结果: |
| 207 | +<center> |
| 208 | + |
| 209 | +| 实验 | 迭代次数 | 学习率 | batch\_size | 训练环境 | mIoU | |
| 210 | +|-------|------|--------|----------|-------|----------| |
| 211 | +| 实验一 | 4000 | 0\.01 | 1 | 4卡 | 0\.9646 | |
| 212 | +| 实验二 | 4000 | 0\.1 | 1 | 4卡 |0\.9707| |
| 213 | +| 实验三 | 4000 | 0\.4 | 1 | 4卡 | **0\.9797** | |
| 214 | + |
| 215 | +</center> |
| 216 | + |
| 217 | +改变 epoch 实验结果: |
| 218 | +<center> |
| 219 | + |
| 220 | +| 实验 | 迭代次数 | 学习率 | batch\_size| 训练环境 | mIoU | |
| 221 | +|--------------------|---------|-------|------------|------|----------| |
| 222 | +| 实验三 | 4000 | 0\.4 | 1 | 4卡 | 0\.9797 | |
| 223 | +| 实验三增大训练迭代次数 | 5000 | 0\.4 | 1 | 4卡 | **0\.9826**| |
| 224 | +</center> |
| 225 | + |
| 226 | +**注:本教程为4卡教程,如果您只有1张GPU,可通过调整训练卡数完成本次实验,但最终指标未必和上述指标对齐,属正常情况。** |
| 227 | + |
| 228 | +## 6. 产线测试 |
| 229 | + |
| 230 | +将产线中的模型替换为微调后的模型进行测试,如: |
| 231 | + |
| 232 | +```bash |
| 233 | +python main.py -c paddlex/configs/anomaly_detection/STFPM.yaml \ |
| 234 | + -o Global.mode=predict \ |
| 235 | + -o Predict.model_dir="output/best_model/inference" \ |
| 236 | + -o Predict.input="https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/uad_hazelnut.png" |
| 237 | +``` |
| 238 | + |
| 239 | +通过上述可在`./output`下生成预测结果,其中`uad_hazelnut.png`的预测结果如下: |
| 240 | +<center> |
| 241 | + |
| 242 | +<img src="https://raw.githubusercontent.com/cuicheng01/PaddleX_doc_images/main/images/practical_tutorials/anomaly_detection/03.png" width="600"/> |
| 243 | + |
| 244 | +</center> |
| 245 | + |
| 246 | +## 7. 开发集成/部署 |
| 247 | +如果通用异常检测产线可以达到您对产线推理速度和精度的要求,您可以直接进行开发集成/部署。 |
| 248 | +1. 直接将训练好的模型应用在您的 Python 项目中,可以参考如下示例代码,并将`paddlex/pipelines/anomaly_detection.yaml`配置文件中的`Pipeline.model`修改为自己的模型路径`output/best_model/inference`: |
| 249 | +```python |
| 250 | +from paddlex import create_pipeline |
| 251 | +pipeline = create_pipeline(pipeline="paddlex/pipelines/anomaly_detection.yaml") |
| 252 | +output = pipeline.predict("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/uad_hazelnut.png") |
| 253 | +for res in output: |
| 254 | + res.print() # 打印预测的结构化输出 |
| 255 | + res.save_to_img("./output/") # 保存结果可视化图像 |
| 256 | + res.save_to_json("./output/") # 保存预测的结构化输出 |
| 257 | +``` |
| 258 | +更多参数请参考 [异常检测产线使用教程](../pipeline_usage/tutorials/cv_pipelines/image_anomaly_detection.md)。 |
| 259 | + |
| 260 | +2. 此外,PaddleX 也提供了其他三种部署方式,详细说明如下: |
| 261 | + |
| 262 | +* 高性能部署:在实际生产环境中,许多应用对部署策略的性能指标(尤其是响应速度)有着较严苛的标准,以确保系统的高效运行与用户体验的流畅性。为此,PaddleX 提供高性能推理插件,旨在对模型推理及前后处理进行深度性能优化,实现端到端流程的显著提速,详细的高性能部署流程请参考 [PaddleX 高性能推理指南](../pipeline_deploy/high_performance_inference.md)。 |
| 263 | +* 服务化部署:服务化部署是实际生产环境中常见的一种部署形式。通过将推理功能封装为服务,客户端可以通过网络请求来访问这些服务,以获取推理结果。PaddleX 支持用户以低成本实现产线的服务化部署,详细的服务化部署流程请参考 [PaddleX 服务化部署指南](../pipeline_deploy/service_deploy.md)。 |
| 264 | +* 端侧部署:端侧部署是一种将计算和数据处理功能放在用户设备本身上的方式,设备可以直接处理数据,而不需要依赖远程的服务器。PaddleX 支持将模型部署在 Android 等端侧设备上,详细的端侧部署流程请参考 [PaddleX端侧部署指南](../pipeline_deploy/edge_deploy.md)。 |
| 265 | + |
| 266 | +您可以根据需要选择合适的方式部署模型产线,进而进行后续的 AI 应用集成。 |
0 commit comments