# 安播辅助服务程序说明 ## 程序运行流程 1. 从`超脑WebAPI` 取出基础信息,基础信息包括 - 算法信息 - 平台信息(摄像机信息) 2. 从总控WebAPI获取到相关的`处理规则` 3. 从超脑(也是Redis)获取到监测信息,信息包括 - 是否带口罩 - 人员计数等 4. 根据`处理规则`处理获取到的监测信息 5. 将处理过的信息写入到数据库中 ## 使用到的地址 1. 超脑基础信息API地址 [apifox](https://apifox.com/apidoc/shared-1f40509b-3aca-4c2c-9d8e-381b986b085a/api-183796683) 2. Redis地址 - IP:http://172.16.36.80:30000/vos/ - 端口:32222 - 密码:Ff1z@TOFr^iwd%Ra 3. 总控数据库 - SQL Server - 数据表:EQM_BJ - IP:192.1.3.105 - 用户名:sa - 密码:Qwer1234 - 达梦数据库 - 数据表:EQM - IP:192.1.2.44 - 密码:QWERT12345 - 数据库:EQM_BJ - WebApi - 地址:http://192.1.3.133:31000/v6/ - SQL_SERVER EQM_BJ SerID:4c2f9fc91c22dd98331e47af2e2964f4 ## 从行业超脑获取基础信息 1. 使用http从行业超脑获取到`算法列表`和`设备列表` 2. 这里使用一个线程单独读取,可能需要定时更新 3. `算法列表`和`设备列表`和`tAction`对应的值,`算法列表`好像只有这三个只有用,读取到后写入到EQM数据库 |算法列表|设备列表|EQM| |:--|:--|:--| |ability|ability|ActionId| |taskTypeId|taskTypeId|ActionTaskid| |muAiName|taskTypeName|ActionName| 4. `设备列表`获取的数据写入到EQM数据库的`tActionCamer`表格中,其对对应的关键字如下 |设备列表|tActionCamer| |:--|:--| |deviceId|CamerId| |deviceName|CamerName| |deviceSerial|CamerSerial| |deviceType|CamerType| |port|CamerPort| |userAccount|CamerUsr| |userPWD|CamerPwd| 5. 安播可能会用到的算法 |编号|算法名称|能力|基础算子| |:--|:--|:--|:--| |1|人脸识别|facerecognitionstudio|facelib| |2|人员计数|mancount|atom-msrcnn| |3|违禁物品|contraband|atom-msrcnn| |4|玩手机|playPhone|atom-hodet(atom-yolo1)| |5|睡岗识别|sleep|atom-yolo(atom-itc)| |6|疲劳检测||atom-itc| |7|动物识别|animal|atom-msrcnn| |8|老鼠识别|mousedetection|atom-yolo1| |9|未戴口罩|mask|atom-yolo1| ## 从Redis获取数据 1. `Key`的组成:`%d : %s`, `DeviceID`, `算法ID` 2. `算法ID`通过获取摄像头算法列表获取到这个设备的算法编号,关键字是`ability`,存放在EQM数据库的tAction表格的ActionID 3. Redis获取到的是JSON格式的数据,写入`tAlarmInfo`表格,需要根据Redis数据去其他表格获取补充数据,组合好后写入`tAlarmInfo`表格。Redis数据格式如下: ```JSON { "actionDes": "", "actionResult": true, "alarmId": 73113, "beginTime": "2024-09-01T16:52:38.426", "channel": 1, "classifyId": 64, "classifyName": "培训教室-海康", "deviceSerial": "172.16.9.31", "endTime": "2024-09-01T16:53:38.426", "eventTime": "2024-09-01T16:53:08.426", "imageInfo": "http://webdav-read.default:80/webdav//GUI/1/PUMPING/2024/09/01//66d42b74e4b02066478c1ace.jpg", "isKeyPoint": 0, "personList": [], "picUrl": "66d42b74e4b02066478c1ace.jpg", "taskId": 452, "taskName": "夜晚001", "bBoxes": [ { "bbox": [ 1692, 369, 1791, 604 ], "colorFlag": 1, "conf": [ "0.03" ], "label": [ "未成年人" ], "match_id": "", "status": false } ] } ``` 4. 补充数据关键字和其对应的EQM库表格 |关键字|补充表格|所需的数据| |:--|:--|:--| |channel|tChannel|获取通道信息| |CamerId|tRoomCamer|获取到RoomId| |RoomId|tRoomInfo|获取到Room信息| ## EQM数据库表格说明 1. `tAction`是算法信息表,从超脑获取到的算法信息写入这个表格 2. `tWorkOnInfo`是人员在岗信息表,也包含人脸信息库 3. `tActionCamer`摄像机ID,和算法ID关联 4. `tFaceUser`用户信息表,读取到超脑返回的用户数据,写入该表 5. `tRuleInfo`报警规则表,区域人员检测(人员计数)会使用到 6. `tWorkOnInfo`人员在岗信息表,主要给客户端同步用的 7. `tPeriod` 报警时段和频道与App对应表 |标号|App| |:--|:--| |0x01|人员在岗识别| |0x02|违禁物品识别| |0x04|区域非法入侵识别| |0x08|疲劳检测识别| |0x10|区域人员统计| |0x20|老鼠识别| |0x40|玩手机识别| |0x80|未戴口罩识别| |0x0100|摔倒识别| ## 启动程序,可能需要从EQM获取的数据 1. `tCamerinfo`获取摄像机信息 2. `tAction`获取算法信息 3. `tPeriod`获取时段详细信息,这里是补充获取摄像机信息 4. `tRoomCamer`获取房间信息,这里是补充获取摄像机信息 5. `tRoomCamer`获取通道信息,这里是补充获取摄像机信息 ## 应用各算法的检测逻辑 1. 逻辑详情见[安播辅助提示系统需求文档](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81pbx3nQUAEOAlnGJxAZB1Gv?utm_scene=person_space) 2. 这里不在是一个摄像机一个线程了,而是根据任务分配线程,如违禁物品每个摄像机对应的Action都可以检测,那么每个Redis Key就是一个线程;检测人员在岗需要房间内的多个摄像机联合起来判断,那么这个房间内的整个摄像机都是对应的Action都在一个线程中。 3. 这里以任务分配线程,如人员计数报警 ## 报警算法逻辑 ### 单个算法-单个摄像机写入EQM数据库报警信息 1. 出现报警时会创建一条报警信息,直接写入到数据库,只有开始时间 2. 根据设置的规定时间继续检测(如违禁品出现10秒才算报警,防止误报警),在规定时间内报警消失,就删除这次报警信息 3. 超过了规定时间,报警消失,更新开始创建的那条信息的结束时间 #### 违禁品检测 1. 违禁品检测一个摄像机一个算法 2. 检测违禁品一般是一个算法只检测一个物品,如果有多个物品,报警只有一条,所有违禁品都消失了,才会结束报警 ### 算法需要多个摄像机配合 1. 区域人员计数是一个算法ID,人脸检测是一个算法ID,这两个结合起来,组合成了区域人员检测(人员计数、在岗离岗、非法入侵等) #### 区域人员检测(区域人员计数) 1. 区域人员计数有几种情况 - 直播间、导播间各有最小和最大人数 - 直播间+导播间有最小和最大人数 #### 区域非法入侵 1. 区域非法入侵需要两个算法配合,区域人员检测和人脸识别 2. 区域人员非法入侵有几种情况,这个算法需要 - 未知人员入侵 - 人员个数和人脸可以识别的个数不相等 3. 区域人员检测需要判断是否在检测时间段内 4. 一个频率只有一个直播间和一个导播间? #### 人员在岗识别 1. 需要人脸识别算法 2. 人员在岗主要是给客户端实时信息 3. 创建一个最新的记录在`tWorkOnInfo`表中,不断地更新这条数据的人数和人员信息 4. 如果所有人都离岗了,这条信息的人数就清零 5. 最新的在岗信息清零后,人员回来,就重新创建一条新的数据 #### 直播间-离岗在岗报警