
# 安全帽检测技能
#### 技能描述
面向智慧园区的安全帽检测技能。本技能使用深度学习算法，实时分析视频流，自动检测园区工人未戴安全帽的行为。
本技能支持根据业务需求划定区域，只检测固定区域内的未戴安全帽的行为，技能返回该区域内安全帽检测的统计信息和坐标信息。
使用时需要提供您的业务RESTful接口和RTSP视频地址，最大支持8路网络摄像头接入，并按照接入的路数进行收费。
#### 基本信息
表1技能参数说明 
| 参数      | 说明                               |
|:---|:---|
| 技能名称    | 安全帽检测                            |
| 技能版本    | 1.0.0                            |
| 适用芯片    | Ascend 310                       |
| OS平台    | Linux                            |
| 应用场景    | 智慧园区                             |
| 支持固件版本  | HiLens Framework 1.0.0及以上，DDK887 |
| 最大路数    | 最多8路                             |
| 视频流传输协议 | RTSP                             |
| 输入方式    | 外接IPC摄像头                         |
| 输出方式    | POST                             |
   
#### 摄像头部署
摄像头的架设会影响安全帽检测模型的准确率。在实际架设中，尽量保证拍摄画面清晰，光照充足，人形较正，无遮挡。监控视频场景下尽量保证拍摄的画面能拍到更多的人形。
目前安全帽检测模型的训练场景主要针对工地入口。具体为摄像头距离地面三到四米左右，在安全帽检测的区域，人形不会有太严重的遮挡。为了保证检测算法的准确率，需要确保画面图像中安全帽清晰可辨。同时，摄像头画面中场景尽量干净简单、空旷，避免场景复杂造成误检。
**摄像头参数基本设置**
不同品牌的摄像头都有一些基本的视频设置，例如分辨率、帧率和码率等。
- **分辨率：**建议1080P，不低于720P且不高于1080P。
- **帧率：**不高于25fps，不低于15fps，建议值20fps。
- **码率：**720P建议设为4096Kbps\~6144Kbps左右，1080P建议设为6144Kpbs\~8192Kbps。
- **视频编码：**如果支持H.265，设置为H.265。
- **日夜切换：**关闭夜间自动切换红外模式。
- **宽动态：**关闭宽动态。普通摄像头的宽动态无法到达专业相机的效果，人的走动速度较快时存在运动模糊，应关闭宽动态设置。
**摄像头拍摄方向**
摄像头拍摄方向要正向行人正反面，略成俯视角度。保证行人上半身轮廓清晰可见。
架设高度：4m左右
监控距离：2-10m
监控宽度：2-5m
俯视角度：左右偏角小于8°；俯仰角10°-20°
**光照要求**
光照条件要求需要满足以下几项：
- 行人区域正面光照强度100lux及以上，防止出现过暗或者噪点。
- 行人左右侧光照强度差不超过一倍，防止产生阴阳脸。
如果现场的光线不满足上述要求，则需要通过强光抑制或补光来优化现场的光照条件。强光抑制可以改善"背光"现象，即通过减弱侧面光照来改善光照条件。补光则可以通过增加额外光源的方式改善光照条件，提高图像的采集效果。
**周围环境要求**
- 镜头前方不要有遮挡的障碍物，避免漏检。
- 不要将摄像头架在房子遮阴的挡板下，会造成光照过暗，人形和安全帽模糊。
 
#### 运行时配置参数
技能在运行时，需要[添加运行时配置](https://support.huaweicloud.com/usermanual-hilens/hilens_02_0011.html)。配置完成后，参数会从华为HiLens云侧下发到端侧设备。
- **配置参数说明**
  技能相关配置参数说明如[表2]所示。
   表2运行时配置参数说明 
  | 名称                 | 是否必选 | 参数类型   | 说明                                                                  |
  |:---|:---|:---|:---|
  | heartbeat_interval | 是    | Int    | 技能心跳消息发送间隔。单位为秒，0表示不发送。技能心跳消息判断技能是否离线。                              |
  | post_url           | 是    | String | 技能消息POST请求的URL地址。心跳和技能的输出发送到指定的URL。                                 |
  | multi_camera       | 是    | Array  | 一个设备上多路视频的技能参数，其技能参数说明请见[表3]。 |
     
   表3"multi_camera"参数说明 
  | 名称                      | 是否必选 | 参数类型   | 说明                                                                                                               |
  |:---|:---|:---|:---|
  | camera_names            | 是    | Array  | 摄像头名称。摄像头名称与设备的rtsp流配置的名称对应。可配置多个名称，表示多个摄像头采用同样的配置。                                                              |
  | send_image              | 是    | Int    | 是否发送原始图,默认值为0。 0：表示不发送 1：表示发送                 |
  | image_compression_ratio | 是    | Int    | "jpeg"格式原始图压缩百分比，默认值为90,表示图片压缩比90%，取值范围\[1,100\]。                                                                |
  | use_tracking            | 是    | Int    | 是否启用跟踪去重。 0：表示不启用 1：表示启用                        |
  | draw_rectangle          | 否    | Int    | 是否对技能显示出的不戴安全帽行人画框，默认值为0，即默认不画框。 0：表示不画框 1：表示画框 |
  | roi                     | 否    | String | 检测区域配置。区域的设置由"Polygon"开头，其后依次为区域的坐标（按顺时针排列的x，y坐标）。默认值为"Polygon 0 0 0 0"，表示检测整个画面。                                |
     
  
- **示例**
  HiLens Kit设备支持多路摄像头接入，如果要为不同的摄像头设置不同的技能配置，或者几个摄像头共用同一技能配置，则可在配置列表中给出相应的配置信息，示例如下：
  ```
  //constructionsite01的两个摄像头pos1和pos2配置不同参数：
  { 
       "heartbeat_interval": 30,
       "post_url": "https://abc.company.com/webhook",
       "multi_camera": 
           [{
            "camera_names": ["constructionsite01_pos01"],
            "send_image": 1,
            "image_compression_ratio": 90,     
            "use_tracking": 1,
            "roi": "Polygon 0 0 0 0"
            },
            {
            "camera_names": ["constructionsite01_pos02"],
            "send_image": 1,
            "image_compression_ratio": 80,
            "use_tracking": 0,
            "roi": "Polygon 0 0 1920 0 1920 1080 0 1080"
            }]
  }
  //constructionsite02的两个摄像头pos1和pos2配置相同参数：
  { 
       "heartbeat_interval": 60,
       "post_url": "https://abc.company.com/standard",
       "multi_camera": 
           [{
            "camera_names": ["constructionsite02_pos01"," constructionsite02_pos02"],
            "send_image": 1,
            "image_compression_ratio": 90,
            "use_tracking": 1,
            "roi": "Polygon 0 0 0 0"
            }]
  }
  ```
  
 
#### 技能结果上传接口
- **请求消息**
  推理结果将以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   | 消息类型，包括"no_helmet_alert"和"heatbeat"两种。 |
    | skill_id | String | 技能ID。                                  |
       
    
  
  - 技能心跳消息体 技能心跳的json消息体包含一个时间戳信息：
    表6技能心跳消息体参数说明 
    | 名称   | 类型     | 说明     |
    |:---|:---|:---|
    | time | Uint64 | 心跳时间戳。 |
       
    
  
  - 公共消息体示例
    ```
    { 
      "msg_type": "heartbeat",
      "skill_id": "f5c526eb6c51440c8a0ee5e3cc65f23c",
      "time": 1527603463
    }
    ```
    
  
  - 技能消息体 安全帽检测的json消息体如[表7]所示：
     表7技能消息体参数说明 
    | 名称           | 类型     | 说明                                                                 |
    |:---|:---|:---|
    | camera_name  | String | 摄像头名称。                                                             |
    | image_id     | String | 摄像头原始图UUID。                                                        |
    | time         | Uint64 | 检测到未戴安全帽人头时的时间戳。                                                   |
    | bounding_box | Array  | 未戴安全帽人头在背景图中的位置信息，其参数说明如[表8]所示。 |
    | image        | String | 原始图BASE64编码结果，如果配置不发送原始图，则为空字符串。                                   |
       
     表8"bounding_box"参数说明 
    | 字段 | 类型  | 说明            |
    |:---|:---|:---|
    | x  | Int | 人头图左上角顶点x坐标值。 |
    | y  | Int | 人头图左上角顶点y坐标值。 |
    | h  | Int | 人头图高。         |
    | w  | Int | 人头图宽。         |
       
    安全帽检测的消息体示例：
    ```
    { 
      "msg_type": "no_helmet_alert",
      "camera_name": "constructsite01_pos02",
      "skill_id": "f5c526eb6c51440c8a0ee5e3cc65f23c",
      "image_id": "0DD1BF0A-634B-11E8-8B0B-407D0FAD9218",
      "time": 1527603463,
      "bounding_box ": [{
                             "x": 32,
                             "y": 379,
                             "w": 49,
                             "h": 65
                             },
                             {
                             "x": 54,
                             "y": 632,
                             "w": 36,
                             "h": 95
                             }
                          ],
      "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"对应，传递除响应消息头之外的内容。
    
   
 
