未验证 提交 13cc2d57 编写于 作者: C chenjian 提交者: GitHub

Update face detection modules docs according to the template (#1598)

上级 8b6b029f
```shell
$ hub install pyramidbox_face_detection==1.1.0
```
# pyramidbox_face_detection
<p align="center">
<img src="https://bj.bcebos.com/paddlehub/paddlehub-img/pyramidbox_face_detection_network.png" hspace='10'/> <br />
Pyramidbox模型框架图
</p>
|模型名称|pyramidbox_face_detection|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|PyramidBox|
|数据集|WIDER FACE数据集|
|是否支持Fine-tuning|否|
|模型大小|220MB|
|最新更新日期|2021-02-26|
|数据指标|-|
模型详情请参考[论文](https://arxiv.org/pdf/1803.07737.pdf)
## 一、模型基本信息
## 命令行预测
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131602468-351eb3fb-81e3-4294-ac8e-b49a3a0232cb.jpg" width='50%' hspace='10'/>
<br />
</p>
```
hub run pyramidbox_face_detection --input_path "/PATH/TO/IMAGE"
```
## API
- ### 模型介绍
```python
def face_detection(images=None,
- PyramidBox是一种基于SSD的单阶段人脸检测器,它利用上下文信息解决困难人脸的检测问题。PyramidBox在六个尺度的特征图上进行不同层级的预测。该工作主要包括以下模块:LFPN、PyramidAnchors、CPM、Data-anchor-sampling。该PaddleHub Module的预训练数据集为WIDER FACE数据集,可支持预测。
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install pyramidbox_face_detection
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run pyramidbox_face_detection --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
face_detector = hub.Module(name="pyramidbox_face_detection")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def face_detection(images=None,
paths=None,
use_gpu=False,
output_dir='detection_result',
visualization=False,
score_thresh=0.15):
```
score_thresh=0.15)
```
预测API,检测输入图片中的所有人脸位置。
- 检测输入图片中的所有人脸位置。
**参数**
- **参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* use\_gpu (bool): 是否使用 GPU;
* output\_dir (str): 图片的保存路径,当为 None 时,默认设为 detection\_result;
* visualization (bool): 是否将识别结果保存为图片文件;
* score\_thresh (float): 检测置信度的阈值。
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- output\_dir (str): 图片的保存路径,默认设为 detection\_result;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- score_thresh (float): 置信度的阈值。
**返回**
**NOTE:** paths和images两个参数选择其一进行提供数据
* res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,关键字包括'path', 'data', 相应的取值为:
* path (str): 原输入图片的路径;
* data (list): 检测结果,list的每一个元素为 dict,各字段为:
* confidence (float): 识别的置信度;
* left (int): 边界框的左上角x坐标;
* top (int): 边界框的左上角y坐标;
* right (int): 边界框的右下角x坐标;
* bottom (int): 边界框的右下角y坐标。
- **返回**
```python
def save_inference_model(dirname,
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
将模型保存到指定路径。
**参数**
* dirname: 存在模型的目录名称
* model\_filename: 模型文件名称,默认为\_\_model\_\_
* params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
```
- 将模型保存到指定路径。
## 代码示例
- **参数**
```python
import paddlehub as hub
import cv2
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
face_detector = hub.Module(name="pyramidbox_face_detection")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection((paths=['/PATH/TO/IMAGE'])
```
## 服务部署
## 四、服务部署
PaddleHub Serving可以部署一个在线人脸检测服务。
- PaddleHub Serving可以部署一个在线人脸检测服务。
## 第一步:启动PaddleHub Serving
- ### 第一步:启动PaddleHub Serving
运行启动命令:
```shell
$ hub serving start -m pyramidbox_face_detection
```
- 运行启动命令:
- ```shell
$ hub serving start -m pyramidbox_face_detection
```
这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
- 这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
## 第二步:发送预测请求
- ### 第二步:发送预测请求
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
```python
import requests
import json
import cv2
import base64
- ```python
import requests
import json
import cv2
import base64
def cv2_to_base64(image):
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_face_detection"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_face_detection"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
# 打印预测结果
print(r.json()["results"])
```
## 查看代码
## 五、更新历史
https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/face_detection
* 1.0.0
### 依赖
初始发布
paddlepaddle >= 1.6.2
* 1.1.0
paddlehub >= 1.6.0
修复numpy数据读取问题
- ```shell
$ hub install pyramidbox_face_detection==1.1.0
```
```shell
$ hub install pyramidbox_lite_mobile==1.2.0
```
# pyramidbox_lite_mobile
## 命令行预测
|模型名称|pyramidbox_lite_mobile|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|PyramidBox|
|数据集|WIDER FACE数据集 + 百度自采人脸数据集|
|是否支持Fine-tuning|否|
|模型大小|7.3MB|
|最新更新日期|2021-02-26|
|数据指标|-|
```
hub run pyramidbox_lite_mobile --input_path "/PATH/TO/IMAGE"
```
## API
## 一、模型基本信息
```python
def face_detection(images=None,
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131602468-351eb3fb-81e3-4294-ac8e-b49a3a0232cb.jpg" width='50%' hspace='10'/>
<br />
</p>
- ### 模型介绍
- PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module是针对于移动端优化过的模型,适合部署于移动端或者边缘检测等算力受限的设备上,并基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于人脸检测。
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install pyramidbox_lite_mobile
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run pyramidbox_lite_mobile --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
face_detector = hub.Module(name="pyramidbox_lite_mobile")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def face_detection(images=None,
paths=None,
data=None,
use_gpu=False,
output_dir='detection_result',
visualization=False,
shrink=0.5,
confs_threshold=0.6)
```
检测输入图片中的所有人脸位置
**参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* batch\_size (int): batch 的大小;
* use\_gpu (bool): 是否使用 GPU;
* visualization (bool): 是否将识别结果保存为图片文件;
* output\_dir (str): 图片的保存路径,默认设为 detection\_result;
* shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果。
* confs\_threshold (float): 置信度的阈值。
**返回**
* res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
* path (str): 原输入图片的路径;
* data (list): 检测结果,list的每一个元素为 dict,各字段为:
* confidence (float): 识别的置信度;
* left (int): 边界框的左上角x坐标;
* top (int): 边界框的左上角y坐标;
* right (int): 边界框的右下角x坐标;
* bottom (int): 边界框的右下角y坐标。
```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
```
将模型保存到指定路径
- 检测输入图片中的所有人脸位置
**参数**
- **参数**
* dirname: 存在模型的目录名称
* model\_filename: 模型文件名称,默认为\_\_model\_\_
* params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- output\_dir (str): 图片的保存路径,默认设为 detection\_result;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果;<br/>
- confs\_threshold (float): 置信度的阈值。
## 代码示例
**NOTE:** paths和images两个参数选择其一进行提供数据
```python
import paddlehub as hub
import cv2
- **返回**
face_detector = hub.Module(name="pyramidbox_lite_mobile")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection((paths=['/PATH/TO/IMAGE'])
```
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
## 服务部署
PaddleHub Serving可以部署一个在线人脸检测服务。
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
- 将模型保存到指定路径。
## 第一步:启动PaddleHub Serving
- **参数**
运行启动命令:
```shell
$ hub serving start -m pyramidbox_lite_mobile
```
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
## 四、服务部署
## 第二步:发送预测请求
- PaddleHub Serving可以部署一个在线人脸检测服务。
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
- ### 第一步:启动PaddleHub Serving
```python
import requests
import json
import cv2
import base64
- 运行启动命令:
- ```shell
$ hub serving start -m pyramidbox_lite_mobile
```
- 这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
def cv2_to_base64(image):
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- ### 第二步:发送预测请求
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
- ```python
import requests
import json
import cv2
import base64
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_mobile"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_mobile"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
## 五、更新历史
# 打印预测结果
print(r.json()["results"])
```
* 1.0.0
### 依赖
初始发布
paddlepaddle >= 1.6.2
* 1.2.0
paddlehub >= 1.6.0
- ```shell
$ hub install pyramidbox_lite_mobile==1.2.0
```
```shell
$ hub install pyramidbox_lite_mobile_mask==1.3.0
```
# pyramidbox_lite_mobile_mask
## 命令行预测
|模型名称|pyramidbox_lite_mobile_mask|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|PyramidBox|
|数据集|WIDER FACE数据集 + 百度自采人脸数据集|
|是否支持Fine-tuning|否|
|模型大小|1.2MB|
|最新更新日期|2021-02-26|
|数据指标|-|
```
hub run pyramidbox_lite_mobile_mask --input_path "/PATH/TO/IMAGE"
```
## API
## 一、模型基本信息
```python
def __init__(face_detector_module=None)
```
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131603304-690a2e3b-9f24-42f6-9297-a12ada884191.jpg" width='50%' hspace='10'/>
<br />
</p>
**参数**
- ### 模型介绍
* face\_detector\_module (class): 人脸检测模型,默认为 pyramidbox\_lite\_mobile.
- PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module是针对于移动端优化过的模型,适合部署于移动端或者边缘检测等算力受限的设备上,并基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于检测人脸是否佩戴口罩。
```python
def face_detection(images=None,
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install pyramidbox_lite_mobile_mask
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run pyramidbox_lite_mobile_mask --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
mask_detector = hub.Module(name="pyramidbox_lite_mobile_mask")
result = mask_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = mask_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def __init__(face_detector_module=None)
```
- **参数**
- face\_detector\_module (class): 人脸检测模型,默认为 pyramidbox\_lite\_mobile。
- ```python
def face_detection(images=None,
paths=None,
batch_size=1,
use_gpu=False,
......@@ -28,147 +81,134 @@ def face_detection(images=None,
output_dir='detection_result',
use_multi_scale=False,
shrink=0.5,
confs_threshold=0.6):
```
confs_threshold=0.6)
```
识别输入图片中的所有的人脸,并判断有无戴口罩。
- 识别输入图片中的所有的人脸,并判断有无戴口罩。
**参数**
- **参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* batch\_size (int): batch 的大小;
* use\_gpu (bool): 是否使用 GPU;
* visualization (bool): 是否将识别结果保存为图片文件;
* output\_dir (str): 图片的保存路径,默认设为 detection\_result。
* use\_multi\_scale (bool) : 用于设置是否开启多尺度的人脸检测,开启多尺度人脸检测能够更好的检测到输入图像中不同尺寸的人脸,但是会增加模型计算量,降低预测速度;
* shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果;
* confs\_threshold (float): 人脸检测的置信度的阈值。
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- batch\_size (int): batch 的大小;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- output\_dir (str): 图片的保存路径,默认设为 detection\_result;<br/>
- use\_multi\_scale (bool) : 用于设置是否开启多尺度的人脸检测,开启多尺度人脸检测能够更好的检测到输入图像中不同尺寸的人脸,但是会增加模型计算量,降低预测速度;<br/>
- shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果;<br/>
- confs\_threshold (float): 置信度的阈值。
**返回**
**NOTE:** paths和images两个参数选择其一进行提供数据
* res (list\[dict\]): 识别结果的列表,列表元素为 dict, 有以下两个字段:
* path (str): 原图的路径。
* data (list\[dict\]): 识别的边界框列表,有以下字段:
* label (str): 识别标签,为 'NO MASK' 或者 'MASK';
* confidence (float): 识别的置信度;
* left (int): 边界框的左上角x坐标;
* top (int): 边界框的左上角y坐标;
* right (int): 边界框的右下角x坐标;
* bottom (int): 边界框的右下角y坐标;
- **返回**
```python
def set_face_detector_module(face_detector_module)
```
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- label (str): 识别标签,为 'NO MASK' 或者 'MASK';
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
设置口罩检测模型中进行人脸检测的底座模型。
- ```python
def set_face_detector_module(face_detector_module)
```
- 设置口罩检测模型中进行人脸检测的底座模型。
- **参数**
**参数**
- face\_detector\_module (class): 人脸检测模型。
* face\_detector\_module (class): 人脸检测模型
- ```python
def get_face_detector_module()
```
- 获取口罩检测模型中进行人脸检测的底座模型。
- **返回**
```python
def get_face_detector_module()
```
- 当前模型使用的人脸检测模型
获取口罩检测模型中进行人脸检测的底座模型。
**返回**
* 当前模型使用的人脸检测模型。
```python
def save_inference_model(dirname,
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
将模型保存到指定路径。
**参数**
```
- 将模型保存到指定路径。
* dirname: 存在模型的目录名称
* model\_filename: 模型文件名称,默认为\_\_model\_\_
* params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
- **参数**
## 代码示例
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
```python
import paddlehub as hub
import cv2
mask_detector = hub.Module(name="pyramidbox_lite_mobile_mask")
## 四、服务部署
result = mask_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = mask_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- PaddleHub Serving可以部署一个在线口罩检测服务。
## 服务部署
- ### 第一步:启动PaddleHub Serving
PaddleHub Serving可以部署一个在线人脸关键点检测服务。
- 运行启动命令:
- ```shell
$ hub serving start -m pyramidbox_lite_mobile_mask
```
## 第一步:启动PaddleHub Serving
- 这样就完成了一个口罩检测服务化API的部署,默认端口号为8866。
运行启动命令:
```shell
$ hub serving start -m pyramidbox_lite_mobile_mask
```
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
这样就完成了一个人脸关键点服务化API的部署,默认端口号为8866。
- ### 第二步:发送预测请求
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
## 第二步:发送预测请求
- ```python
import requests
import json
import cv2
import base64
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
```python
import requests
import json
import cv2
import base64
def cv2_to_base64(image):
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_mobile_mask"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
## Paddle Lite部署
1. 通过python执行以下代码,保存模型
```python
import paddlehub as hub
pyramidbox_lite_mobile_mask = hub.Module(name="pyramidbox_lite_mobile_mask")
# 将模型保存在test_program文件夹之中
pyramidbox_lite_mobile_mask.save_inference_model(dirname="test_program")
```
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_mobile_mask"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
通过以上命令,可以获得人脸检测和口罩佩戴判断模型,分别存储在pyramidbox\_lite和mask\_detector之中。文件夹中的\_\_model\_\_是模型结构文件,\_\_params\_\_文件是权重文件。
# 打印预测结果
print(r.json()["results"])
```
## 五、Paddle Lite部署
- ### 通过python执行以下代码,保存模型
- ```python
import paddlehub as hub
pyramidbox_lite_mobile_mask = hub.Module(name="pyramidbox_lite_mobile_mask")
2. 进行模型转换
# 将模型保存在test_program文件夹之中
pyramidbox_lite_mobile_mask.save_inference_model(dirname="test_program")
```
通过以上命令,可以获得人脸检测和口罩佩戴判断模型,分别存储在pyramidbox\_lite和mask\_detector之中。文件夹中的\_\_model\_\_是模型结构文件,\_\_params\_\_文件是权重文件。
从paddlehub下载的是预测模型,可以使用PaddleLite提供的模型优化工具OPT对预测模型进行转换,转换之后进而可以实现在手机等端侧硬件上的部署,具体请请参考[OPT工具](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)
- ### 进行模型转换
- 从paddlehub下载的是预测模型,可以使用PaddleLite提供的模型优化工具OPT对预测模型进行转换,转换之后进而可以实现在手机等端侧硬件上的部署,具体请请参考[OPT工具](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)
3. 模型通过Paddle Lite进行部署
- ### 模型通过Paddle Lite进行部署
- 参考[Paddle-Lite口罩检测模型部署教程](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx)
参考[Paddle-Lite口罩检测模型部署教程](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx)
## 五、更新历史
### 依赖
* 1.0.0
paddlepaddle >= 1.6.2
初始发布
paddlehub >= 1.6.0
* 1.3.0
- ```shell
$ hub install pyramidbox_lite_mobile_mask==1.3.0
```
```shell
$ hub install pyramidbox_lite_server==1.2.0
```
# pyramidbox_lite_server
## 命令行预测
|模型名称|pyramidbox_lite_server|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|PyramidBox|
|数据集|WIDER FACE数据集 + 百度自采人脸数据集|
|是否支持Fine-tuning|否|
|模型大小|8MB|
|最新更新日期|2021-02-26|
|数据指标|-|
```
hub run pyramidbox_lite_server --input_path "/PATH/TO/IMAGE"
```
## API
## 一、模型基本信息
```python
def face_detection(images=None,
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131602468-351eb3fb-81e3-4294-ac8e-b49a3a0232cb.jpg" width='50%' hspace='10'/>
<br />
</p>
- ### 模型介绍
- PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于人脸检测。
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install pyramidbox_lite_server
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run pyramidbox_lite_server --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
face_detector = hub.Module(name="pyramidbox_lite_server")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def face_detection(images=None,
paths=None,
data=None,
use_gpu=False,
output_dir='detection_result',
visualization=False,
shrink=0.5,
confs_threshold=0.6)
```
检测输入图片中的所有人脸位置
**参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* batch\_size (int): batch 的大小;
* use\_gpu (bool): 是否使用 GPU;
* visualization (bool): 是否将识别结果保存为图片文件;
* output\_dir (str): 图片的保存路径,默认设为 detection\_result;
* shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果。
* confs\_threshold (float): 置信度的阈值。
**返回**
* res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
* path (str): 原输入图片的路径;
* data (list): 检测结果,list 的每一个元素为 dict,各字段为:
* confidence (float): 识别的置信度;
* left (int): 边界框的左上角x坐标;
* top (int): 边界框的左上角y坐标;
* right (int): 边界框的右下角x坐标;
* bottom (int): 边界框的右下角y坐标。
```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
```
将模型保存到指定路径
- 检测输入图片中的所有人脸位置
**参数**
- **参数**
* dirname: 存在模型的目录名称
* model\_filename: 模型文件名称,默认为\_\_model\_\_
* params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- output\_dir (str): 图片的保存路径,默认设为 detection\_result;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果;<br/>
- confs\_threshold (float): 置信度的阈值。
## 代码示例
**NOTE:** paths和images两个参数选择其一进行提供数据
```python
import paddlehub as hub
import cv2
- **返回**
face_detector = hub.Module(name="pyramidbox_lite_server")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection((paths=['/PATH/TO/IMAGE'])
```
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
## 服务部署
PaddleHub Serving可以部署一个在线人脸检测服务。
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
- 将模型保存到指定路径。
## 第一步:启动PaddleHub Serving
- **参数**
运行启动命令:
```shell
$ hub serving start -m pyramidbox_lite_server
```
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
## 四、服务部署
## 第二步:发送预测请求
- PaddleHub Serving可以部署一个在线人脸检测服务。
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
- ### 第一步:启动PaddleHub Serving
```python
import requests
import json
import cv2
import base64
- 运行启动命令:
- ```shell
$ hub serving start -m pyramidbox_lite_server
```
- 这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
def cv2_to_base64(image):
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- ### 第二步:发送预测请求
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
- ```python
import requests
import json
import cv2
import base64
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_server"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_server"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
## 五、更新历史
# 打印预测结果
print(r.json()["results"])
```
* 1.0.0
### 依赖
初始发布
paddlepaddle >= 1.6.2
* 1.2.0
paddlehub >= 1.6.0
修复numpy数据读取问题
- ```shell
$ hub install pyramidbox_lite_server==1.2.0
```
```shell
$ hub install pyramidbox_lite_server_mask==1.3.0
```
# pyramidbox_lite_server_mask
## 命令行预测
|模型名称|pyramidbox_lite_server_mask|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|PyramidBox|
|数据集|WIDER FACE数据集 + 百度自采人脸数据集|
|是否支持Fine-tuning|否|
|模型大小|1.2MB|
|最新更新日期|2021-02-26|
|数据指标|-|
```
hub run pyramidbox_lite_server_mask --input_path "/PATH/TO/IMAGE"
```
## API
## 一、模型基本信息
```python
def __init__(face_detector_module=None)
```
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131603304-690a2e3b-9f24-42f6-9297-a12ada884191.jpg" width='50%' hspace='10'/>
<br />
</p>
**参数**
- ### 模型介绍
* face\_detector\_module (class): 人脸检测模型,默认为 pyramidbox\_lite\_server.
- PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于检测人脸是否佩戴口罩。
```python
def face_detection(images=None,
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install pyramidbox_lite_server_mask
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run pyramidbox_lite_server_mask --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
mask_detector = hub.Module(name="pyramidbox_lite_server_mask")
result = mask_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = mask_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def __init__(face_detector_module=None)
```
- **参数**
- face\_detector\_module (class): 人脸检测模型,默认为 pyramidbox\_lite\_server。
- ```python
def face_detection(images=None,
paths=None,
batch_size=1,
use_gpu=False,
......@@ -28,147 +81,134 @@ def face_detection(images=None,
output_dir='detection_result',
use_multi_scale=False,
shrink=0.5,
confs_threshold=0.6):
```
confs_threshold=0.6)
```
识别输入图片中的所有的人脸,并判断有无戴口罩。
- 识别输入图片中的所有的人脸,并判断有无戴口罩。
**参数**
- **参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* batch\_size (int): batch 的大小;
* use\_gpu (bool): 是否使用 GPU;
* visualization (bool): 是否将识别结果保存为图片文件;
* output\_dir (str): 图片的保存路径,默认设为 detection\_result。
* use\_multi\_scale (bool) : 用于设置是否开启多尺度的人脸检测,开启多尺度人脸检测能够更好的检测到输入图像中不同尺寸的人脸,但是会增加模型计算量,降低预测速度;
* shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果;
* confs\_threshold (float): 人脸检测的置信度的阈值。
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- batch\_size (int): batch 的大小;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- output\_dir (str): 图片的保存路径,默认设为 detection\_result;<br/>
- use\_multi\_scale (bool) : 用于设置是否开启多尺度的人脸检测,开启多尺度人脸检测能够更好的检测到输入图像中不同尺寸的人脸,但是会增加模型计算量,降低预测速度;<br/>
- shrink (float): 用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果;<br/>
- confs\_threshold (float): 置信度的阈值。
**返回**
**NOTE:** paths和images两个参数选择其一进行提供数据
* res (list\[dict\]): 识别结果的列表,列表元素为 dict, 有以下两个字段:
* path (str): 原图的路径。
* data (list\[dict\]): 识别的边界框列表,有以下字段:
* label (str): 识别标签,为 'NO MASK' 或者 'MASK';
* confidence (float): 识别的置信度;
* left (int): 边界框的左上角x坐标;
* top (int): 边界框的左上角y坐标;
* right (int): 边界框的右下角x坐标;
* bottom (int): 边界框的右下角y坐标;
- **返回**
```python
def set_face_detector_module(face_detector_module)
```
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- label (str): 识别标签,为 'NO MASK' 或者 'MASK';
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
设置口罩检测模型中进行人脸检测的底座模型。
- ```python
def set_face_detector_module(face_detector_module)
```
- 设置口罩检测模型中进行人脸检测的底座模型。
- **参数**
**参数**
- face\_detector\_module (class): 人脸检测模型。
* face\_detector\_module (class): 人脸检测模型
- ```python
def get_face_detector_module()
```
- 获取口罩检测模型中进行人脸检测的底座模型。
- **返回**
```python
def get_face_detector_module()
```
- 当前模型使用的人脸检测模型
获取口罩检测模型中进行人脸检测的底座模型。
**返回**
* 当前模型使用的人脸检测模型。
```python
def save_inference_model(dirname,
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
将模型保存到指定路径。
**参数**
```
- 将模型保存到指定路径。
* dirname: 存在模型的目录名称
* model\_filename: 模型文件名称,默认为\_\_model\_\_
* params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
- **参数**
## 代码示例
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
```python
import paddlehub as hub
import cv2
mask_detector = hub.Module(name="pyramidbox_lite_server_mask")
## 四、服务部署
result = mask_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = mask_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- PaddleHub Serving可以部署一个在线口罩检测服务。
## 服务部署
- ### 第一步:启动PaddleHub Serving
PaddleHub Serving可以部署一个在线人脸关键点检测服务。
- 运行启动命令:
- ```shell
$ hub serving start -m pyramidbox_lite_server_mask
```
## 第一步:启动PaddleHub Serving
- 这样就完成了一个口罩检测服务化API的部署,默认端口号为8866。
运行启动命令:
```shell
$ hub serving start -m pyramidbox_lite_server_mask
```
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
这样就完成了一个人脸关键点服务化API的部署,默认端口号为8866。
- ### 第二步:发送预测请求
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
## 第二步:发送预测请求
- ```python
import requests
import json
import cv2
import base64
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
```python
import requests
import json
import cv2
import base64
def cv2_to_base64(image):
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_server_mask"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
## Paddle Lite部署
1. 通过python执行以下代码,保存模型
```python
import paddlehub as hub
pyramidbox_lite_server_mask = hub.Module(name="pyramidbox_lite_server_mask")
# 将模型保存在test_program文件夹之中
pyramidbox_lite_server_mask.save_inference_model(dirname="test_program")
```
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/pyramidbox_lite_server_mask"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
通过以上命令,可以获得人脸检测和口罩佩戴判断模型,分别存储在pyramidbox\_lite和mask\_detector之中。文件夹中的\_\_model\_\_是模型结构文件,\_\_params\_\_文件是权重文件。
# 打印预测结果
print(r.json()["results"])
```
## 五、Paddle Lite部署
- ### 通过python执行以下代码,保存模型
- ```python
import paddlehub as hub
pyramidbox_lite_server_mask = hub.Module(name="pyramidbox_lite_server_mask")
2. 进行模型转换
# 将模型保存在test_program文件夹之中
pyramidbox_lite_server_mask.save_inference_model(dirname="test_program")
```
通过以上命令,可以获得人脸检测和口罩佩戴判断模型,分别存储在pyramidbox\_lite和mask\_detector之中。文件夹中的\_\_model\_\_是模型结构文件,\_\_params\_\_文件是权重文件。
从paddlehub下载的是预测模型,可以使用PaddleLite提供的模型优化工具OPT对预测模型进行转换,转换之后进而可以实现在手机等端侧硬件上的部署,具体请请参考[OPT工具](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)
- ### 进行模型转换
- 从paddlehub下载的是预测模型,可以使用PaddleLite提供的模型优化工具OPT对预测模型进行转换,转换之后进而可以实现在手机等端侧硬件上的部署,具体请请参考[OPT工具](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)
3. 模型通过Paddle Lite进行部署
- ### 模型通过Paddle Lite进行部署
- 参考[Paddle-Lite口罩检测模型部署教程](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx)
参考[Paddle-Lite口罩检测模型部署教程](https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx)
## 五、更新历史
### 依赖
* 1.0.0
paddlepaddle >= 1.6.2
初始发布
paddlehub >= 1.6.0
* 1.3.1
- ```shell
$ hub install pyramidbox_lite_server_mask==1.3.1
```
......@@ -43,7 +43,8 @@ def bbox_vote(det):
det_accu[:, 0:4] = det_accu[:, 0:4] * np.tile(det_accu[:, -1:], (1, 4))
max_score = np.max(det_accu[:, 4])
det_accu_sum = np.zeros((1, 5))
det_accu_sum[:, 0:4] = np.sum(det_accu[:, 0:4], axis=0) / np.sum(det_accu[:, -1:])
det_accu_sum[:, 0:4] = np.sum(
det_accu[:, 0:4], axis=0) / np.sum(det_accu[:, -1:])
det_accu_sum[:, 4] = max_score
try:
dets = np.row_stack((dets, det_accu_sum))
......@@ -53,26 +54,38 @@ def bbox_vote(det):
return dets
def crop(image, pts, shift=0, scale=1.5, rotate=0, res_width=128, res_height=128):
def crop(image,
pts,
shift=0,
scale=1.5,
rotate=0,
res_width=128,
res_height=128):
res = (res_width, res_height)
idx1 = 0
idx2 = 1
# angle
alpha = 0
if pts[idx2, 0] != -1 and pts[idx2, 1] != -1 and pts[idx1, 0] != -1 and pts[idx1, 1] != -1:
alpha = math.atan2(pts[idx2, 1] - pts[idx1, 1], pts[idx2, 0] - pts[idx1, 0]) * 180 / math.pi
if pts[idx2, 0] != -1 and pts[idx2, 1] != -1 and pts[idx1, 0] != -1 and pts[
idx1, 1] != -1:
alpha = math.atan2(pts[idx2, 1] - pts[idx1, 1],
pts[idx2, 0] - pts[idx1, 0]) * 180 / math.pi
pts[pts == -1] = np.inf
coord_min = np.min(pts, 0)
pts[pts == np.inf] = -1
coord_max = np.max(pts, 0)
# coordinates of center point
c = np.array([coord_max[0] - (coord_max[0] - coord_min[0]) / 2,
coord_max[1] - (coord_max[1] - coord_min[1]) / 2]) # center
max_wh = max((coord_max[0] - coord_min[0]) / 2, (coord_max[1] - coord_min[1]) / 2)
c = np.array([
coord_max[0] - (coord_max[0] - coord_min[0]) / 2,
coord_max[1] - (coord_max[1] - coord_min[1]) / 2
]) # center
max_wh = max((coord_max[0] - coord_min[0]) / 2,
(coord_max[1] - coord_min[1]) / 2)
# Shift the center point, rot add eyes angle
c = c + shift * max_wh
rotate = rotate + alpha
M = cv2.getRotationMatrix2D((c[0], c[1]), rotate, res[0] / (2 * max_wh * scale))
M = cv2.getRotationMatrix2D((c[0], c[1]), rotate,
res[0] / (2 * max_wh * scale))
M[0, 2] = M[0, 2] - (c[0] - res[0] / 2.0)
M[1, 2] = M[1, 2] - (c[1] - res[0] / 2.0)
image_out = cv2.warpAffine(image, M, res)
......@@ -84,24 +97,27 @@ def color_normalize(image, mean, std=None):
image = np.repeat(image, axis=2)
h, w, c = image.shape
image = np.transpose(image, (2, 0, 1))
image = np.subtract(image.reshape(c, -1), mean[:, np.newaxis]).reshape(-1, h, w)
image = np.subtract(image.reshape(c, -1), mean[:, np.newaxis]).reshape(
-1, h, w)
image = np.transpose(image, (1, 2, 0))
return image
def process_image(org_im, face):
pts = np.array([
face['left'], face['top'], face['right'], face['top'], face['left'], face['bottom'], face['right'],
face['bottom']
face['left'], face['top'], face['right'], face['top'], face['left'],
face['bottom'], face['right'], face['bottom']
]).reshape(4, 2).astype(np.float32)
image_in, M = crop(org_im, pts)
image_in = image_in / 256.0
image_in = color_normalize(image_in, mean=np.array([0.5, 0.5, 0.5]))
image_in = image_in.astype(np.float32).transpose([2, 0, 1]).reshape(-1, 3, 128, 128)
image_in = image_in.astype(np.float32).transpose([2, 0, 1]).reshape(
-1, 3, 128, 128)
return image_in
def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu, use_multi_scale):
def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu,
use_multi_scale):
"""
Preprocess to yield image.
......@@ -126,7 +142,8 @@ def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu, use_m
assert type(paths) is list, "paths should be a list."
for im_path in paths:
each = OrderedDict()
assert os.path.isfile(im_path), "The {} isn't a valid file path.".format(im_path)
assert os.path.isfile(
im_path), "The {} isn't a valid file path.".format(im_path)
im = cv2.imread(im_path)
each['org_im'] = im
each['org_im_path'] = im_path
......@@ -136,7 +153,8 @@ def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu, use_m
for im in images:
each = OrderedDict()
each['org_im'] = im
each['org_im_path'] = 'ndarray_time={}'.format(round(time.time(), 6) * 1e6)
each['org_im_path'] = 'ndarray_time={}'.format(
round(time.time(), 6) * 1e6)
component.append(each)
for element in component:
......@@ -153,19 +171,30 @@ def reader(face_detector, shrink, confs_threshold, images, paths, use_gpu, use_m
_s = list()
for _face in _detect_res[0]['data']:
_face_list = [_face['left'], _face['top'], _face['right'], _face['bottom'], _face['confidence']]
_face_list = [
_face['left'], _face['top'], _face['right'],
_face['bottom'], _face['confidence']
]
_s.append(_face_list)
if _s:
scale_res.append(np.array(_s))
if scale_res:
scale_res = np.row_stack(scale_res)
scale_res = bbox_vote(scale_res)
keep_index = np.where(scale_res[:, 4] >= confs_threshold)[0]
scale_res = scale_res[keep_index, :]
for data in scale_res:
face = {'left': data[0], 'top': data[1], 'right': data[2], 'bottom': data[3], 'confidence': data[4]}
face = {
'left': data[0],
'top': data[1],
'right': data[2],
'bottom': data[3],
'confidence': data[4]
}
detect_faces.append(face)
else:
detect_faces = []
else:
_detect_res = face_detector.face_detection(
images=[element['org_im']],
......
......@@ -23,14 +23,15 @@ from pyramidbox_lite_server_mask.processor import postprocess, base64_to_cv2
author_email="",
summary=
"PyramidBox-Lite-Server-Mask is a high-performance face detection model used to detect whether people wear masks.",
version="1.3.0")
version="1.3.1")
class PyramidBoxLiteServerMask(hub.Module):
def _initialize(self, face_detector_module=None):
"""
Args:
face_detector_module (class): module to detect face.
"""
self.default_pretrained_model_path = os.path.join(self.directory, "pyramidbox_lite_server_mask_model")
self.default_pretrained_model_path = os.path.join(
self.directory, "pyramidbox_lite_server_mask_model")
if face_detector_module is None:
self.face_detector = hub.Module(name='pyramidbox_lite_server')
else:
......@@ -56,7 +57,8 @@ class PyramidBoxLiteServerMask(hub.Module):
if use_gpu:
gpu_config = AnalysisConfig(self.default_pretrained_model_path)
gpu_config.disable_glog_info()
gpu_config.enable_use_gpu(memory_pool_init_size_mb=1000, device_id=0)
gpu_config.enable_use_gpu(
memory_pool_init_size_mb=1000, device_id=0)
self.gpu_predictor = create_paddle_predictor(gpu_config)
def set_face_detector_module(self, face_detector_module):
......@@ -105,7 +107,7 @@ class PyramidBoxLiteServerMask(hub.Module):
int(_places[0])
except:
raise RuntimeError(
"Environment Variable CUDA_VISIBLE_DEVICES is not set correctly. If you wanna use gpu, please set CUDA_VISIBLE_DEVICES as cuda_device_id."
"Attempt to use GPU for prediction, but environment variable CUDA_VISIBLE_DEVICES was not set correctly."
)
# compatibility with older versions
......@@ -121,13 +123,16 @@ class PyramidBoxLiteServerMask(hub.Module):
# get all data
all_element = list()
for yield_data in reader(self.face_detector, shrink, confs_threshold, images, paths, use_gpu, use_multi_scale):
for yield_data in reader(self.face_detector, shrink, confs_threshold,
images, paths, use_gpu, use_multi_scale):
all_element.append(yield_data)
image_list = list()
element_image_num = list()
for i in range(len(all_element)):
element_image = [handled['image'] for handled in all_element[i]['preprocessed']]
element_image = [
handled['image'] for handled in all_element[i]['preprocessed']
]
element_image_num.append(len(element_image))
image_list.extend(element_image)
......@@ -146,7 +151,9 @@ class PyramidBoxLiteServerMask(hub.Module):
image_arr = np.squeeze(np.array(batch_data), axis=1)
image_tensor = PaddleTensor(image_arr.copy())
data_out = self.gpu_predictor.run([image_tensor]) if use_gpu else self.cpu_predictor.run([image_tensor])
data_out = self.gpu_predictor.run([
image_tensor
]) if use_gpu else self.cpu_predictor.run([image_tensor])
# len(data_out) == 1
# data_out[0].as_ndarray().shape == (-1, 2)
data_out = data_out[0].as_ndarray()
......@@ -156,7 +163,9 @@ class PyramidBoxLiteServerMask(hub.Module):
# postprocess one by one
res = list()
for i in range(len(all_element)):
detect_faces_list = [handled['face'] for handled in all_element[i]['preprocessed']]
detect_faces_list = [
handled['face'] for handled in all_element[i]['preprocessed']
]
interval_left = sum(element_image_num[0:i])
interval_right = interval_left + element_image_num[i]
out = postprocess(
......@@ -169,16 +178,31 @@ class PyramidBoxLiteServerMask(hub.Module):
res.append(out)
return res
def save_inference_model(self, dirname, model_filename=None, params_filename=None, combined=True):
def save_inference_model(self,
dirname,
model_filename=None,
params_filename=None,
combined=True):
classifier_dir = os.path.join(dirname, 'mask_detector')
detector_dir = os.path.join(dirname, 'pyramidbox_lite')
self._save_classifier_model(classifier_dir, model_filename, params_filename, combined)
self._save_detector_model(detector_dir, model_filename, params_filename, combined)
self._save_classifier_model(classifier_dir, model_filename,
params_filename, combined)
self._save_detector_model(detector_dir, model_filename, params_filename,
combined)
def _save_detector_model(self, dirname, model_filename=None, params_filename=None, combined=True):
self.face_detector.save_inference_model(dirname, model_filename, params_filename, combined)
def _save_detector_model(self,
dirname,
model_filename=None,
params_filename=None,
combined=True):
self.face_detector.save_inference_model(dirname, model_filename,
params_filename, combined)
def _save_classifier_model(self, dirname, model_filename=None, params_filename=None, combined=True):
def _save_classifier_model(self,
dirname,
model_filename=None,
params_filename=None,
combined=True):
if combined:
model_filename = "__model__" if not model_filename else model_filename
params_filename = "__params__" if not params_filename else params_filename
......@@ -216,9 +240,12 @@ class PyramidBoxLiteServerMask(hub.Module):
prog='hub run {}'.format(self.name),
usage='%(prog)s',
add_help=True)
self.arg_input_group = self.parser.add_argument_group(title="Input options", description="Input data. Required")
self.arg_input_group = self.parser.add_argument_group(
title="Input options", description="Input data. Required")
self.arg_config_group = self.parser.add_argument_group(
title="Config options", description="Run configuration for controlling module behavior, not required.")
title="Config options",
description=
"Run configuration for controlling module behavior, not required.")
self.add_module_config_arg()
self.add_module_input_arg()
args = self.parser.parse_args(argvs)
......@@ -236,21 +263,36 @@ class PyramidBoxLiteServerMask(hub.Module):
Add the command config options.
"""
self.arg_config_group.add_argument(
'--use_gpu', type=ast.literal_eval, default=False, help="whether use GPU or not")
'--use_gpu',
type=ast.literal_eval,
default=False,
help="whether use GPU or not")
self.arg_config_group.add_argument(
'--output_dir', type=str, default='detection_result', help="The directory to save output images.")
'--output_dir',
type=str,
default='detection_result',
help="The directory to save output images.")
self.arg_config_group.add_argument(
'--visualization', type=ast.literal_eval, default=False, help="whether to save output as images.")
'--visualization',
type=ast.literal_eval,
default=False,
help="whether to save output as images.")
def add_module_input_arg(self):
"""
Add the command input options.
"""
self.arg_input_group.add_argument('--input_path', type=str, help="path to image.")
self.arg_input_group.add_argument(
'--input_path', type=str, help="path to image.")
self.arg_input_group.add_argument(
'--shrink',
type=ast.literal_eval,
default=0.5,
help="resize the image to `shrink * original_shape` before feeding into network.")
help=
"resize the image to `shrink * original_shape` before feeding into network."
)
self.arg_input_group.add_argument(
'--confs_threshold', type=ast.literal_eval, default=0.6, help="confidence threshold.")
'--confs_threshold',
type=ast.literal_eval,
default=0.6,
help="confidence threshold.")
......@@ -57,7 +57,8 @@ def get_save_image_name(org_im, org_im_path, output_dir):
# save image path
save_im_path = os.path.join(output_dir, im_prefix + ext)
if os.path.exists(save_im_path):
save_im_path = os.path.join(output_dir, im_prefix + 'time={}'.format(int(time.time())) + ext)
save_im_path = os.path.join(
output_dir, im_prefix + 'time={}'.format(int(time.time())) + ext)
return save_im_path
......@@ -68,13 +69,19 @@ def draw_bounding_box_on_image(save_im_path, output_data):
for bbox in output_data:
# draw bouding box
if bbox['label'] == "MASK":
draw.line([(bbox['left'], bbox['top']), (bbox['left'], bbox['bottom']), (bbox['right'], bbox['bottom']),
(bbox['right'], bbox['top']), (bbox['left'], bbox['top'])],
draw.line([(bbox['left'], bbox['top']),
(bbox['left'], bbox['bottom']),
(bbox['right'], bbox['bottom']),
(bbox['right'], bbox['top']),
(bbox['left'], bbox['top'])],
width=2,
fill='green')
else:
draw.line([(bbox['left'], bbox['top']), (bbox['left'], bbox['bottom']), (bbox['right'], bbox['bottom']),
(bbox['right'], bbox['top']), (bbox['left'], bbox['top'])],
draw.line([(bbox['left'], bbox['top']),
(bbox['left'], bbox['bottom']),
(bbox['right'], bbox['bottom']),
(bbox['right'], bbox['top']),
(bbox['left'], bbox['top'])],
width=2,
fill='red')
# draw label
......@@ -88,13 +95,16 @@ def draw_bounding_box_on_image(save_im_path, output_data):
text_fill = (0)
draw.rectangle(
xy=(bbox['left'], bbox['top'] - (textsize_height + 5), bbox['left'] + textsize_width + 10, bbox['top'] - 3),
xy=(bbox['left'], bbox['top'] - (textsize_height + 5),
bbox['left'] + textsize_width + 10, bbox['top'] - 3),
fill=box_fill)
draw.text(xy=(bbox['left'], bbox['top'] - 15), text=text, fill=text_fill)
draw.text(
xy=(bbox['left'], bbox['top'] - 15), text=text, fill=text_fill)
image.save(save_im_path)
def postprocess(confidence_out, org_im, org_im_path, detected_faces, output_dir, visualization):
def postprocess(confidence_out, org_im, org_im_path, detected_faces, output_dir,
visualization):
"""
Postprocess output of network. one element at a time.
......
## 命令行预测
# ultra_light_fast_generic_face_detector_1mb_320
```
hub run ultra_light_fast_generic_face_detector_1mb_320 --input_path "/PATH/TO/IMAGE"
```
|模型名称|ultra_light_fast_generic_face_detector_1mb_320|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|Ultra-Light-Fast-Generic-Face-Detector-1MB|
|数据集|WIDER FACE数据集|
|是否支持Fine-tuning|否|
|模型大小|2.6MB|
|最新更新日期|2021-02-26|
|数据指标|-|
## API
```python
def face_detection(images=None,
## 一、模型基本信息
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131604811-bce29c3f-66f7-45cb-a388-d739368bfeb9.jpg" width='50%' hspace='10'/>
<br />
</p>
- ### 模型介绍
- Ultra-Light-Fast-Generic-Face-Detector-1MB是针对边缘计算设备或低算力设备(如用ARM推理)设计的实时超轻量级通用人脸检测模型,可以在低算力设备中如用ARM进行实时的通用场景的人脸检测推理。该PaddleHub Module的预训练数据集为WIDER FACE数据集,可支持预测,在预测时会将图片输入缩放为320 * 240。
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install ultra_light_fast_generic_face_detector_1mb_320
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run ultra_light_fast_generic_face_detector_1mb_320 --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
face_detector = hub.Module(name="ultra_light_fast_generic_face_detector_1mb_320")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def face_detection(images=None,
paths=None,
batch_size=1,
batch\_size=1,
use_gpu=False,
output_dir='face_detector_640_predict_output',
visualization=False,
output_dir=None,
confs_threshold=0.5):
```
confs_threshold=0.5)
```
检测输入图片中的所有人脸位置
- 检测输入图片中的所有人脸位置。
**参数**
- **参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* batch\_size (int): batch 的大小;
* use\_gpu (bool): 是否使用 GPU;
* visualization (bool): 是否将识别结果保存为图片文件;
* output\_dir (str): 图片的保存路径,当为 None 时,默认设为face\_detector\_320\_predict\_output;
* confs\_threshold (float): 置信度的阈值。
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- batch\_size (int): batch 的大小;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- output\_dir (str): 图片的保存路径,默认设为 face\_detector\_640\_predict\_output;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- confs\_threshold (float): 置信度的阈值。
**返回**
**NOTE:** paths和images两个参数选择其一进行提供数据
* res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,关键字有 path, save\_path, data,其中:
* path 字段为原输入图片的路径(仅当使用paths输入时存在);
* save\_path 字段为可视化图片的保存路径(仅当visualization=True时存在);
* data 字段为检测结果,类型为list,list的每一个元素为dict,其中'left', 'right', 'top', 'bottom' 为人脸识别框,'confidence' 为此识别框置信度。
- **返回**
```python
def save_inference_model(dirname,
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
- save\_path 字段为可视化图片的保存路径(仅当visualization=True时存在)
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
将模型保存到指定路径。
```
- 将模型保存到指定路径。
**参数**
- **参数**
* dirname: 存在模型的目录名称
* model_filename: 模型文件名称,默认为\_\_model\_\_
* params_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
## 代码示例
```python
import paddlehub as hub
import cv2
## 四、服务部署
face_detector = hub.Module(name="ultra_light_fast_generic_face_detector_1mb_320")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection((paths=['/PATH/TO/IMAGE'])
```
- PaddleHub Serving可以部署一个在线人脸检测服务。
## 服务部署
- ### 第一步:启动PaddleHub Serving
PaddleHub Serving可以部署一个在线人脸检测服务。
- 运行启动命令:
- ```shell
$ hub serving start -m ultra_light_fast_generic_face_detector_1mb_320
```
## 第一步:启动PaddleHub Serving
- 这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
运行启动命令:
```shell
$ hub serving start -m ultra_light_fast_generic_face_detector_1mb_320
```
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
- ### 第二步:发送预测请求
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
## 第二步:发送预测请求
- ```python
import requests
import json
import cv2
import base64
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
```python
import requests
import json
import cv2
import base64
import paddlehub as hub
def cv2_to_base64(image):
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ultra_light_fast_generic_face_detector_1mb_320"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
### 查看代码
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ultra_light_fast_generic_face_detector_1mb_320"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB
# 打印预测结果
print(r.json()["results"])
```
### 贡献者
[Jason](https://github.com/jiangjiajun)[Channingss](https://github.com/Channingss)
## 五、更新历史
### 依赖
* 1.0.0
paddlepaddle >= 1.6.2
初始发布
paddlehub >= 1.6.0
* 1.1.2
- ```shell
$ hub install ultra_light_fast_generic_face_detector_1mb_320==1.1.2
```
## 命令行预测
# ultra_light_fast_generic_face_detector_1mb_640
```
hub run ultra_light_fast_generic_face_detector_1mb_640 --input_path "/PATH/TO/IMAGE"
```
|模型名称|ultra_light_fast_generic_face_detector_1mb_640|
| :--- | :---: |
|类别|图像 - 人脸检测|
|网络|Ultra-Light-Fast-Generic-Face-Detector-1MB|
|数据集|WIDER FACE数据集|
|是否支持Fine-tuning|否|
|模型大小|2.9MB|
|最新更新日期|2021-02-26|
|数据指标|-|
## API
```python
def face_detection(images=None,
## 一、模型基本信息
- ### 应用效果展示
- 样例结果示例:
<p align="center">
<img src="https://user-images.githubusercontent.com/22424850/131604811-bce29c3f-66f7-45cb-a388-d739368bfeb9.jpg" width='50%' hspace='10'/>
<br />
</p>
- ### 模型介绍
- Ultra-Light-Fast-Generic-Face-Detector-1MB是针对边缘计算设备或低算力设备(如用ARM推理)设计的实时超轻量级通用人脸检测模型,可以在低算力设备中如用ARM进行实时的通用场景的人脸检测推理。该PaddleHub Module的预训练数据集为WIDER FACE数据集,可支持预测,在预测时会将图片输入缩放为640 * 480。
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装paddlehub](../../../../docs/docs_ch/get_start/installation.rst)
- ### 2、安装
- ```shell
$ hub install ultra_light_fast_generic_face_detector_1mb_640
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run ultra_light_fast_generic_face_detector_1mb_640 --input_path "/PATH/TO/IMAGE"
```
- 通过命令行方式实现人脸检测模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、代码示例
- ```python
import paddlehub as hub
import cv2
face_detector = hub.Module(name="ultra_light_fast_generic_face_detector_1mb_640")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection(paths=['/PATH/TO/IMAGE'])
```
- ### 3、API
- ```python
def face_detection(images=None,
paths=None,
batch_size=1,
batch\_size=1,
use_gpu=False,
output_dir='face_detector_640_predict_output',
visualization=False,
output_dir=None,
confs_threshold=0.5):
```
confs_threshold=0.5)
```
检测输入图片中的所有人脸位置
- 检测输入图片中的所有人脸位置。
**参数**
- **参数**
* images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;
* paths (list\[str\]): 图片的路径;
* batch\_size (int): batch 的大小;
* use\_gpu (bool): 是否使用 GPU;
* visualization (bool): 是否将识别结果保存为图片文件;
* output\_dir (str): 图片的保存路径,当为 None 时,默认设为face\_detector\_640\_predict\_output;
* confs\_threshold (float): 置信度的阈值。
- images (list\[numpy.ndarray\]): 图片数据,ndarray.shape 为 \[H, W, C\],BGR格式;<br/>
- paths (list\[str\]): 图片的路径;<br/>
- batch\_size (int): batch 的大小;<br/>
- use\_gpu (bool): 是否使用 GPU;<br/>
- output\_dir (str): 图片的保存路径,默认设为 face\_detector\_640\_predict\_output;<br/>
- visualization (bool): 是否将识别结果保存为图片文件;<br/>
- confs\_threshold (float): 置信度的阈值。
**返回**
**NOTE:** paths和images两个参数选择其一进行提供数据
* res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,关键字有 path, save\_path, data,其中:
* path 字段为原输入图片的路径(仅当使用paths输入时存在);
* save\_path 字段为可视化图片的保存路径(仅当visualization=True时存在);
* data 字段为检测结果,类型为list,list的每一个元素为dict,其中'left', 'right', 'top', 'bottom' 为人脸识别框,'confidence' 为此识别框置信度。
- **返回**
```python
def save_inference_model(dirname,
- res (list\[dict\]): 识别结果的列表,列表中每一个元素为 dict,各字段为:
- path (str): 原输入图片的路径
- data (list): 检测结果,list的每一个元素为 dict,各字段为:
- confidence (float): 识别的置信度
- left (int): 边界框的左上角x坐标
- top (int): 边界框的左上角y坐标
- right (int): 边界框的右下角x坐标
- bottom (int): 边界框的右下角y坐标
- save\_path 字段为可视化图片的保存路径(仅当visualization=True时存在)
- ```python
def save_inference_model(dirname,
model_filename=None,
params_filename=None,
combined=True)
```
将模型保存到指定路径。
```
- 将模型保存到指定路径。
**参数**
- **参数**
* dirname: 存在模型的目录名称
* model_filename: 模型文件名称,默认为\_\_model\_\_
* params_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效)
* combined: 是否将参数保存到统一的一个文件中
- dirname: 存在模型的目录名称; <br/>
- model\_filename: 模型文件名称,默认为\_\_model\_\_; <br/>
- params\_filename: 参数文件名称,默认为\_\_params\_\_(仅当`combined`为True时生效);<br/>
- combined: 是否将参数保存到统一的一个文件中。
## 预测代码示例
```python
import paddlehub as hub
import cv2
## 四、服务部署
face_detector = hub.Module(name="ultra_light_fast_generic_face_detector_1mb_640")
result = face_detector.face_detection(images=[cv2.imread('/PATH/TO/IMAGE')])
# or
# result = face_detector.face_detection((paths=['/PATH/TO/IMAGE'])
```
- PaddleHub Serving可以部署一个在线人脸检测服务。
## 服务部署
- ### 第一步:启动PaddleHub Serving
PaddleHub Serving可以部署一个在线人脸检测服务。
- 运行启动命令:
- ```shell
$ hub serving start -m ultra_light_fast_generic_face_detector_1mb_640
```
## 第一步:启动PaddleHub Serving
- 这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
运行启动命令:
```shell
$ hub serving start -m ultra_light_fast_generic_face_detector_1mb_640
```
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
这样就完成了一个人脸检测服务化API的部署,默认端口号为8866。
- ### 第二步:发送预测请求
**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量,否则不用设置。
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
## 第二步:发送预测请求
- ```python
import requests
import json
import cv2
import base64
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
```python
import requests
import json
import cv2
import base64
import paddlehub as hub
def cv2_to_base64(image):
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ultra_light_fast_generic_face_detector_1mb_640"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(r.json()["results"])
```
### 查看代码
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ultra_light_fast_generic_face_detector_1mb_640"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB
# 打印预测结果
print(r.json()["results"])
```
### 贡献者
[Jason](https://github.com/jiangjiajun)[Channingss](https://github.com/Channingss)
## 五、更新历史
### 依赖
* 1.0.0
paddlepaddle >= 1.6.2
初始发布
paddlehub >= 1.6.0
* 1.1.2
- ```shell
$ hub install ultra_light_fast_generic_face_detector_1mb_640==1.1.2
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册