
# 多区域客流分析技能
#### 技能描述
面向智慧商超的客流统计技能。本技能使用深度学习算法，实时分析视频流，自动统计固定时间间隔的客流信息。
本技能支持：
- 根据业务需求划定区域，只统计固定区域内的客流，技能返回区域内客流的统计信息和坐标信息。
- 绘制客流统计线，对人形经过该线的人数进行统计，返回客流统计信息。
- 区域客流统计还可以根据客流坐标生成人流热力图。
使用时需要提供您的业务RESTful接口和RTSP视频地址，最大支持8路网络摄像头接入，并按照接入的路数进行收费。
摄像头部署建议请参考[摄像头部署]。
技能配置项请参见[运行时配置参数]。
技能接口设计请参见[技能结果上传接口]。
#### 基本信息
表1技能参数说明 
| 参数      | 说明                                      |
|:---|:---|
| 技能名称    | 多区域客流统计                                 |
| 技能版本    | 1.0.2                                   |
| 适用芯片    | Ascend 310                              |
| OS平台    | Linux                                   |
| 应用场景    | 商超                                      |
| 支持固件版本  | HiLens Framework 1.0.0及以上，DDK887/DDK893 |
| 最大路数    | 最多8路                                    |
| 视频流传输协议 | RTSP                                    |
| 输入方式    | 外接IPC摄像头                                |
| 输出方式    | POST                                    |
   
 #### 摄像头部署
客流统计算法根据头肩检测统计客流的大小。摄像头的架设会影响头肩检测模型的准确率。在实际架设中，尽量保证拍摄画面清晰，光照充足，人形较正，无遮挡。监控视频场景下尽量保证拍摄的画面能拍到更多的人形。
**摄像头参数基本设置**
不同品牌的摄像头都有一些基本的视频设置，例如分辨率、帧率和码率等，具体要求如下：
- 分辨率：建议1080P，不低于720P，不高于4K（3840\*2160）。
- 帧率：不高于25fps，不低于15fps，建议值20fps。
- 码率：720P建议设为4096Kbps\~6144Kbps，1080P建议设为6144Kpbs\~8192Kbps，更高分辨率可设置更高码率。
- 视频编码：如果支持H.265，设置为H.265。
- 日夜切换：关闭夜间自动切换红外模式，暂不支持抓取红外模式下的人脸。
- 宽动态：关闭宽动态。普通摄像头的宽动态无法到达专业相机的效果，人的走动速度较快时存在运动模糊，应关闭宽动态设置。
**摄像头拍摄方向**
摄像头拍摄方向要正向行人正反面，略成俯视角度，具体要求如下：
- 保证行人上半身轮廓清晰可见。
- 架设高度：4m左右。
- 监控距离：5-10m 。
- 监控宽度：2-5m 。
- 俯视角度：左右偏角小于8°；俯仰角10°-20°。
**光照要求**
光照条件要求需要满足如下要求：
- 行人区域正面光照强度100lux及以上；防止出现过暗或者噪点。
- 行人左右侧光照强度差不超过一倍；防止产生阴阳脸。
- 行人背部光照强度不超过正面强度两倍；防止产生脸部曝光不足，五官细节丢失。
如果现场的光线不满足上述要求，则需要通过强光抑制或补光来优化现场的光照条件。强光抑制可以改善"阴阳脸"、"背光"现象，即通过减弱侧面光照来改善光照条件。补光则可以通过增加额外光源的方式改善光照条件，提高人脸图像的采集效果；主要通过普通射灯、白炽灯等在不影响装修、路人视觉效果的情况下提高人脸的光照度，消除"阴阳脸"。
安装补光灯时需要注意以下几点条件：
- 避免补光不均匀。
- 考虑不同时段设置光照。
- 根据现场情况灵活变通。
- 避免直射行人眼睛 。
**周围环境要求**
- 镜头前方不要有遮挡的障碍物，避免漏检。
- 不要将摄像头架在房子遮阴的挡板下，会造成光照过暗，人形模糊。
- 室外安装摄像头，避免在露天下布置，以免雨水或者雪将摄像头的镜头盖住，造成拍摄画面模糊不清。
- 室内安装摄像头，当部署楼道时需要注意光照，楼道里灯光明暗交替变化过快，摄像头拍摄时获取的画面可能会偏暗。
 
 #### 运行时配置参数
技能在运行时，需要[添加运行时配置](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0011.html)。配置完成后，参数会从华为HiLens云侧下发到端侧设备。
技能相关配置参数说明如[表2]所示。
 表2运行时配置参数 
| 参数           | 是否必选 | 参数类型 | 说明                                                                  |
|:---|:---|:---|:---|
| multi_camera | 是    | List | 一个设备上多路视频的技能参数，详细的参数说明请参见[表3]。 |
   
 表3mul_input_parameter参数说明 
| 名称               | 是否必选 | 参数类型   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|:---|:---|
| camera_names     | 是    | List   | 摄像头名称。摄像头名称与设备的rtsp流配置的名称对应。可配置多个名称，表示多个摄像头采用同样的配置。                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| lineCountCycle   | 是    | Int    | 过线人流量统计周期，单位为秒。取值范围为(0, +∞)，默认值为10。                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| regionCountCycle | 是    | Int    | 区域人流量统计周期，单位为秒。取值范围为(0, +∞)，默认值为10                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| enableLine       | 是    | Bool   | 是否开启过线人流量统计，默认值为1。 0：表示不开启 1：表示开启                                                                                                                                                                                                                                                                                                                                                                                              |
| enableRegion     | 是    | Bool   | 是否开启区域人流量统计,支持矩形区域统计，默认值为1。 0：表示不开启 1：表示开启                                                                                                                                                                                                                                                                                                                                                                                       |
| countSetting     | 否    | String | 自定义线与区域列表。采用竖线（\|）分隔封闭或直线区域，例如："Polygon 0 0 0 1000 1000 1000 1000 0\|Line 500 0 500 1000 side1 side2"。 - 封闭区域：由Polygon开头，其后接的依次为区域的端点的坐标。其中端点坐标由x坐标与y坐标组成。  - 直线区域：位置由Line开头，其后接的四个整型分别为线两端点坐标，最后以side1与side2结尾。side1与side2标志着直线两侧，对于非水平线，左侧为side1，右侧为side2，对于水平线上侧为side1，下侧为side2，其名称可自定义。   |
| sendUrl          | 是    | String | 发送技能消息POST请求的URL地址。                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   
 #### 技能结果上传接口
- **请求消息**
  技能推理结果将以HTTPS POST请求方法推送到应用系统server的指定URL地址。
  POST {sendUrl}/
  其中sendUrl在[技能运行时配置](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0011.html)中为每个设备设置的推理结果上传地址。
  - 请求消息头 技能以json形式返回推理结果，因此消息头Content-Type类型为"application/json"。
    表4请求消息头参数说明 
    | 参数           | 是否必选 | 说明          | 示例               |
    |:---|:---|:---|:---|
    | Content-Type | 是    | 消息体的类型（格式）。 | application/json |
       
    
  
  - 公共消息体 华为HiLens 公共消息体包含了技能的公共消息内容，如[表5]所示。
     表5公共消息体参数说明 
    | 参数       | 类型     | 说明                         |
    |:---|:---|:---|
    | msg_type | Enum   | 技能类型，如"flow_count_result"。 |
    | cam_name | String | 摄像头名称。                     |
    | skill_id | String | 技能ID。                      |
       
    
  
  - 技能消息体 过线统计的json消息体如[表6]所示。
     表6过线统计消息体参数说明 
    | 参数         | 类型     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
    |:---|:---|:---|
    | event_type | Int    | 事件类型，过线统计的事件类型为0，区域统计为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    | start_time | Uint64 | 过线统计开始的时间戳。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
    | end_time   | Uint64 | 过线统计结束的时间戳。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
    | counter    | List   | 输出结果列表。每组数据对应一条自定义直线，包含： - x、y：直线两个点的x、y坐标。  - id：直线的ID。  - side1_name、side2_name：直线两侧的标识名。  - side1、side2：人流穿过直线到side1_name与side2_name侧的统计量。   |
       
    过线统计的消息体示例如下：
    ```
    { 
      "msg_type": "flow_count_result",
      "cam_name": "store001_pos2",
      "skill_id": "f5c526eb6c51440c8a0ee5e3cc65f23c",
         "event_type": 0,
         "start_time": 1535546730,
         "end_time": 1535546732,
         "counter": [{
                             "x": [480, 1440],
                             "y": [540, 540],
                             "id": 0,
                             "side1": 0,
                             "side2": 0,
                             "side1_name": "side1",
                             "side2_name": "side2"
                             },
                             {
                             "x": [490, 1500],
                             "y": [640, 340],
                             "id": 0,
                             "side1": 7,
                             "side2": 3,
                             "side1_name": "in", 
                             "side2_name": "out"
                             }]
    }
    ```
    区域统计的json消息体如[表7]所示。
     表7区域统计消息体参数说明 
    | 参数         | 类型     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                      |
    |:---|:---|:---|
    | event_type | Int    | 事件类型，过线统计的事件类型为0，区域统计为1。                                                                                                                                                                                                                                                                                                                                                                                                                |
    | time       | Uint64 | 进行区域统计的时间戳。                                                                                                                                                                                                                                                                                                                                                                                                                             |
    | occupy     | List   | 输出结果列表。每组数据对应一个自定义的封闭区域，包含： - x、y：封闭区域所有点x，y坐标。  - person_list：客流位置信息。详细的位置参数说明请参见[表8]。  - counter：当前时刻，区域的人流统计量。   |
       
     表8person_list参数说明 
    | 参数 | 类型  | 说明             |
    |:---|:---|:---|
    | x  | Int | 客流头肩区域的中心点x坐标。 |
    | y  | Int | 客流头肩区域的中心点y坐标。 |
       
    区域统计的消息体示例如下所示：
    ```
    {
         'time': 1588927220,
         'msg_type': 'flow_count_result', 
         'event_type': 1, 
         'cam_name': 'store001_pos2', 
         'skill_id': 'ff8080826dd4b10d016e20fbb8ae0405', 
         'device_id': '8366e510ed8b4f94bb9a567e9cc21d23', 
         'occupy': [{
                          'x': [0, 1920, 1920, 0], 
                          'y': [0, 0, 1080, 1080],
                          'person_list': 
                          {
                             'x': [1155], 
                             'y': [217]
                          }, 
                          'counter': 1
                          }]
    }
    ```
    
   
 
- **响应消息**
  - 响应消息头 响应消息头由服务器端(应用系统)收到请求消息后返回。
    响应消息头可包含如下两部分。
    - 一个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对应，传递除响应消息头之外的内容。
    
   
 
