EfficientNetB3_watermark.md 5.2 KB
Newer Older
weixin_46524038's avatar
weixin_46524038 已提交
1 2 3 4 5 6 7 8 9 10 11 12
# 有水印/无水印分类模型

------


## 目录

- [1. 模型和应用场景介绍](#1)
- [2. 模型快速体验](#2)
    - [2.1 安装 paddlepaddle](#2.1)
    - [2.2 安装 paddleclas](#2.2)
- [3. 模型预测](#3)
weixin_46524038's avatar
modify  
weixin_46524038 已提交
13 14 15
    - [3.1 模型预测](#3.1)
      - [3.1.1 基于训练引擎预测](#3.1.1)
      - [3.1.2 基于推理引擎预测](#3.1.2)
weixin_46524038's avatar
weixin_46524038 已提交
16 17 18 19 20 21


<a name="1"></a>

## 1. 模型和应用场景介绍

weixin_46524038's avatar
weixin_46524038 已提交
22
该案例提供了用户使用 PaddleClas 的基于 EfficientNetB3 网络构建有水印/无水印(这里的水印包括数字照片上留下的一些logo、信息、网址等)的分类模型。该模型可以广泛应用于审核场景、海量数据过滤场景等。本案例引用自[水印识别](https://github.com/LAION-AI/LAION-5B-WatermarkDetection),权重由官方权重转换而来。具体有无水印的图片对比如下:
weixin_46524038's avatar
weixin_46524038 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
<center><img src='https://user-images.githubusercontent.com/94225063/212879681-f115d6f8-85c8-4cda-a07e-5f5b00d8236a.jpeg' width=800></center>
可以看到,左图中有水印,右图中无水印。

<a name="2"></a>

## 2. 模型快速体验

<a name="2.1"></a>  

### 2.1 安装 paddlepaddle

- 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装

```bash
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
```

- 您的机器是 CPU,请运行以下命令安装

```bash
python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
```

更多的版本需求,请参照[飞桨官网安装文档](https://www.paddlepaddle.org.cn/install/quick)中的说明进行操作。

<a name="2.2"></a>

### 2.2 安装 paddleclas

使用如下命令快速安装 paddleclas:

```  
weixin_46524038's avatar
modify  
weixin_46524038 已提交
55
python3 setup.py install
weixin_46524038's avatar
weixin_46524038 已提交
56 57 58 59 60 61
```

<a name="3"></a>

## 3. 模型预测

weixin_46524038's avatar
modify  
weixin_46524038 已提交
62
<a name="3.1"></a>
weixin_46524038's avatar
weixin_46524038 已提交
63

weixin_46524038's avatar
modify  
weixin_46524038 已提交
64
### 3.1 模型预测
weixin_46524038's avatar
weixin_46524038 已提交
65

weixin_46524038's avatar
modify  
weixin_46524038 已提交
66
<a name="3.1.1"></a>
weixin_46524038's avatar
weixin_46524038 已提交
67

weixin_46524038's avatar
modify  
weixin_46524038 已提交
68
### 3.1.1 基于训练引擎预测
weixin_46524038's avatar
weixin_46524038 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测:

```python
python3 tools/infer.py \
    -c ./ppcls/configs/practical_models/EfficientNetB3_watermark.yaml \
    -o Arch.pretrained=True
```

输出结果如下:

```
[{'class_ids': [0], 'scores': [0.9653296619653702], 'label_names': ['contains_watermark'], 'file_name': 'deploy/images/practical/watermark_exists/watermark_example.png'}]
```

**备注:**

* 这里`-o Arch.pretrained=True"` 指定了使用训练好的预训练权重,如果指定其他权重,只需替换对应的路径即可。

* 默认是对 `deploy/images/practical/watermark_exists/watermark_example.png` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。

* 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 `Infer.PostProcess.threshold`

weixin_46524038's avatar
modify  
weixin_46524038 已提交
92
<a name="3.1.2"></a>
weixin_46524038's avatar
weixin_46524038 已提交
93

weixin_46524038's avatar
modify  
weixin_46524038 已提交
94
### 3.1.2 基于推理引擎预测
weixin_46524038's avatar
weixin_46524038 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用 MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于 Paddle Inference 推理引擎的介绍,可以参考 [Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)

首先,我们提供了将权重和模型转换的脚本,执行该脚本可以得到对应的 inference 模型:

```bash
python3 tools/export_model.py \
    -c ./ppcls/configs/practical_models/EfficientNetB3_watermark.yaml \
    -o Arch.pretrained=True \
    -o Global.save_inference_dir=deploy/models/EfficientNetB3_watermark_infer
```
执行完该脚本后会在 `deploy/models/` 下生成 `EfficientNetB3_watermark_infer` 文件夹,`models` 文件夹下应有如下文件结构:

```
├── EfficientNetB3_watermark_infer
│   ├── inference.pdiparams
│   ├── inference.pdiparams.info
│   └── inference.pdmodel
```

当然,也可以选择直接下载的方式:

```
cd deploy/models
# 下载 inference 模型并解压
wget https://paddleclas.bj.bcebos.com/models/practical/inference/EfficientNetB3_watermark_infer.tar && tar -xf EfficientNetB3_watermark_infer.tar
```
解压完毕后,`models` 文件夹下应有如下文件结构:

```
├── EfficientNetB3_watermark_infer
│   ├── inference.pdiparams
│   ├── inference.pdiparams.info
│   └── inference.pdmodel
```

得到 inference 模型之后基于推理引擎进行预测:
返回 `deploy` 目录:

```
cd ../
```

运行下面的命令,对图像 `./images/practical/watermark_exists/watermark_example.png` 进行有水印/无水印分类。

```shell
# 使用下面的命令使用 GPU 进行预测
python3.7 python/predict_cls.py -c ./configs/practical_models/watermark_exists/inference_watermark_exists.yaml
# 使用下面的命令使用 CPU 进行预测
python3.7 python/predict_cls.py -c ./configs/practical_models/watermark_exists/inference_watermark_exists.yaml -o Global.use_gpu=False
```

输出结果如下。

```
watermark_example.png:	class id(s): [0], score(s): [0.97], label_name(s): ['contains_watermark']
```

**备注:** 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 `Infer.PostProcess.threshold`