
# 人脸客流统计技能
#### 技能描述
智慧门店的人脸抓拍和客流统计技能。本技能使用多个深度学习算法，实时分析视频流，对进入门店的人形进行抓拍，并自动筛选出此人进店过程中尺寸、清晰度、角度最佳的人脸和对应的原图上传至您的后台系统。
结合云上人脸识别服务（Face Recognition，简称FRS）还可以进一步做VIP客户统计、回头客统计等应用。使用时需要提供您的业务RESTful接口和RTSP视频地址，当前最大支持两路网络摄像头接入。
![](https://support.huaweicloud.com/usermanual-hilens/public_sys-resources/note_3.0-zh-cn.png)
人流较密集、互相遮挡或者全程看不清顾客的脸时，可能存在抓取到的人形找不到对应人脸的情况。
摄像头部署建议请参见[摄像头部署]。
技能配置项请参见[运行时配置参数]。
技能接口设计请参见[技能结果上传接口]。
#### 基本信息
人脸客流统计技能的基本信息如[表1]所示。
 表1技能参数说明 
| 参数      | 说明                                                                                                                                                                                                                                                                                           |
|:---|:---|
| 技能名称    | 人脸客流统计                                                                                                                                                                                                                                                                                       |
| 应用场景    | 智慧门店                                                                                                                                                                                                                                                                                         |
| 支持固件版本  | HiLens Framework 1.1.2及以上，升级操作请见[升级HiLens_Device_Agent固件版本](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0015.html) 系统固件要求为2.2.200.011（TR6），升级操作请见[升级HiLens Kit系统固件版本](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0084.html) |
| 最大路数    | 最多2路                                                                                                                                                                                                                                                                                         |
| 视频流传输协议 | 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后，正确率较低。比如，走廊较长，楼道光照较暗，人距离摄像头较远时，检测出的人脸很模糊。
- 室外安装摄像头，需要注意雨雪的影响，避免在露天下布置，雨水或者雪将摄像头的镜头盖住，造成拍摄画面模糊不清。
**进店划线设置要求**
人脸客流统计技能根据划线参数（passLineThreshold，详见[表4]）判断顾客是否进店，该参数的设置与摄像头画面有较大关联，建议如下：
- 保证正常身高的人站在门槛处，能完整的看到整个人形，清晰的看到正脸（人脸条件满足上面的要求）；
- 门槛建议处于画面垂直距离80%\~90%左右，即画面中80%\~90%为店外，10%\~20%为店内。
 
 #### 运行时配置参数
技能在运行时，需要[添加运行时配置](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：表示发送 |
  | sendOriImgCompressionRatio | 否    | Int    | 原始图jpeg压缩百分比，默认值为90,表示图片压缩比90%，取值范围\[1 100\]。                                                       |
  | cropSizeMax                | 否    | Int    | 发送人脸图片长宽的最大像素，默认值400。                                                                               |
  | cropSizeMin                | 否    | Int    | 发送人脸图片长宽的最小像素，默认值80。                                                                                |
  | faceQualityThreshold       | 否    | Float  | 人脸质量总分阈值，质量分**大于**此值的人脸才会抓拍，默认值0.25。                                                                |
  | facePoseThreshold          | 否    | Float  | 人脸姿态分阈值，质量分**小于**此值的人脸才会抓拍，默认值0.45。                                                                 |
  | faceBlurThreshold          | 否    | Float  | 人脸模糊度阈值，质量分**小于**此值的人脸才会抓拍，默认值0.55。                                                                 |
  | faceMargin                 | 是    | Float  | 上报人脸时人脸框的外扩比例，默认值2.0。                                                                               |
  | passLineThreshold          | 否    | Float  | 进店统计时判断过线的Y轴坐标比值，默认为0.9。例如分辨率为1920x1080，比值0.75即1080\*0.75=810。                                      |
  | sendUrl                    | 是    | String | 发送技能消息POST请求的URL地址。                                                                                 |
     
  
- **示例**
  HiLens Kit设备支持多路摄像头接入，如果要为不同的摄像头设置不同的技能配置，或者几个摄像头共用同一技能配置，则可在配置列表中给出相应的配置信息，示例如下：
  ```
  //Store001的两个摄像头pos1和pos2配置不同参数：
  { 
    "logLevel": "INFO",
    "keep_running": 1,
    "multi_camera": 
           [{
            "camera_names": ["store001_pos1"],
            "sendOriImgFlag": 0,
            "sendOriImgCompressionRatio": 90,
            "cropSizeMax": 400,
            "cropSizeMin": 100,
            "faceQualityThreshold": 0.25,
            "facePoseThreshold": 0.45,
            "faceBlurThreshold": 0.55,
            "faceMargin": 2.0,
            "passLineThreshold": 0.9,
            "sendUrl": "https://abc.company.com/face",
           },
           {
            "camera_names": ["store001_pos2"],
            "sendOriImgFlag": 1,
            "sendOriImgCompressionRatio": 100,
            "cropSizeMax": 300,
            "cropSizeMin": 80,
            "faceQualityThreshold": 0.25,
            "facePoseThreshold": 0.45,
            "faceBlurThreshold": 0.55,
            "faceMargin": 2.0,
            "passLineThreshold": 0.9,
            "sendUrl": "https://abc.company.com/face",
            }]
  }
  //Store002的两个摄像头pos1和pos2配置相同参数：
  { 
    "logLevel": "INFO",
    "keep_running": 1,
    "multi_camera": 
           [{
            "camera_names": ["store002_pos1","store002_pos2"],
            "sendOriImgFlag": 0,
            "sendOriImgCompressionRatio": 90,
            "cropSizeMax": 400,
            "cropSizeMin": 120,
            "faceQualityThreshold": 0.25,
            "facePoseThreshold": 0.45,
            "faceBlurThreshold": 0.55,
            "faceMargin": 2.0,
            "passLineThreshold": 0.9,
            "sendUrl": "https://abc.company.com/face",
           }]
  }
  ```
  
 
 #### 技能结果上传接口
- **请求消息**
  推理结果将以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。                                                                     |
    | device_id | String | 设备ID，指代运行此技能的设备。如您的HiLens Kit的设备ID，可登录华为HiLens控制台，在"设备管理\>设备列表"页面的设备卡片查看。 |
       
    
  
  - 技能消息体 人脸客流统计技能的json消息体如[表7]所示。
     表7技能消息体参数说明 
    | 名称           | 类型     | 说明                                                             |
    |:---|:---|:---|
    | time         | Uint64 | 图片解码时间的时间戳，单位为秒。                                               |
    | track_id     | Uint64 | 人的跟踪标记，相同的t"rack_id"表示同一个人，每次初始化后"track_id"的值为从0开始依次递增。        |
    | person_id    | String | 人形UUID。                                                        |
    | person_image | String | 进店那一刻的原图BASE64编码结果。                                            |
    | ori_img_id   | String | 人脸对应的原图UUID。                                                   |
    | ori_image    | String | 进店过程中的最佳人脸对应的原图BASE64编码结果。                                     |
    | face_image   | String | 进店过程中的最佳人脸图BASE64编码结果。                                         |
    | clarity      | Float  | 人脸清晰度，范围\[0,1\]，值越大表示质量越高。                                     |
    | quality_pose | Float  | 人脸姿态分，范围\[0,1\]，值越小表示人脸姿态越正                                    |
    | quality_blur | Float  | 人脸模糊度 ，范围\[0,1\]，值越小表示人脸越清晰                                    |
    | bbox         | Object | 人脸在原图中的检测框位置信息，详细说明见[表8]。 |
       
     表8"bbox"参数说明 
    | 字段 | 类型  | 说明             |
    |:---|:---|:---|
    | x  | Int | 检测框左上角顶点的x坐标值。 |
    | y  | Int | 检测框左上角顶点的y坐标值。 |
    | w  | Int | 检测框宽度。         |
    | h  | Int | 检测框高度。         |
       
    
  
  - 示例 人脸客流统计的json消息体示例如下：
    ```
    { 
      "msg_type": "face_detection_result",
      "cam_name": "store001_pos2",
      "skill_id": "f5c526eb6c51440c8a0ee5e3cc65f23c",
      "time": 1527603463,
      "track_id": 1,
      "person_id": "0DD1BEA6-634B-11E8-8B0B-407D0FAD9218",
      "person_image": "4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQE...",
      "ori_img_id": "0DD1BF0A-634B-11E8-8B0B-407D0FAD9218",
      "ori_image": "4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQE...",
      "face_image": "4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQE...",
      "clarity": 0.35,
      "quality_pose": 0.45,
      "quality_blur": 0.55,
      "bbox ": {
                 "x": 32,
                 "y": 379,
                 "w": 49,
                 "h": 65
                 },
     }
    ```
    
   
- **响应消息**
  - 响应消息头 响应消息头由服务器端(应用系统)收到请求消息后返回。
    响应消息头可包含如下两部分。
    - 一个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对应，传递除响应消息头之外的内容。
    
   
 
