
# 人脸检测技能
#### 技能描述
面向智慧商超的人脸采集技能。本技能使用多个深度学习算法，实时分析视频流，自动抓取画面中的清晰人脸上传至您的后台系统，用于后续实现其他业务。
本技能支持：
- 判断并过滤尺寸过小、清晰度较差、角度过大等无法判断的人脸。
- 同时检测多张人脸。
- 人脸跟踪。对同一个人抓拍的人脸做去重，避免大量的重复上报。
- 根据业务需求划定区域，只抓取固定区域内的人脸。
使用时需要提供您的业务RESTful接口和RTSP视频地址，最大支持10路网络摄像头接入，并按照接入的路数进行收费。
摄像头部署建议请参见[摄像头部署]。
技能配置项请参见[运行时配置参数]。
技能接口设计请参见[技能结果上传接口]。
#### 基本信息
人脸检测技能的基本信息如[表1]所示。
 表1技能参数说明 
| 参数      | 说明                                      |
|:---|:---|
| 技能名称    | 人脸检测                                    |
| 技能版本    | 1.0.9                                   |
| 适用芯片    | Ascend 310                              |
| OS平台    | Linux                                   |
| 应用场景    | 商超                                      |
| 支持固件版本  | HiLens Framework 1.0.0及以上，DDK887/DDK893 |
| 最大路数    | 最多10路                                   |
| 视频流传输协议 | RTSP                                    |
| 输入方式    | 外接IPC摄像头                                |
| 输出方式    | POST                                    |
   
 #### 摄像头部署
摄像头的架设会影响人脸检测模型的准确率。在实际架设中，尽量保证拍摄画面清晰，光照充足，人脸较正，无遮挡，比如前边的人脸容易挡住后边的人脸。监控视频场景下尽量保证拍摄的画面能拍到更多的正脸。
**摄像头参数基本设置**
不同品牌的摄像头都有一些基本的视频设置，例如分辨率、帧率和码率等，参数要求如[表2]所示。
 表2摄像头参数设置要求 
| 参数       | 要求                                                                     |
|:---|:---|
| **分辨率**  | 不低于720P，如果需要做人脸识别和去重不低于1080P，不高于4K（3840\*2160）。                        |
| **帧率**   | 不高于25fps，不低于15fps，建议值20fps。                                            |
| **码率**   | 720P建议设为4096Kbps\~6144Kbps左右，1080P建议设为6144Kpbs\~8192Kbps，更高分辨率可设置更高码率。 |
| **视频编码** | 如果支持H.265，设置为H.265。                                                    |
| **日夜切换** | 关闭夜间自动切换红外模式，暂不支持抓取红外模式下的人脸。                                           |
| **宽动态**  | 关闭宽动态。普通摄像头的宽动态无法到达专业相机的效果，人的走动速度较快时存在运动模糊，应关闭宽动态设置。                   |
   
**人脸角度要求**
人脸角度按照三个维度定义：人脸抬头低头角度（pitch），正面人脸旋转角度（roll），前后转头偏转角度（yaw）。人脸检测算法对三个空间维度都有限制。检测模型根据三个维度做姿态评估以后，将检测到的人脸图片发送出来。如果摄像头安装角度不合适，拍摄的画面容易将一些正脸误检为侧脸，在安装好摄像头以后，需要安装人员在现场走进画面实际测试，确认拍摄的人脸画面不产生过大的角度，不会造成算法无法抓到人脸。
请保证人在正常行走中，视频中人脸成像前后转头偏转角度"yaw"不超过45°（即摄像头无斜拍），人脸抬头低头角度"pitch"不超过30°（即摄像头架设俯视角合理），人脸旋转角度"roll"不超过20°（即摄像头两侧水平，无倾斜角），满足上述正脸姿态要求。
**人脸大小要求**
对于不可调焦距的摄像头，摄像头应安装在距离抓拍点较近处，使得人脸在画面中的像素大小不小于30px\*30px。摄像头架设建议如下。
架设高度：2m-2.5m
监控距离：5m-6m
监控宽度：2m-3m
俯视角度：15°左右
对于可调焦距摄像头，应调节焦段使得人脸像素大小满足大于30px\*30px的要求。
如果抓取人脸后还需发送给FRS服务，请保证人脸像素大小大于80px\*80px，对应设置[运行时配置参数]中的"cropSizeMin"参数值为"80"。
**光照要求**
光照条件要求需要满足以下几项：
- 行人正脸光照强度较好，光线过强和过弱都不太合适。 如果不满足此要求，例如在夜晚或光线不足的白天等环境，会使得采集人脸图像曝光不足，获取的人脸画面偏暗、噪点偏多，导致发送至FRS服务的图片正确率偏低。
  
- 人脸两侧光照强度差值不宜过大。 如果不满足此要求，即左右侧光照强度如果差异过大，采集的人脸图像有"阴阳脸"现象（半张脸暗，半张脸亮）。
  
- 行人背面光照强度\<正面光照强度\* 2。 如果不满足此要求，即行人背面光照强度远大于正面光照强度，采集人脸图像有严重"背光"现象，最终导致人脸曝光不足，五官细节丢失。
  
- 室外安装摄像头不宜正对着太阳光，会导致人脸拍摄光照不均，造成人脸反光。 如果不满足此要求，会导致光线太强和太弱，人脸五官细节都会丢失。
  
- 室外摄像头安装，不宜选择背阴严重或者有遮挡物挡住光线的地方架设。 如果不满足此要求，会导致光线太强和太弱，人脸五官细节都会丢失。
  
如果现场的光线不满足上述要求，则需要通过强光抑制或补光来优化现场的光照条件。强光抑制可以改善"阴阳脸"、"背光"现象，即通过减弱侧面光照来改善光照条件。补光则可以通过增加额外光源的方式改善光照条件，提高人脸图像的采集效果；主要通过普通射灯、白炽灯等在不影响装修、路人视觉效果的情况下提高人脸的光照度，消除"阴阳脸"。
**周围环境要求**
- 镜头前方不要有遮挡的障碍物，容易挡住人脸，造成漏检。
- 不要将摄像头架在房子遮阴的挡板下，会造成光照过暗，人脸完全看不清。
- 室内安装摄像头，部署在楼道里需要注意光照，楼道里灯光明暗交替变化过快，摄像头拍摄时获取的画面可能会偏暗，检测到的人脸发送给FRS后，正确率较低。比如，走廊较长，楼道光照较暗，人距离摄像头较远时，检测出的人脸很模糊。
- 室外安装摄像头，需要注意雨雪的影响，避免在露天下布置，雨水或者雪将摄像头的镜头盖住，造成拍摄画面模糊不清。
 
 #### 运行时配置参数
技能在运行时，需要[添加运行时配置](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0011.html)。配置完成后，参数会从华为HiLens云侧下发到端侧设备。
- **配置参数说明**
  技能相关配置参数设计如[表3]所示。
   表3运行时配置参数 
  | 名称           | 是否必选 | 参数类型 | 说明                                                             |
  |:---|:---|:---|:---|
  | logLevel     | 是    | Enum | 日志级别，包括INFO，DEBUG，WARNING和ERROR。建议设置为INFO。                     |
  | keep_running | 是    | Int  | 当技能崩溃是否自动拉起技能并持续运行。此项配置在1.1.0及以后版本起作用。                         |
  | multi_camera | 是    | List | 一个设备上多路视频的技能参数，详情请参见[表4]。 |
     
   表4视频参数说明 
  | 名称                         | 是否必选 | 参数类型   | 说明                                                                                                                           |
  |:---|:---|:---|:---|
  | camera_names               | 是    | List   | 摄像头名称。可配置多个名称，表示多个摄像头采用同样的技能配置。                                                                                              |
  | sendOriImgFlag             | 是    | Int    | 是否发送人脸背景原始图,默认值：0。 0：表示不发送 1：表示发送                          |
  | sendRepeatFaceFlag         | 是    | Int    | 是否重复发送清晰人脸图，开关打开后，同一个人只要显示更清晰的人脸会重复发送, 默认值：0。 0：表示不发送 1：表示发送 |
  | sendOriImgCompressionRatio | 否    | Int    | 原始图jpeg压缩百分比，默认值为90,表示图片压缩比90%，取值范围\[1 100\]。                                                                                |
  | cropSizeMax                | 否    | Int    | 发送人脸图片长宽的最大像素，默认值400。                                                                                                        |
  | cropSizeMin                | 否    | Int    | 发送人脸图片长宽的最小像素，默认值80。                                                                                                         |
  | roi                        | 否    | String | 检测区域配置。区域的设置由Polygon开头，其后依次为区域的坐标(按顺时针排列的x，y坐标)。默认值为Polygon 0 0 0 0，表示检测整个画面。                                                |
  | sendUrl                    | 是    | String | 发送技能消息POST请求的URL地址。                                                                                                          |
  | faceQualityThreshold       | 是    | Float  | 人脸清晰度阈值。清晰度大于此值的人脸才发送。取值范围\[0.0, 1.0\]，默认值0.38。                                                                              |
  | centerMode                 | 否    | Int    | 是否只检测roi区域中的最大人脸，默认值0。 0：返回所有人脸。 1：只返回roi中最大的人脸。          |
     
  
- **示例**
  HiLens Kit设备支持多路摄像头接入，如果要为不同的摄像头设置不同的技能配置，或者几个摄像头共用同一技能配置，则可在配置列表中给出相应的配置信息，示例如下：
  ```
  //Store001的两个摄像头pos1和pos2配置不同参数：
  { 
    "logLevel": "INFO",
    "keep_running": 1,
    "multi_camera": 
           [{
            "camera_names": ["store001_pos1"],
            "sendOriImgFlag": 0,
            "sendRepeatFaceFlag": 0,
            "sendOriImgCompressionRatio": 90,
            "cropSizeMax": 400,
            "cropSizeMin": 120,
            "roi": "Polygon 0 0 0 0",
            "sendUrl": "https://abc.company.com/face",
            "faceQualityThreshold": 0.45,
            "centerMode": 0
           },
           {
           "camera_names": ["store001_pos2"],
           "sendOriImgFlag": 1,
           "sendRepeatFaceFlag": 1,
           "sendOriImgCompressionRatio": 100,
           "cropSizeMax": 300,
           "cropSizeMin": 80,
           "roi": "Polygon 0 0 0 0",
           "sendUrl": "https://abc.company.com/face",
           "faceQualityThreshold": 0.55,
           "centerMode": 0
            }]
  }
  //Store002的两个摄像头pos1和pos2配置相同参数：
  { 
    "logLevel": "INFO",
    "keep_running": 1,
    "multi_camera": 
           [{
           "camera_names": ["store002_pos1","store002_pos2"],
           "sendOriImgFlag": 0,
           "sendRepeatFaceFlag": 0,
           "sendOriImgCompressionRatio": 90,
           "cropSizeMax": 400,
           "cropSizeMin": 120,
           "roi": "Polygon 0 0 0 0",
           "sendUrl": "https://abc.company.com/face"
           "faceQualityThreshold": 0.55,
           "centerMode": 0
           }]
  }
  ```
  
 
 #### 技能结果上传接口
- **请求消息**
  推理结果将以HTTPS POST请求方法推送到应用系统server的指定URL地址。
  POST {sendUrl}
  其中sendUrl在[技能运行时配置](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0011.html)中设置。
  - 请求消息头 技能以json形式返回推理结果，因此消息头Content-Type类型为"application/json"，参数说明如[表5]所示。
     表5请求消息头参数说明 
    | 名称           | 描述         | 是否必选 | 示例                |
    |:---|:---|:---|:---|
    | Content-Type | 消息体的类型（格式） | 是    | application/json。 |
       
    
  
  - 公共消息体 华为HiLens 公共消息体包含了技能的公共消息内容，如[表6]所示。
     表6公共消息体参数说明 
    | 名称       | 类型     | 说明                           |
    |:---|:---|:---|
    | msg_type | String | 技能类型，为face_detection_result。 |
    | cam_name | String | 摄像头名称。                       |
    | skill_id | String | 技能ID。                        |
       
    
  
  - 技能消息体 人脸检测的json消息体如[表7]所示：
     表7技能消息体参数说明 
    | 名称         | 类型     | 说明                                                              |
    |:---|:---|:---|
    | face_id    | String | 人脸图UUID。                                                        |
    | track_id   | Uint64 | 人脸的跟踪标记，相同的track_id表示同一个人脸。                                     |
    | ori_img_id | String | 人脸背景原始图UUID。                                                    |
    | time       | Uint64 | 图片解码时间的时间戳，单位为秒。                                                |
    | bbox       | Object | 人脸图在背景图中的位置信息。位置信息参数请参见[表8]。 |
    | clarity    | Float  | 人脸清晰度，范围\[0,1\]。                                                |
    | face_image | String | 人脸图BASE64编码结果。                                                  |
    | ori_image  | String | 原始图BASE64编码结果，如果配置不发送原始图，则无该字段。                                 |
       
     表8bbox位置信息参数说明 
    | 字段 | 类型  | 说明            |
    |:---|:---|:---|
    | x  | Int | 人脸图左上角顶点x坐标值。 |
    | y  | Int | 人脸图左上角顶点y坐标值。 |
    | h  | Int | 人脸图高。         |
    | w  | Int | 人脸图宽。         |
       
    人脸检测的json消息体示例如下：
    ```
    { 
      "msg_type": "face_detection_result",
      "cam_name": "store001_pos2",
      "skill_id": "f5c526eb6c51440c8a0ee5e3cc65f23c",
      "face_id": "0DD1BEA6-634B-11E8-8B0B-407D0FAD9218",
      "track_id": 1,
      "ori_img_id": "0DD1BF0A-634B-11E8-8B0B-407D0FAD9218",
      "time": 1527603463,
      "bbox ": {
                 "x": 32,
                 "y": 379,
                 "w": 49,
                 "h": 65
                 },
       "clarity": 0.55,
       "face_image": "4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQE...",
       "ori_image": "4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQE...",
     }
    ```
    
   
- **响应消息**
  - 响应消息头 响应消息头由服务器端(应用系统)收到请求消息后返回。
    响应消息头可包含如下两部分。
    - 一个HTTP状态代码，从2xx成功代码到4xx或5xx错误代码。或者可以返回服务定义的状态码。
    
    - 附加响应头字段，如支持请求的响应所需，如Content-type响应消息头。
    
    
    详细的公共响应消息头参数说明如[表9]所示。
     表9公共响应消息头参数说明 
    | 名称             | 描述                                       | 示例                            |
    |:---|:---|:---|
    | Date           | HTTP协议标准报头。表示消息发送的时间，时间的描述格式由rfc822定义。   | Mon, 12 Nov 2007 15:55:01 GMT |
    | Server         | HTTP协议标准报头。包含了服务器用来处理请求的软件信息。            | Apache                        |
    | Content-Length | HTTP协议标准报头。用于指明实体正文的长度，以字节方式存储的十进制数字来表示。 | xxx                           |
    | Content-Type   | HTTP协议标准报头。用于指明发送给接收者的实体正文的媒体类型。         | application/json              |
       
    
  
  - 响应消息体（可选） 响应消息体通常以结构化格式（如json或xml）返回，与响应消息头中Content-type对应，传递除响应消息头之外的内容。
    
   
 
